Mercurial > hg > waaad
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 */ |