Skip to content

Commit e77cd55

Browse files
Merge pull request #46 from LarryLaffer-dev/diameter_response_codes
Diameter response codes
2 parents 587d58d + 17b6ea5 commit e77cd55

5 files changed

Lines changed: 34 additions & 44 deletions

File tree

modules/aaa_diameter/aaa_diameter.c

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -357,26 +357,21 @@ static int dm_send_request(struct sip_msg *msg, int *app_id, int *cmd_code,
357357
if (_dm_send_message(NULL, dmsg, &rpl) != 0)
358358
goto ret;
359359

360-
{
361-
diameter_reply dm_rpl;
362-
memset(&dm_rpl, 0, sizeof dm_rpl);
363-
rc = _dm_get_message_response(rpl,
364-
(rpl_avps_pv ? &rpl_avps : NULL), &dm_rpl);
365-
366-
dm_last_result_code = dm_rpl.rc;
367-
dm_last_experimental_rc = dm_rpl.experimental_rc;
368-
369-
if (rpl_avps_pv) {
370-
pv_value_t val = {(str){rpl_avps, strlen(rpl_avps)}, 0, PV_VAL_STR};
371-
if (pv_set_value(msg, rpl_avps_pv, 0, &val) != 0)
372-
LM_ERR("failed to set output rpl_avps pv to: %s\n", rpl_avps);
373-
_dm_release_message_response(rpl, rpl_avps);
374-
}
360+
rc = _dm_get_message_response(rpl, (rpl_avps_pv ? &rpl_avps : NULL));
375361

376-
if (rc != 0) {
377-
LM_ERR("Diameter request failed (rc: %d)\n", rc);
378-
return -3;
379-
}
362+
dm_last_result_code = rpl->rpl.rc;
363+
dm_last_experimental_rc = rpl->experimental_rc;
364+
365+
if (rpl_avps_pv) {
366+
pv_value_t val = {(str){rpl_avps, strlen(rpl_avps)}, 0, PV_VAL_STR};
367+
if (pv_set_value(msg, rpl_avps_pv, 0, &val) != 0)
368+
LM_ERR("failed to set output rpl_avps pv to: %s\n", rpl_avps);
369+
_dm_release_message_response(rpl, rpl_avps);
370+
}
371+
372+
if (rc != 0) {
373+
LM_ERR("Diameter request failed (rc: %d)\n", rc);
374+
return -3;
380375
}
381376

382377
return 1;
@@ -541,15 +536,12 @@ static int dm_send_request_async_reply(int fd,
541536
LM_ERR("could not resume async route!\n");
542537
goto error;
543538
}
544-
{
545-
diameter_reply dm_rpl;
546-
memset(&dm_rpl, 0, sizeof dm_rpl);
547-
ret = _dm_get_message_response(amsg->cond,
548-
(amsg->ret ? &rpl_avps : NULL), &dm_rpl);
549539

550-
dm_last_result_code = dm_rpl.rc;
551-
dm_last_experimental_rc = dm_rpl.experimental_rc;
552-
}
540+
ret = _dm_get_message_response(amsg->cond,
541+
(amsg->ret ? &rpl_avps : NULL));
542+
543+
dm_last_result_code = amsg->cond->rpl.rc;
544+
dm_last_experimental_rc = amsg->cond->experimental_rc;
553545

554546
if (ret == 0)
555547
ret = 1;

modules/aaa_diameter/diameter_api.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,7 @@
3434
typedef struct {
3535
cJSON *json;
3636
int is_error;
37-
int rc; /* Result-Code AVP (268) */
38-
int experimental_rc; /* Experimental-Result-Code AVP (298) */
39-
int vendor_id; /* Vendor-Id from Experimental-Result (266) */
37+
int rc;
4038
} diameter_reply;
4139

4240
/*

modules/aaa_diameter/dm_impl.c

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -720,15 +720,17 @@ static int dm_receive_msg(struct msg **_msg, struct avp * avp, struct session *
720720
if (rc == 0 && a) {
721721
struct avp *child = NULL;
722722
fd_msg_browse(a, MSG_BRW_FIRST_CHILD, &child, NULL);
723+
723724
while (child) {
724725
rc = fd_msg_avp_hdr(child, &h);
725726
if (rc == 0) {
726-
if (h->avp_code == 298) {
727-
rpl_cond->rpl.experimental_rc = h->avp_value->u32;
728-
LM_DBG("Experimental-Result-Code: %u\n", h->avp_value->u32);
727+
if (h->avp_code == 298 && h->avp_value) {
728+
rpl_cond->experimental_rc = h->avp_value->u32;
729+
LM_DBG("Experimental-Result-Code: %u\n", h->avp_value->u32);
730+
if (h->avp_value->u32 < 2000 || h->avp_value->u32 >= 3000)
729731
rpl_cond->rpl.is_error = 1;
730-
} else if (h->avp_code == 266) {
731-
rpl_cond->rpl.vendor_id = h->avp_value->u32;
732+
} else if (h->avp_code == 266 && h->avp_value) {
733+
rpl_cond->vendor_id = h->avp_value->u32;
732734
LM_DBG("Experimental-Result Vendor-Id: %u\n", h->avp_value->u32);
733735
}
734736
}
@@ -2031,8 +2033,7 @@ static int _dm_get_message_reply(struct dm_cond *cond, diameter_reply *rpl)
20312033
return (cond->rpl.is_error?-1:0);
20322034
}
20332035

2034-
int _dm_get_message_response(struct dm_cond *cond, char **rpl_avps,
2035-
diameter_reply *rpl_out)
2036+
int _dm_get_message_response(struct dm_cond *cond, char **rpl_avps)
20362037
{
20372038
cJSON *obj;
20382039
diameter_reply rpl;
@@ -2043,10 +2044,6 @@ int _dm_get_message_response(struct dm_cond *cond, char **rpl_avps,
20432044
*rpl_avps = cJSON_PrintUnformatted(obj);
20442045
LM_DBG("AVPs: %s\n", *rpl_avps);
20452046
}
2046-
2047-
if (rpl_out)
2048-
*rpl_out = rpl;
2049-
20502047
return rc;
20512048
}
20522049

modules/aaa_diameter/dm_impl.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ struct dm_cond {
141141
} sync;
142142

143143
diameter_reply rpl;
144+
145+
int experimental_rc; /* Experimental-Result-Code AVP (298) */
146+
int vendor_id; /* Vendor-Id from Experimental-Result (266) */
144147
};
145148
int init_mutex_cond(pthread_mutex_t *mutex, pthread_cond_t *cond);
146149

@@ -173,8 +176,7 @@ int dm_build_avps(struct list_head *subavps, cJSON *array);
173176
int dm_send_message(aaa_conn *_, aaa_message *req, aaa_message **__);
174177
int _dm_send_message(aaa_conn *_, aaa_message *req, struct dm_cond **reply_cond);
175178
int _dm_send_message_async(aaa_conn *_, aaa_message *req, int *fd);
176-
int _dm_get_message_response(struct dm_cond *cond, char **rpl_avps,
177-
diameter_reply *rpl_out);
179+
int _dm_get_message_response(struct dm_cond *cond, char **rpl_avps);
178180
void _dm_release_message_response(struct dm_cond *cond, char *rpl_avps);
179181
int dm_destroy_message(aaa_conn *con, aaa_message *msg);
180182
void _dm_destroy_message(aaa_message *msg);

modules/tm/async.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ int t_resume_async_request(int fd, void*param, int was_timeout)
131131
backup_list = set_avp_list( &t->user_avps );
132132
/* set default send address to the saved value */
133133
backup_si = bind_address;
134-
bind_address = TM_BRANCH( t, 0).request.dst.send_sock;
134+
if (t->uac[0])
135+
bind_address = TM_BRANCH( t, 0).request.dst.send_sock;
135136

136137
async_status = ASYNC_DONE; /* assume default status as done */
137138
/* call the resume function in order to read and handle data */

0 commit comments

Comments
 (0)