remove Specific-Action/Abort-Cause in Gx message
This commit is contained in:
parent
853913b31d
commit
2884430c57
|
@ -16,6 +16,7 @@ struct dict_object *fd_user_name = NULL;
|
|||
struct dict_object *fd_auth_session_state = NULL;
|
||||
struct dict_object *fd_auth_application_id = NULL;
|
||||
struct dict_object *fd_auth_request_type = NULL;
|
||||
struct dict_object *fd_re_auth_request_type = NULL;
|
||||
struct dict_object *fd_result_code = NULL;
|
||||
struct dict_object *fd_experimental_result = NULL;
|
||||
struct dict_object *fd_experimental_result_code = NULL;
|
||||
|
@ -42,6 +43,7 @@ int fd_message_init()
|
|||
CHECK_dict_search( DICT_AVP, AVP_BY_NAME, "Auth-Session-State", &fd_auth_session_state);
|
||||
CHECK_dict_search( DICT_AVP, AVP_BY_NAME, "Auth-Application-Id", &fd_auth_application_id);
|
||||
CHECK_dict_search( DICT_AVP, AVP_BY_NAME, "Auth-Request-Type", &fd_auth_request_type);
|
||||
CHECK_dict_search( DICT_AVP, AVP_BY_NAME, "Re-Auth-Request-Type", &fd_re_auth_request_type);
|
||||
CHECK_dict_search( DICT_AVP, AVP_BY_NAME, "Result-Code", &fd_result_code);
|
||||
CHECK_dict_search( DICT_AVP, AVP_BY_NAME, "Experimental-Result", &fd_experimental_result);
|
||||
CHECK_dict_search( DICT_AVP, AVP_BY_NAME, "Experimental-Result-Code", &fd_experimental_result_code);
|
||||
|
|
|
@ -28,6 +28,9 @@ extern struct dict_object *fd_user_name;
|
|||
extern struct dict_object *fd_auth_session_state;
|
||||
extern struct dict_object *fd_auth_application_id;
|
||||
extern struct dict_object *fd_auth_request_type;
|
||||
#define FD_RE_AUTH_REQUEST_TYPE_AUTHORIZE_ONLY 0
|
||||
#define FD_RE_AUTH_REQUEST_TYPE_AUTHORIZE_AUTHENTICATE 1
|
||||
extern struct dict_object *fd_re_auth_request_type;
|
||||
extern struct dict_object *fd_result_code;
|
||||
extern struct dict_object *fd_experimental_result;
|
||||
extern struct dict_object *fd_experimental_result_code;
|
||||
|
|
|
@ -55,9 +55,6 @@ struct dict_object *gx_flow_description = NULL;
|
|||
struct dict_object *gx_flow_status = NULL;
|
||||
struct dict_object *gx_precedence = NULL;
|
||||
struct dict_object *gx_flows = NULL;
|
||||
struct dict_object *gx_re_auth_request_type = NULL;
|
||||
struct dict_object *gx_specific_action = NULL;
|
||||
struct dict_object *gx_abort_cause = NULL;
|
||||
struct dict_object *gx_media_component_description = NULL;
|
||||
struct dict_object *gx_media_component_number = NULL;
|
||||
struct dict_object *gx_media_type = NULL;
|
||||
|
@ -125,9 +122,6 @@ int gx_dict_init(void)
|
|||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Precedence", &gx_precedence);
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flows", &gx_flows);
|
||||
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Re-Auth-Request-Type", &gx_re_auth_request_type);
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Specific-Action", &gx_specific_action);
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Abort-Cause", &gx_abort_cause);
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Description", &gx_media_component_description);
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Number", &gx_media_component_number);
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Type", &gx_media_type);
|
||||
|
|
|
@ -93,9 +93,6 @@ extern struct dict_object *gx_flow_description;
|
|||
extern struct dict_object *gx_flow_status;
|
||||
extern struct dict_object *gx_precedence;
|
||||
extern struct dict_object *gx_flows;
|
||||
extern struct dict_object *gx_re_auth_request_type;
|
||||
extern struct dict_object *gx_specific_action;
|
||||
extern struct dict_object *gx_abort_cause;
|
||||
extern struct dict_object *gx_media_component_description;
|
||||
extern struct dict_object *gx_media_component_number;
|
||||
extern struct dict_object *gx_media_type;
|
||||
|
|
|
@ -11400,12 +11400,16 @@ static int dict_dcca_3gpp_entry(char * conffile)
|
|||
struct dict_object * cmd;
|
||||
struct local_rules_definition rules[] =
|
||||
{
|
||||
#if 0 /* modified by acetcom */
|
||||
{ { .avp_vendor = 10415, .avp_name = "Specific-Action" }, RULE_REQUIRED, -1, 1 },
|
||||
#endif
|
||||
{ { .avp_vendor = 10415, .avp_name = "Access-Network-Charging-Identifier" }, RULE_OPTIONAL, -1, -1 },
|
||||
{ { .avp_vendor = 10415, .avp_name = "Access-Network-Charging-Address" }, RULE_OPTIONAL, -1, 1 },
|
||||
{ { .avp_vendor = 10415, .avp_name = "Flows" }, RULE_OPTIONAL, -1, -1 },
|
||||
{ { .avp_name = "Subscription-Id" }, RULE_OPTIONAL, -1, -1 },
|
||||
#if 0 /* modified by acetcom */
|
||||
{ { .avp_vendor = 10415, .avp_name = "Abort-Cause" }, RULE_REQUIRED, -1, 1 },
|
||||
#endif
|
||||
{ { .avp_vendor = 10415, .avp_name = "IP-CAN-Type" }, RULE_OPTIONAL, -1, 1 },
|
||||
{ { .avp_vendor = 10415, .avp_name = "RAT-Type" }, RULE_OPTIONAL, -1, 1 },
|
||||
{ { .avp_vendor = 10415, .avp_name = "Sponsored-Connectivity-Data" }, RULE_OPTIONAL, -1, 1 }
|
||||
|
|
|
@ -15,17 +15,21 @@
|
|||
struct sess_state {
|
||||
c_uint32_t cc_request_type; /* CC-Request-Type */
|
||||
|
||||
os0_t gx_sid; /* Gx Session-Id */
|
||||
os0_t rx_sid; /* Rx Session-Id */
|
||||
os0_t peer_host; /* Peer Host */
|
||||
|
||||
c_int8_t *imsi_bcd;
|
||||
c_int8_t *apn;
|
||||
|
||||
ED3(c_uint8_t ipv4:1;,
|
||||
c_uint8_t ipv6:1;,
|
||||
c_uint8_t reserved:6;)
|
||||
c_uint32_t addr; /* Framed-IPv4-Address */
|
||||
c_uint8_t addr6[IPV6_LEN]; /* Framed-IPv6-Prefix */
|
||||
|
||||
struct timespec ts; /* Time of sending the message */
|
||||
os0_t gx_sid; /* Gx Session-Id */
|
||||
os0_t rx_sid; /* Rx Session-Id */
|
||||
|
||||
struct timespec ts; /* Time of sending the message */
|
||||
};
|
||||
|
||||
static struct session_handler *pcrf_gx_reg = NULL;
|
||||
|
@ -54,6 +58,14 @@ static void state_cleanup(
|
|||
{
|
||||
d_assert(sess_data, return,);
|
||||
|
||||
if (sess_data->peer_host)
|
||||
CORE_FREE(sess_data->peer_host);
|
||||
|
||||
if (sess_data->imsi_bcd)
|
||||
CORE_FREE(sess_data->imsi_bcd);
|
||||
if (sess_data->apn)
|
||||
CORE_FREE(sess_data->apn);
|
||||
|
||||
if (sess_data->ipv4)
|
||||
pcrf_sess_set_ipv4(&sess_data->addr, NULL);
|
||||
if (sess_data->ipv6)
|
||||
|
@ -63,8 +75,6 @@ static void state_cleanup(
|
|||
CORE_FREE(sess_data->gx_sid);
|
||||
if (sess_data->rx_sid)
|
||||
CORE_FREE(sess_data->rx_sid);
|
||||
if (sess_data->peer_host)
|
||||
CORE_FREE(sess_data->peer_host);
|
||||
|
||||
pool_free_node(&pcrf_gx_sess_pool, sess_data);
|
||||
}
|
||||
|
@ -91,8 +101,6 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
|||
struct sess_state *sess_data = NULL;
|
||||
|
||||
gx_message_t gx_message;
|
||||
c_int8_t imsi_bcd[MAX_IMSI_BCD_LEN+1];
|
||||
c_int8_t apn[MAX_APN_LEN+1];
|
||||
int i, j;
|
||||
|
||||
c_uint32_t cc_request_number = 0;
|
||||
|
@ -234,37 +242,80 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
|||
/* Get IMSI + APN */
|
||||
ret = fd_msg_search_avp(qry, gx_subscription_id, &avp);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
ret = fd_msg_avp_hdr(avp, &hdr);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
ret = fd_avp_search_avp(avp, gx_subscription_id_type, &avpch1);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
ret = fd_msg_avp_hdr(avpch1, &hdr);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
if (hdr->avp_value->i32 != GX_SUBSCRIPTION_ID_TYPE_END_USER_IMSI)
|
||||
if (avp)
|
||||
{
|
||||
d_error("Not implemented Subscription-Id-Type(%d)",
|
||||
hdr->avp_value->i32);
|
||||
result_code = FD_DIAMETER_AVP_UNSUPPORTED;
|
||||
ret = fd_msg_avp_hdr(avp, &hdr);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
ret = fd_avp_search_avp(avp, gx_subscription_id_type, &avpch1);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
if (avpch1)
|
||||
{
|
||||
ret = fd_msg_avp_hdr(avpch1, &hdr);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
if (hdr->avp_value->i32 != GX_SUBSCRIPTION_ID_TYPE_END_USER_IMSI)
|
||||
{
|
||||
d_error("Not implemented Subscription-Id-Type(%d)",
|
||||
hdr->avp_value->i32);
|
||||
result_code = FD_DIAMETER_AVP_UNSUPPORTED;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
d_error("no_Subscription-Id-Type");
|
||||
result_code = FD_DIAMETER_MISSING_AVP;
|
||||
goto out;
|
||||
}
|
||||
ret = fd_avp_search_avp(avp, gx_subscription_id_data, &avpch1);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
if (avpch1)
|
||||
{
|
||||
ret = fd_msg_avp_hdr(avpch1, &hdr);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
if (sess_data->imsi_bcd)
|
||||
CORE_FREE(sess_data->imsi_bcd);
|
||||
sess_data->imsi_bcd = core_strdup((char *)hdr->avp_value->os.data);
|
||||
d_assert(sess_data->imsi_bcd, return CORE_ERROR,);
|
||||
}
|
||||
else
|
||||
{
|
||||
d_error("no_Subscription-Id-Data");
|
||||
result_code = FD_DIAMETER_MISSING_AVP;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if (sess_data->imsi_bcd == NULL)
|
||||
{
|
||||
d_error("no_Subscription-Id");
|
||||
result_code = FD_DIAMETER_MISSING_AVP;
|
||||
goto out;
|
||||
}
|
||||
ret = fd_avp_search_avp(avp, gx_subscription_id_data, &avpch1);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
ret = fd_msg_avp_hdr(avpch1, &hdr);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
core_cpystrn(imsi_bcd, (char*)hdr->avp_value->os.data,
|
||||
c_min(hdr->avp_value->os.len, MAX_IMSI_BCD_LEN)+1);
|
||||
|
||||
ret = fd_msg_search_avp(qry, gx_called_station_id, &avp);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
ret = fd_msg_avp_hdr(avp, &hdr);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
core_cpystrn(apn, (char*)hdr->avp_value->os.data,
|
||||
c_min(hdr->avp_value->os.len, MAX_APN_LEN)+1);
|
||||
if (avp)
|
||||
{
|
||||
ret = fd_msg_avp_hdr(avp, &hdr);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
if (sess_data->apn)
|
||||
CORE_FREE(sess_data->apn);
|
||||
sess_data->apn = core_strdup((char *)hdr->avp_value->os.data);
|
||||
d_assert(sess_data->apn, return CORE_ERROR,);
|
||||
}
|
||||
|
||||
rv = pcrf_db_pdn_data(imsi_bcd, apn, &gx_message);
|
||||
if (sess_data->apn == NULL)
|
||||
{
|
||||
d_error("no_Called-Station-Id");
|
||||
result_code = FD_DIAMETER_MISSING_AVP;
|
||||
goto out;
|
||||
}
|
||||
|
||||
rv = pcrf_db_pdn_data(sess_data->imsi_bcd, sess_data->apn, &gx_message);
|
||||
if (rv != CORE_OK)
|
||||
{
|
||||
d_error("Cannot get data for IMSI(%s)+APN(%s)'\n", imsi_bcd, apn);
|
||||
d_error("Cannot get data for IMSI(%s)+APN(%s)'\n",
|
||||
sess_data->imsi_bcd, sess_data->apn);
|
||||
result_code = FD_DIAMETER_UNKNOWN_SESSION_ID;
|
||||
goto out;
|
||||
}
|
||||
|
@ -296,7 +347,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
|||
ret = fd_msg_avp_new(gx_charging_rule_name, 0, &avpch2);
|
||||
d_assert(ret == 0, return EINVAL,);
|
||||
/* Charing-Rule-Name is automatically configured by order */
|
||||
sprintf(pcc_rule->name, "%s%d", apn, i+1);
|
||||
sprintf(pcc_rule->name, "%s%d", sess_data->apn, i+1);
|
||||
val.os.data = (c_uint8_t *)pcc_rule->name;
|
||||
val.os.len = strlen(pcc_rule->name);
|
||||
ret = fd_msg_avp_setvalue(avpch2, &val);
|
||||
|
@ -715,27 +766,9 @@ void pcrf_gx_send_rar(c_uint8_t *gx_sid)
|
|||
d_assert(ret == 0, return,);
|
||||
|
||||
/* Set the Re-Auth-Request-Type */
|
||||
ret = fd_msg_avp_new(gx_re_auth_request_type, 0, &avp);
|
||||
ret = fd_msg_avp_new(fd_re_auth_request_type, 0, &avp);
|
||||
d_assert(ret == 0, return,);
|
||||
val.i32 = 0;
|
||||
ret = fd_msg_avp_setvalue(avp, &val);
|
||||
d_assert(ret == 0, return,);
|
||||
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
|
||||
d_assert(ret == 0, return,);
|
||||
|
||||
/* Set the Specific-Action */
|
||||
ret = fd_msg_avp_new(gx_specific_action, 0, &avp);
|
||||
d_assert(ret == 0, return,);
|
||||
val.i32 = 0;
|
||||
ret = fd_msg_avp_setvalue(avp, &val);
|
||||
d_assert(ret == 0, return,);
|
||||
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
|
||||
d_assert(ret == 0, return,);
|
||||
|
||||
/* Set the Abort-Cause */
|
||||
ret = fd_msg_avp_new(gx_abort_cause, 0, &avp);
|
||||
d_assert(ret == 0, return,);
|
||||
val.i32 = 0;
|
||||
val.i32 = FD_RE_AUTH_REQUEST_TYPE_AUTHORIZE_ONLY;
|
||||
ret = fd_msg_avp_setvalue(avp, &val);
|
||||
d_assert(ret == 0, return,);
|
||||
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
|
||||
|
|
|
@ -292,6 +292,8 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp,
|
|||
rv = pcrf_sess_gx_associate_rx(gx_sid, rx_sid);
|
||||
d_assert(rv == CORE_OK, goto out, "Cannot Associate Gx/Rx Session");
|
||||
|
||||
pcrf_gx_send_rar(gx_sid);
|
||||
|
||||
/* Store Gx Session-Id in this session */
|
||||
if (sess_data->gx_sid)
|
||||
CORE_FREE(sess_data->gx_sid);
|
||||
|
@ -336,8 +338,6 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp,
|
|||
|
||||
rx_message_free(&rx_message);
|
||||
|
||||
pcrf_gx_send_rar(gx_sid);
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
|
|
Loading…
Reference in New Issue