remove Specific-Action/Abort-Cause in Gx message

This commit is contained in:
Sukchan Lee 2018-01-14 13:00:41 +09:00
parent 853913b31d
commit 2884430c57
7 changed files with 94 additions and 61 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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 }

View File

@ -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);

View File

@ -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: