comparison extensions/radius_gw/rgw_work.c @ 418:8155408c6dc5

Added early handling of Diameter answers
author Sebastien Decugis <sdecugis@nict.go.jp>
date Tue, 16 Jun 2009 15:38:18 +0900
parents 4d56917a5e42
children fc0d723c1f8b
comparison
equal deleted inserted replaced
417:4d56917a5e42 418:8155408c6dc5
63 63
64 /* Callback when a Diameter answer is received */ 64 /* Callback when a Diameter answer is received */
65 static void work_receive_diam_answer(void * paback, msg_t **ans) 65 static void work_receive_diam_answer(void * paback, msg_t **ans)
66 { 66 {
67 struct pending_answer * pa = (struct pending_answer *)paback; 67 struct pending_answer * pa = (struct pending_answer *)paback;
68 68 struct radius_msg * rad_ans;
69
69 TRACE_ENTRY("%p %p", pa, ans); 70 TRACE_ENTRY("%p %p", pa, ans);
70 CHECK_PARAMS_DO( pa && ans, return ); 71 CHECK_PARAMS_DO( pa && ans, return );
71 72
72 TRACE_DEBUG(INFO, "Handling Diameter answer: Not implemented yet..."); 73 TRACE_DEBUG(INFO, "Handling Diameter answer: Not implemented yet...");
73 74
74 /* Create an empty RADIUS answer message */ 75 /* Create an empty RADIUS answer message */
75 76 CHECK_MALLOC_DO( rad_ans = radius_msg_new(RADIUS_CODE_ACCESS_REJECT, pa->rad->radius.hdr->identifier), goto out );
76 77
77 /* Pass the Diameter answer to the same extensions as the request */ 78 /* Pass the Diameter answer to the same extensions as the request */
78 79 CHECK_FCT_DO( rgw_extensions_loop_ans(pa->rad, pa->sess, ans, &rad_ans, pa->cli), goto out );
79 80
80 /* Now try and send the RADIUS answer */ 81 /* Now try and send the RADIUS answer */
81 82 if (rad_ans) {
83 CHECK_FCT_DO( rgw_client_finish_send(&rad_ans, pa->rad, pa->cli), goto out);
84 }
82 85
83 out: 86 out:
84 /* Destroy remaining session data (stateless gateway) */ 87 /* Destroy remaining session data (stateless gateway) */
85 CHECK_FCT_DO( sess_destroy(&pa->sess), ); 88 CHECK_FCT_DO( sess_destroy(&pa->sess), );
86 89
87 /* Clear the Diameter message */ 90 /* Clear the Diameter message */
88 CHECK_FCT_DO( msg_free(*ans, 1), ); 91 if (*ans) {
89 *ans = NULL; 92 CHECK_FCT_DO( msg_free(*ans, 1), );
93 *ans = NULL;
94 }
95
96 /* Release reference on the client */
97 rgw_clients_dispose(&pa->cli);
90 98
91 /* Clear the answer data */ 99 /* Clear the answer data */
92 free(pa); 100 free(pa);
93 101
94 /* Finished */ 102 /* Finished */
"Welcome to our mercurial repository"