Changeset 90:2c9444152e4b in freeDiameter
- Timestamp:
- Dec 7, 2009, 6:32:30 PM (14 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
freeDiameter/dispatch.c
r89 r90 67 67 68 68 69 /* Note: if the message is for local delivery, we should test for duplicate 70 (draft-asveren-dime-dupcons-00). This may conflict with path validation decisions, no clear answer yet */ 71 72 69 /* The dispatching thread(s) */ 70 71 enum thread_state { INITIAL = 0, RUNNING = 1, TERMINATED = 2 }; 72 static void cleanup_state(void * state_loc) 73 { 74 if (state_loc) 75 *(enum thread_state *)state_loc = TERMINATED; 76 } 77 78 static pthread_mutex_t order_lock = PTHREAD_MUTEX_INITIALIZER; 79 static enum { RUN = 0, STOP = 1 } order_val; 80 81 static void * dispatch_thread(void * arg) 82 { 83 TRACE_ENTRY("%p", arg); 84 85 /* Set the thread name */ 86 { 87 char buf[48]; 88 snprintf(buf, sizeof(buf), "Dispatch %p", arg); 89 fd_log_threadname ( buf ); 90 } 91 92 pthread_cleanup_push( cleanup_state, arg ); 93 94 /* Mark the thread running */ 95 *(enum thread_state *)arg = RUNNING; 96 97 do { 98 struct msg * msg; 99 struct msg_hdr * hdr; 100 int is_req = 0; 101 struct session * sess; 102 enum disp_action action; 103 const char * ec = NULL; 104 const char * em = NULL; 105 106 /* Test the environment */ 107 { 108 int must_stop; 109 CHECK_POSIX_DO( pthread_mutex_lock(&order_lock), goto end ); /* we lock to flush the caches */ 110 must_stop = (order_val == STOP); 111 CHECK_POSIX_DO( pthread_mutex_unlock(&order_lock), goto end ); 112 if (must_stop) 113 goto end; 114 115 pthread_testcancel(); 116 } 117 118 /* Ok, we are allowed to run */ 119 120 /* Get the next message from the queue */ 121 CHECK_FCT_DO( fd_fifo_get ( fd_g_local, &msg ), goto fatal_error ); 122 123 if (TRACE_BOOL(FULL)) { 124 TRACE_DEBUG(FULL, "Picked next message:"); 125 fd_msg_dump_one(FULL, msg); 126 } 127 128 /* Read the message header */ 129 CHECK_FCT_DO( fd_msg_hdr(msg, &hdr), goto fatal_error ); 130 is_req = hdr->msg_flags & CMD_FLAG_REQUEST; 131 132 /* Note: if the message is for local delivery, we should test for duplicate 133 (draft-asveren-dime-dupcons-00). This may conflict with path validation decisions, no clear answer yet */ 134 135 /* At this point, we probably need to understand the message content, so parse the message */ 136 CHECK_FCT_DO( fd_msg_parse_dict ( msg, fd_g_config->cnf_dict ), /* Ignore error */); 137 138 /* First, if the original request was registered with a callback and we receive the answer, call it. */ 139 if ( ! is_req ) { 140 struct msg * qry; 141 void (*anscb)(void *, struct msg **) = NULL; 142 void * data = NULL; 143 144 /* Retrieve the corresponding query */ 145 CHECK_FCT_DO( fd_msg_answ_getq( msg, &qry ), goto fatal_error ); 146 147 /* Retrieve any registered handler */ 148 CHECK_FCT_DO( fd_msg_anscb_get( qry, &anscb, &data ), goto fatal_error ); 149 150 /* If a callback was registered, pass the message to it */ 151 if (anscb != NULL) { 152 153 TRACE_DEBUG(FULL, "Calling callback registered when query was sent (%p, %p)", anscb, data); 154 (*anscb)(data, &msg); 155 156 if (msg == NULL) { 157 /* Ok, the message is now handled, we can skip to the next one */ 158 continue; 159 } 160 } 161 } 162 163 /* Retrieve the session of the message */ 164 CHECK_FCT_DO( fd_msg_sess_get(fd_g_config->cnf_dict, msg, &sess, NULL), goto fatal_error ); 165 166 /* Now, call any callback registered for the message */ 167 CHECK_FCT_DO( fd_msg_dispatch ( &msg, sess, &action, &ec), goto fatal_error ); 168 169 /* Now, act depending on msg and action and ec */ 170 if (!msg) 171 continue; 172 173 switch ( action ) { 174 case DISP_ACT_CONT: 175 /* No callback has handled the message, let's reply with a generic error */ 176 em = "The message was not handled by any extension callback"; 177 ec = "DIAMETER_COMMAND_UNSUPPORTED"; 178 179 case DISP_ACT_ERROR: 180 /* We have a problem with delivering the message */ 181 if (ec == NULL) { 182 ec = "DIAMETER_UNABLE_TO_COMPLY"; 183 } 184 185 if (!is_req) { 186 TRACE_DEBUG(INFO, "Received an answer to a localy issued query, but no handler processed this answer!"); 187 fd_msg_dump_walk(INFO, msg); 188 fd_msg_free(msg); 189 msg = NULL; 190 break; 191 } 192 193 /* Create an answer with the error code and message */ 194 CHECK_FCT_DO( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, &msg, MSGFL_ANSW_ERROR ), goto fatal_error ); 195 CHECK_FCT_DO( fd_msg_rescode_set(msg, (char *)ec, (char *)em, NULL, 1 ), goto fatal_error ); 196 197 case DISP_ACT_SEND: 198 /* Now, send the message */ 199 CHECK_FCT_DO( fd_fifo_post(fd_g_outgoing, &msg), goto fatal_error ); 200 } 201 202 /* We're done with this message */ 203 204 } while (1); 205 206 fatal_error: 207 TRACE_DEBUG(INFO, "An error occurred in dispatch module! Thread is terminating..."); 208 CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), ); 209 210 end: 211 /* Mark the thread as terminated */ 212 pthread_cleanup_pop(1); 213 return NULL; 214 } 215 216 /* Later (same as routing): TODO("Set threshold on local queue"); */ 217 static pthread_t my_dispatch = (pthread_t)NULL; 218 static enum thread_state my_state = INITIAL; 219 220 /* Initialize the Dispatch module */ 221 int fd_disp_init(void) 222 { 223 order_val = RUN; 224 225 CHECK_POSIX( pthread_create( &my_dispatch, NULL, dispatch_thread, &my_state ) ); 226 227 return 0; 228 } 229 230 int fd_disp_cleanstop(void) 231 { 232 CHECK_POSIX( pthread_mutex_lock(&order_lock) ); 233 order_val = STOP; 234 CHECK_POSIX( pthread_mutex_unlock(&order_lock) ); 235 236 return 0; 237 } 238 239 int fd_disp_fini(void) 240 { 241 /* Wait for a few milliseconds for the thread to complete, by monitoring my_state */ 242 243 /* Then if needed, cancel the thread */ 244 245 /* Remove all remaining handlers */ 246 fd_disp_unregister_all(); 247 248 return ENOTSUP; 249 } 250 -
freeDiameter/main.c
r82 r90 100 100 CHECK_FCT( fd_msg_init() ); 101 101 CHECK_FCT( fd_p_expi_init() ); 102 CHECK_FCT( fd_disp_init() ); 102 103 CHECK_FCT( fd_rt_init() ); 103 104 … … 162 163 /* cleanups */ 163 164 CHECK_FCT_DO( fd_servers_stop(), /* Stop accepting new connections */ ); 164 TODO("Stop dispatch thread(s) properly (no cancel yet)");165 CHECK_FCT_DO( fd_disp_cleanstop(), /* Stop dispatch thread(s) properly (no cancel yet) */ ); 165 166 CHECK_FCT_DO( fd_peer_fini(), /* Stop all connections */ ); 166 TODO("Stop dispatch & routing threads"); 167 CHECK_FCT_DO( fd_rt_fini(), /* Stop routing threads */ ); 168 CHECK_FCT_DO( fd_disp_fini(), /* Stop dispatch thread */ ); 169 167 170 CHECK_FCT_DO( fd_ext_fini(), /* Cleaup all extensions */ ); 168 171 TODO("Cleanup queues (dump all remaining messages ?)"); -
freeDiameter/routing.c
r89 r90 863 863 CHECK_FCT_DO( fd_thr_term(&rt_in ), /* continue */); 864 864 CHECK_FCT_DO( fd_thr_term(&rt_out), /* continue */); 865 return 0; 866 } 867 868 869 865 866 /* Cleanup all remaining handlers */ 867 while (!FD_IS_LIST_EMPTY(&rt_fwd_list)) { 868 CHECK_FCT_DO( fd_rt_fwd_unregister ( (void *)rt_fwd_list.next, NULL ), /* continue */ ); 869 } 870 while (!FD_IS_LIST_EMPTY(&rt_out_list)) { 871 CHECK_FCT_DO( fd_rt_out_unregister ( (void *)rt_out_list.next, NULL ), /* continue */ ); 872 } 873 return 0; 874 } 875 876 877 -
freeDiameter/tests/testdisp.c
r10 r90 106 106 struct disp_hdl * hdl[NB_CB]; 107 107 struct disp_when when; 108 const char * ec; 108 109 109 110 /* First, initialize the daemon modules */ … … 150 151 msg = new_msg( 0, cmd1, avp1, NULL, 0 ); 151 152 memset(cbcalled, 0, sizeof(cbcalled)); 152 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );153 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 153 154 CHECK( 1, cbcalled[0] ); 154 155 CHECK( DISP_ACT_CONT, action ); … … 174 175 memset(cbcalled, 0, sizeof(cbcalled)); 175 176 msg = new_msg( 0, cmd1, avp1, NULL, 0 ); 176 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );177 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 177 178 CHECK( 1, cbcalled[0] ); 178 179 CHECK( 0, cbcalled[1] ); … … 185 186 memset(cbcalled, 0, sizeof(cbcalled)); 186 187 msg = new_msg( 1, cmd1, avp1, NULL, 0 ); 187 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );188 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 188 189 CHECK( 1, cbcalled[0] ); 189 190 CHECK( 1, cbcalled[1] ); … … 196 197 memset(cbcalled, 0, sizeof(cbcalled)); 197 198 msg = new_msg( 2, cmd1, avp1, NULL, 0 ); 198 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );199 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 199 200 CHECK( 1, cbcalled[0] ); 200 201 CHECK( 0, cbcalled[1] ); … … 230 231 memset(cbcalled, 0, sizeof(cbcalled)); 231 232 msg = new_msg( 0, cmd1, avp1, NULL, 0 ); 232 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );233 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 233 234 CHECK( 1, cbcalled[0] ); 234 235 CHECK( 1, cbcalled[1] ); … … 240 241 memset(cbcalled, 0, sizeof(cbcalled)); 241 242 msg = new_msg( 2, cmd1, avp1, NULL, 0 ); 242 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );243 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 243 244 CHECK( 1, cbcalled[0] ); 244 245 CHECK( 1, cbcalled[1] ); … … 250 251 memset(cbcalled, 0, sizeof(cbcalled)); 251 252 msg = new_msg( 2, cmd2, avp1, NULL, 0 ); 252 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );253 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 253 254 CHECK( 1, cbcalled[0] ); 254 255 CHECK( 0, cbcalled[1] ); … … 260 261 memset(cbcalled, 0, sizeof(cbcalled)); 261 262 msg = new_msg( 1, cmd2, NULL, avp2, 0 ); 262 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );263 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 263 264 CHECK( 1, cbcalled[0] ); 264 265 CHECK( 0, cbcalled[1] ); … … 310 311 memset(cbcalled, 0, sizeof(cbcalled)); 311 312 msg = new_msg( 0, cmd1, NULL, NULL, 0 ); 312 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );313 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 313 314 CHECK( 1, cbcalled[0] ); 314 315 CHECK( 0, cbcalled[1] ); … … 322 323 memset(cbcalled, 0, sizeof(cbcalled)); 323 324 msg = new_msg( 0, cmd1, avp1, NULL, 0 ); 324 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );325 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 325 326 CHECK( 1, cbcalled[0] ); 326 327 CHECK( 1, cbcalled[1] ); … … 334 335 memset(cbcalled, 0, sizeof(cbcalled)); 335 336 msg = new_msg( 1, cmd2, avp1, NULL, 0 ); 336 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );337 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 337 338 CHECK( 1, cbcalled[0] ); 338 339 CHECK( 1, cbcalled[1] ); … … 346 347 memset(cbcalled, 0, sizeof(cbcalled)); 347 348 msg = new_msg( 1, cmd1, avp1, NULL, 0 ); 348 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );349 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 349 350 CHECK( 1, cbcalled[0] ); 350 351 CHECK( 1, cbcalled[1] ); … … 358 359 memset(cbcalled, 0, sizeof(cbcalled)); 359 360 msg = new_msg( 1, cmd1, avp1, avp2, 0 ); 360 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );361 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 361 362 CHECK( 1, cbcalled[0] ); 362 363 CHECK( 1, cbcalled[1] ); … … 371 372 memset(cbcalled, 0, sizeof(cbcalled)); 372 373 msg = new_msg( 1, cmd1, NULL, avp2, 1 ); 373 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );374 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 374 375 CHECK( 1, cbcalled[0] ); 375 376 CHECK( 0, cbcalled[1] ); … … 384 385 memset(cbcalled, 0, sizeof(cbcalled)); 385 386 msg = new_msg( 1, cmd1, NULL, avp2, 2 ); 386 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );387 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 387 388 CHECK( 1, cbcalled[0] ); 388 389 CHECK( 0, cbcalled[1] ); … … 431 432 memset(cbcalled, 0, sizeof(cbcalled)); 432 433 msg = new_msg( 0, cmd1, avp1, NULL, 0 ); 433 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );434 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 434 435 CHECK( 1, cbcalled[0] ); 435 436 CHECK( 0, cbcalled[1] ); … … 441 442 memset(cbcalled, 0, sizeof(cbcalled)); 442 443 msg = new_msg( 1, cmd2, avp1, avp2, 0 ); 443 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );444 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 444 445 CHECK( 1, cbcalled[0] ); 445 446 CHECK( 0, cbcalled[1] ); … … 451 452 memset(cbcalled, 0, sizeof(cbcalled)); 452 453 msg = new_msg( 1, cmd2, avp1, avp2, 1 ); 453 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );454 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 454 455 CHECK( 1, cbcalled[0] ); 455 456 CHECK( 1, cbcalled[1] ); … … 461 462 memset(cbcalled, 0, sizeof(cbcalled)); 462 463 msg = new_msg( 1, cmd2, avp1, avp2, 2 ); 463 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );464 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 464 465 CHECK( 1, cbcalled[0] ); 465 466 CHECK( 0, cbcalled[1] ); … … 471 472 memset(cbcalled, 0, sizeof(cbcalled)); 472 473 msg = new_msg( 1, cmd1, avp1, avp2, 1 ); 473 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );474 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 474 475 CHECK( 1, cbcalled[0] ); 475 476 CHECK( 1, cbcalled[1] ); … … 489 490 CHECK( 0, fd_msg_avp_add ( msg, MSG_BRW_LAST_CHILD, avp ) ); 490 491 } 491 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );492 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 492 493 CHECK( 1, cbcalled[0] ); 493 494 CHECK( 1, cbcalled[1] ); … … 513 514 memset(cbcalled, 0, sizeof(cbcalled)); 514 515 msg = new_msg( 1, cmd1, avp1, avp2, 1 ); 515 CHECK( 12345, fd_msg_dispatch ( &msg, sess, &action ) );516 CHECK( 12345, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 516 517 CHECK( 1, cbcalled[0] ); 517 518 CHECK( 1, cbcalled[1] ); … … 535 536 memset(cbcalled, 0, sizeof(cbcalled)); 536 537 msg = new_msg( 1, cmd1, avp1, avp2, 1 ); 537 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );538 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 538 539 CHECK( 1, cbcalled[0] ); 539 540 CHECK( 1, cbcalled[1] ); … … 557 558 memset(cbcalled, 0, sizeof(cbcalled)); 558 559 msg = new_msg( 1, cmd1, avp1, avp2, 1 ); 559 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );560 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 560 561 CHECK( 1, cbcalled[0] ); 561 562 CHECK( 1, cbcalled[1] ); … … 588 589 memset(cbcalled, 0, sizeof(cbcalled)); 589 590 msg = new_msg( 2, cmd2, avp1, avp2, 2 ); 590 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );591 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 591 592 CHECK( 1, cbcalled[0] ); 592 593 CHECK( 1, cbcalled[1] ); … … 600 601 memset(cbcalled, 0, sizeof(cbcalled)); 601 602 msg = new_msg( 2, cmd2, avp1, avp2, 2 ); 602 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );603 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 603 604 CHECK( 1, cbcalled[0] ); 604 605 CHECK( 0, cbcalled[1] ); … … 613 614 memset(cbcalled, 0, sizeof(cbcalled)); 614 615 msg = new_msg( 2, cmd2, avp1, avp2, 2 ); 615 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );616 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 616 617 CHECK( 1, cbcalled[0] ); 617 618 CHECK( 1, cbcalled[1] ); … … 626 627 memset(cbcalled, 0, sizeof(cbcalled)); 627 628 msg = new_msg( 2, cmd2, avp1, avp2, 2 ); 628 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );629 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 629 630 CHECK( 1, cbcalled[0] ); 630 631 CHECK( 1, cbcalled[1] ); … … 639 640 memset(cbcalled, 0, sizeof(cbcalled)); 640 641 msg = new_msg( 2, cmd2, avp1, avp2, 2 ); 641 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );642 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 642 643 CHECK( 1, cbcalled[0] ); 643 644 CHECK( 1, cbcalled[1] ); … … 652 653 memset(cbcalled, 0, sizeof(cbcalled)); 653 654 msg = new_msg( 2, cmd2, avp1, avp2, 2 ); 654 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action ) );655 CHECK( 0, fd_msg_dispatch ( &msg, sess, &action, &ec ) ); 655 656 CHECK( 1, cbcalled[0] ); 656 657 CHECK( 1, cbcalled[1] ); -
include/freeDiameter/libfreeDiameter.h
r88 r90 2353 2353 enum disp_action { 2354 2354 DISP_ACT_CONT, /* The next handler should be called, unless *msg == NULL. */ 2355 DISP_ACT_SEND /* The updated message must be sent. No further callback is called. */ 2355 DISP_ACT_SEND, /* The updated message must be sent. No further callback is called. */ 2356 DISP_ACT_ERROR /* An error must be created and sent as a reply -- not valid for callbacks, only for fd_msg_dispatch. */ 2356 2357 }; 2357 2358 /* The callbacks that are registered have the following prototype: … … 2424 2425 int fd_disp_unregister ( struct disp_hdl ** handle ); 2425 2426 2427 /* Destroy all handlers */ 2428 void fd_disp_unregister_all ( void ); 2429 2426 2430 /* 2427 2431 * FUNCTION: fd_msg_dispatch … … 2443 2447 * (other errors) 2444 2448 */ 2445 int fd_msg_dispatch ( struct msg ** msg, struct session * session, enum disp_action *action );2449 int fd_msg_dispatch ( struct msg ** msg, struct session * session, enum disp_action *action, const char ** error_code ); 2446 2450 2447 2451 -
libfreeDiameter/dispatch.c
r14 r90 200 200 } 201 201 202 /* Delete all handlers */ 203 void fd_disp_unregister_all ( void ) 204 { 205 TRACE_ENTRY(""); 206 while (!FD_IS_LIST_EMPTY(&all_handlers)) { 207 CHECK_FCT_DO( fd_disp_unregister(all_handlers.next->o), /* continue */ ); 208 } 209 return; 210 } -
libfreeDiameter/messages.c
r85 r90 2233 2233 2234 2234 /* Call all dispatch callbacks for a given message */ 2235 int fd_msg_dispatch ( struct msg ** msg, struct session * session, enum disp_action *action )2235 int fd_msg_dispatch ( struct msg ** msg, struct session * session, enum disp_action *action, const char ** error_code) 2236 2236 { 2237 2237 struct dictionary * dict; … … 2242 2242 int ret = 0; 2243 2243 2244 TRACE_ENTRY("%p %p %p ", msg, session, action);2244 TRACE_ENTRY("%p %p %p %p", msg, session, action, error_code); 2245 2245 CHECK_PARAMS( msg && CHECK_MSG(*msg) && action); 2246 2247 if (error_code) 2248 *error_code = NULL; 2246 2249 2247 2250 /* Take the dispatch lock */ … … 2262 2265 2263 2266 if (app == NULL) { 2264 /* In that case, maybe we should answer a DIAMETER_APPLICATION_UNSUPPORTED error ? Do we do this here ? */ 2265 TODO("Reply DIAMETER_APPLICATION_UNSUPPORTED if it's a request ?"); 2267 if ((*msg)->msg_public.msg_flags & CMD_FLAG_REQUEST) { 2268 if (error_code) 2269 *error_code = "DIAMETER_APPLICATION_UNSUPPORTED"; 2270 *action = DISP_ACT_ERROR; 2271 } else { 2272 TRACE_DEBUG(INFO, "Received an answer to a local query with an unsupported application %d, discarding...", (*msg)->msg_public.msg_appl); 2273 fd_msg_dump_walk(INFO, *msg); 2274 fd_msg_free(*msg); 2275 *msg = NULL; 2276 } 2277 goto no_error; 2266 2278 } 2267 2279
Note: See TracChangeset
for help on using the changeset viewer.