Diameter Gx Code Refine

This commit is contained in:
Sukchan Lee 2018-01-10 22:09:08 +09:00
parent 58f501d397
commit 2059341d4f
12 changed files with 68 additions and 91 deletions

View File

@ -5,15 +5,15 @@
#include "gx_message.h"
void gx_cca_message_free(gx_cca_message_t *cca_message)
void gx_message_free(gx_message_t *gx_message)
{
int i, j;
d_assert(cca_message, return, "Null param");
d_assert(gx_message, return, "Null param");
for (i = 0; i < cca_message->num_of_pcc_rule; i++)
for (i = 0; i < gx_message->num_of_pcc_rule; i++)
{
pcc_rule_t *pcc_rule = &cca_message->pcc_rule[i];
pcc_rule_t *pcc_rule = &gx_message->pcc_rule[i];
for (j = 0; j < pcc_rule->num_of_flow; j++)
{

View File

@ -7,18 +7,6 @@ extern "C" {
#include "3gpp_types.h"
typedef struct _gx_cca_message_t {
#define GX_CC_REQUEST_TYPE_INITIAL_REQUEST 1
#define GX_CC_REQUEST_TYPE_UPDATE_REQUEST 2
#define GX_CC_REQUEST_TYPE_TERMINATION_REQUEST 3
#define GX_CC_REQUEST_TYPE_EVENT_REQUEST 4
c_uint32_t cc_request_type;
pdn_t pdn;
pcc_rule_t pcc_rule[MAX_NUM_OF_PCC_RULE];
int num_of_pcc_rule;
} gx_cca_message_t;
typedef struct _gx_message_t {
#define GX_CMD_CODE_CREDIT_CONTROL 272
c_uint16_t cmd_code;
@ -36,10 +24,18 @@ typedef struct _gx_message_t {
#define GX_DIAMETER_ERROR_NBIFOM_NOT_AUTHORIZED 5149
c_uint32_t result_code;
gx_cca_message_t cca_message;
#define GX_CC_REQUEST_TYPE_INITIAL_REQUEST 1
#define GX_CC_REQUEST_TYPE_UPDATE_REQUEST 2
#define GX_CC_REQUEST_TYPE_TERMINATION_REQUEST 3
#define GX_CC_REQUEST_TYPE_EVENT_REQUEST 4
c_uint32_t cc_request_type;
pdn_t pdn;
pcc_rule_t pcc_rule[MAX_NUM_OF_PCC_RULE];
int num_of_pcc_rule;
} gx_message_t;
CORE_DECLARE(void) gx_cca_message_free(gx_cca_message_t *cca_message);
CORE_DECLARE(void) gx_message_free(gx_message_t *message);
#ifdef __cplusplus
}

View File

@ -378,7 +378,7 @@ status_t pcrf_db_final()
}
status_t pcrf_db_pdn_data(
c_int8_t *imsi_bcd, c_int8_t *apn, gx_cca_message_t *cca_message)
c_int8_t *imsi_bcd, c_int8_t *apn, gx_message_t *gx_message)
{
status_t rv = CORE_OK;
mongoc_cursor_t *cursor = NULL;
@ -394,7 +394,7 @@ status_t pcrf_db_pdn_data(
d_assert(imsi_bcd, return CORE_ERROR, "Null param");
d_assert(apn, return CORE_ERROR, "Null param");
d_assert(cca_message, return CORE_ERROR, "Null param");
d_assert(gx_message, return CORE_ERROR, "Null param");
mutex_lock(self.db_lock);
@ -462,7 +462,7 @@ status_t pcrf_db_pdn_data(
d_assert(pdn_index == 0, goto out,
"Invalid PDN Index(%d)", pdn_index);
pdn = &cca_message->pdn;
pdn = &gx_message->pdn;
bson_iter_recurse(&child1_iter, &child2_iter);
while(bson_iter_next(&child2_iter))
{
@ -566,7 +566,7 @@ status_t pcrf_db_pdn_data(
"Overflow of PCC RULE number(%d>%d)",
pcc_rule_index, MAX_NUM_OF_PCC_RULE);
pcc_rule = &cca_message->pcc_rule[pcc_rule_index];
pcc_rule = &gx_message->pcc_rule[pcc_rule_index];
bson_iter_recurse(&child3_iter, &child4_iter);
while(bson_iter_next(&child4_iter))
{
@ -748,7 +748,7 @@ status_t pcrf_db_pdn_data(
}
pcc_rule_index++;
}
cca_message->num_of_pcc_rule = pcc_rule_index;
gx_message->num_of_pcc_rule = pcc_rule_index;
}
}
}

View File

@ -37,7 +37,7 @@ CORE_DECLARE(status_t) pcrf_db_init(void);
CORE_DECLARE(status_t) pcrf_db_final(void);
CORE_DECLARE(status_t) pcrf_db_pdn_data(
c_int8_t *imsi_bcd, c_int8_t *apn, gx_cca_message_t *cca_message);
c_int8_t *imsi_bcd, c_int8_t *apn, gx_message_t *gx_message);
CORE_DECLARE(status_t) pcrf_sess_set_ipv4(const void *key, c_uint8_t *sid);
CORE_DECLARE(status_t) pcrf_sess_set_ipv6(const void *key, c_uint8_t *sid);

View File

@ -90,7 +90,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
union avp_value val;
struct sess_state *sess_data = NULL;
gx_cca_message_t cca_message;
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;
@ -116,7 +116,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
}
/* Initialize Message */
memset(&cca_message, 0, sizeof(gx_cca_message_t));
memset(&gx_message, 0, sizeof(gx_message_t));
/* Create answer header */
qry = *msg;
@ -261,7 +261,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
core_cpystrn(apn, (char*)hdr->avp_value->os.data,
c_min(hdr->avp_value->os.len, MAX_APN_LEN)+1);
rv = pcrf_db_pdn_data(imsi_bcd, apn, &cca_message);
rv = pcrf_db_pdn_data(imsi_bcd, apn, &gx_message);
if (rv != CORE_OK)
{
d_error("Cannot get data for IMSI(%s)+APN(%s)'\n", imsi_bcd, apn);
@ -274,9 +274,9 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
/* Set Charging-Rule-Install */
int charging_rule_install = 0;
for (i = 0; i < cca_message.num_of_pcc_rule; i++)
for (i = 0; i < gx_message.num_of_pcc_rule; i++)
{
pcc_rule_t *pcc_rule = &cca_message.pcc_rule[i];
pcc_rule_t *pcc_rule = &gx_message.pcc_rule[i];
if (pcc_rule->num_of_flow)
charging_rule_install = 1;
}
@ -287,9 +287,9 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
d_assert(ret == 0, return EINVAL,);
}
for (i = 0; i < cca_message.num_of_pcc_rule; i++)
for (i = 0; i < gx_message.num_of_pcc_rule; i++)
{
pcc_rule_t *pcc_rule = &cca_message.pcc_rule[i];
pcc_rule_t *pcc_rule = &gx_message.pcc_rule[i];
ret = fd_msg_avp_new(gx_charging_rule_definition, 0, &avpch1);
d_assert(ret == 0, return EINVAL,);
@ -447,29 +447,29 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
}
/* Set QoS-Information */
if (cca_message.pdn.ambr.downlink || cca_message.pdn.ambr.uplink)
if (gx_message.pdn.ambr.downlink || gx_message.pdn.ambr.uplink)
{
ret = fd_msg_avp_new(gx_qos_information, 0, &avp);
d_assert(ret == 0, return EINVAL,);
if (cca_message.pdn.ambr.uplink)
if (gx_message.pdn.ambr.uplink)
{
ret = fd_msg_avp_new(gx_apn_aggregate_max_bitrate_ul, 0,
&avpch1);
d_assert(ret == 0, return EINVAL,);
val.u32 = cca_message.pdn.ambr.uplink;
val.u32 = gx_message.pdn.ambr.uplink;
ret = fd_msg_avp_setvalue (avpch1, &val);
d_assert(ret == 0, return EINVAL,);
ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1);
d_assert(ret == 0, return EINVAL,);
}
if (cca_message.pdn.ambr.downlink)
if (gx_message.pdn.ambr.downlink)
{
ret = fd_msg_avp_new(gx_apn_aggregate_max_bitrate_dl, 0,
&avpch1);
d_assert(ret == 0, return EINVAL,);
val.u32 = cca_message.pdn.ambr.downlink;
val.u32 = gx_message.pdn.ambr.downlink;
ret = fd_msg_avp_setvalue (avpch1, &val);
d_assert(ret == 0, return EINVAL,);
ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1);
@ -486,7 +486,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
ret = fd_msg_avp_new(gx_qos_class_identifier, 0, &avpch1);
d_assert(ret == 0, return EINVAL,);
val.u32 = cca_message.pdn.qos.qci;
val.u32 = gx_message.pdn.qos.qci;
ret = fd_msg_avp_setvalue (avpch1, &val);
d_assert(ret == 0, return EINVAL,);
ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1);
@ -497,7 +497,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
ret = fd_msg_avp_new(gx_priority_level, 0, &avpch2);
d_assert(ret == 0, return EINVAL,);
val.u32 = cca_message.pdn.qos.arp.priority_level;
val.u32 = gx_message.pdn.qos.arp.priority_level;
ret = fd_msg_avp_setvalue (avpch2, &val);
d_assert(ret == 0, return EINVAL,);
ret = fd_msg_avp_add (avpch1, MSG_BRW_LAST_CHILD, avpch2);
@ -505,7 +505,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
ret = fd_msg_avp_new(gx_pre_emption_capability, 0, &avpch2);
d_assert(ret == 0, return EINVAL,);
val.u32 = cca_message.pdn.qos.arp.pre_emption_capability;
val.u32 = gx_message.pdn.qos.arp.pre_emption_capability;
ret = fd_msg_avp_setvalue (avpch2, &val);
d_assert(ret == 0, return EINVAL,);
ret = fd_msg_avp_add (avpch1, MSG_BRW_LAST_CHILD, avpch2);
@ -513,7 +513,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
ret = fd_msg_avp_new(gx_pre_emption_vulnerability, 0, &avpch2);
d_assert(ret == 0, return EINVAL,);
val.u32 = cca_message.pdn.qos.arp.pre_emption_vulnerability;
val.u32 = gx_message.pdn.qos.arp.pre_emption_vulnerability;
ret = fd_msg_avp_setvalue (avpch2, &val);
d_assert(ret == 0, return EINVAL,);
ret = fd_msg_avp_add (avpch1, MSG_BRW_LAST_CHILD, avpch2);
@ -574,7 +574,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
fd_logger_self()->stats.nb_echoed++;
d_assert(pthread_mutex_unlock(&fd_logger_self()->stats_lock) ==0,, );
gx_cca_message_free(&cca_message);
gx_message_free(&gx_message);
return 0;
@ -618,7 +618,7 @@ out:
ret = fd_msg_send(msg, NULL, NULL);
d_assert(ret == 0,,);
gx_cca_message_free(&cca_message);
gx_message_free(&gx_message);
return 0;
}

View File

@ -431,7 +431,6 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
pgw_sess_t *sess = NULL;
pkbuf_t *gxbuf = NULL, *gtpbuf = NULL;
gx_message_t *gx_message = NULL;
gx_cca_message_t *cca_message = NULL;
c_uint16_t gxbuf_len = 0;
ret = clock_gettime(CLOCK_REALTIME, &ts);
@ -465,7 +464,6 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
/* Set Credit Control Command */
memset(gx_message, 0, gxbuf_len);
gx_message->cmd_code = GX_CMD_CODE_CREDIT_CONTROL;
cca_message = &gx_message->cca_message;
/* Value of Result Code */
ret = fd_msg_search_avp(*msg, fd_result_code, &avp);
@ -545,7 +543,7 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
{
ret = fd_msg_avp_hdr(avp, &hdr);
d_assert(ret == 0, return,);
cca_message->cc_request_type = hdr->avp_value->i32;
gx_message->cc_request_type = hdr->avp_value->i32;
}
else
{
@ -568,7 +566,7 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
case GX_AVP_CODE_CHARGING_RULE_DEFINITION:
{
pcc_rule_t *pcc_rule =
&cca_message->pcc_rule[cca_message->num_of_pcc_rule];
&gx_message->pcc_rule[gx_message->num_of_pcc_rule];
ret = fd_msg_browse(avpch1,
MSG_BRW_FIRST_CHILD, &avpch2, NULL);
@ -760,7 +758,7 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
fd_msg_browse(avpch2, MSG_BRW_NEXT, &avpch2, NULL);
}
cca_message->num_of_pcc_rule++;
gx_message->num_of_pcc_rule++;
break;
}
@ -784,7 +782,7 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
{
ret = fd_msg_avp_hdr(avpch1, &hdr);
d_assert(ret == 0, return,);
cca_message->pdn.ambr.uplink = hdr->avp_value->u32;
gx_message->pdn.ambr.uplink = hdr->avp_value->u32;
}
ret = fd_avp_search_avp(avp, gx_apn_aggregate_max_bitrate_dl, &avpch1);
d_assert(ret == 0, return,);
@ -792,7 +790,7 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
{
ret = fd_msg_avp_hdr(avpch1, &hdr);
d_assert(ret == 0, return,);
cca_message->pdn.ambr.downlink = hdr->avp_value->u32;
gx_message->pdn.ambr.downlink = hdr->avp_value->u32;
}
}
@ -806,7 +804,7 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
{
ret = fd_msg_avp_hdr(avpch1, &hdr);
d_assert(ret == 0, return,);
cca_message->pdn.qos.qci = hdr->avp_value->u32;
gx_message->pdn.qos.qci = hdr->avp_value->u32;
}
ret = fd_avp_search_avp(avp, gx_allocation_retention_priority, &avpch1);
@ -819,7 +817,7 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
{
ret = fd_msg_avp_hdr(avpch4, &hdr);
d_assert(ret == 0, return,);
cca_message->pdn.qos.arp.priority_level = hdr->avp_value->u32;
gx_message->pdn.qos.arp.priority_level = hdr->avp_value->u32;
}
ret = fd_avp_search_avp(avpch1, gx_pre_emption_capability, &avpch4);
@ -828,7 +826,7 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
{
ret = fd_msg_avp_hdr(avpch4, &hdr);
d_assert(ret == 0, return,);
cca_message->pdn.qos.arp.pre_emption_capability =
gx_message->pdn.qos.arp.pre_emption_capability =
hdr->avp_value->u32;
}
@ -839,7 +837,7 @@ static void pgw_gx_cca_cb(void *data, struct msg **msg)
{
ret = fd_msg_avp_hdr(avpch4, &hdr);
d_assert(ret == 0, return,);
cca_message->pdn.qos.arp.pre_emption_vulnerability =
gx_message->pdn.qos.arp.pre_emption_vulnerability =
hdr->avp_value->u32;
}
}

View File

@ -10,7 +10,7 @@
void pgw_gx_handle_cca_initial_request(
gtp_xact_t *xact, pgw_sess_t *sess,
gx_cca_message_t *cca_message, gtp_create_session_request_t *req)
gx_message_t *gx_message, gtp_create_session_request_t *req)
{
status_t rv;
gtp_header_t h;
@ -20,7 +20,7 @@ void pgw_gx_handle_cca_initial_request(
d_assert(xact, return, "Null param");
d_assert(sess, return, "Null param");
d_assert(cca_message, return, "Null param");
d_assert(gx_message, return, "Null param");
d_assert(req, return, "Null param");
/* Send Create Session Request with Creating Default Bearer */
@ -29,7 +29,7 @@ void pgw_gx_handle_cca_initial_request(
h.teid = sess->sgw_s5c_teid;
rv = pgw_s5c_build_create_session_response(
&pkbuf, h.type, sess, cca_message, req);
&pkbuf, h.type, sess, gx_message, req);
d_assert(rv == CORE_OK, return, "S11 build error");
rv = gtp_xact_update_tx(xact, &h, pkbuf);
@ -39,9 +39,9 @@ void pgw_gx_handle_cca_initial_request(
d_assert(rv == CORE_OK, return, "xact_commit error");
/* Find Dedicated Bearer */
for (i = 0; i < cca_message->num_of_pcc_rule; i++)
for (i = 0; i < gx_message->num_of_pcc_rule; i++)
{
pcc_rule_t *pcc_rule = &cca_message->pcc_rule[i];
pcc_rule_t *pcc_rule = &gx_message->pcc_rule[i];
bearer = pgw_bearer_find_by_qci_arp(sess,
pcc_rule->qos.qci,
pcc_rule->qos.arp.priority_level,
@ -104,7 +104,7 @@ void pgw_gx_handle_cca_initial_request(
void pgw_gx_handle_cca_termination_request(
gtp_xact_t *xact, pgw_sess_t *sess,
gx_cca_message_t *cca_message, gtp_delete_session_request_t *req)
gx_message_t *gx_message, gtp_delete_session_request_t *req)
{
status_t rv;
gtp_header_t h;
@ -113,7 +113,7 @@ void pgw_gx_handle_cca_termination_request(
d_assert(xact, return, "Null param");
d_assert(sess, return, "Null param");
d_assert(cca_message, return, "Null param");
d_assert(gx_message, return, "Null param");
d_assert(req, return, "Null param");
/* backup sgw_s5c_teid in session context */
@ -127,7 +127,7 @@ void pgw_gx_handle_cca_termination_request(
h.teid = sgw_s5c_teid;
rv = pgw_s5c_build_delete_session_response(
&pkbuf, h.type, sess, cca_message, req);
&pkbuf, h.type, sess, gx_message, req);
d_assert(rv == CORE_OK, return, "S11 build error");
rv = gtp_xact_update_tx(xact, &h, pkbuf);

View File

@ -11,10 +11,10 @@ extern "C" {
CORE_DECLARE(void) pgw_gx_handle_cca_initial_request(
gtp_xact_t *xact, pgw_sess_t *sess,
gx_cca_message_t *cca_message, gtp_create_session_request_t *req);
gx_message_t *gx_message, gtp_create_session_request_t *req);
CORE_DECLARE(void) pgw_gx_handle_cca_termination_request(
gtp_xact_t *xact, pgw_sess_t *sess,
gx_cca_message_t *cca_message, gtp_delete_session_request_t *req);
gx_message_t *gx_message, gtp_delete_session_request_t *req);
#ifdef __cplusplus
}

View File

@ -16,7 +16,7 @@ static c_int16_t pgw_pco_build(c_uint8_t *pco_buf, tlv_pco_t *tlv_pco);
status_t pgw_s5c_build_create_session_response(
pkbuf_t **pkbuf, c_uint8_t type, pgw_sess_t *sess,
gx_cca_message_t *cca_message, gtp_create_session_request_t *req)
gx_message_t *gx_message, gtp_create_session_request_t *req)
{
status_t rv;
pgw_bearer_t *bearer = NULL;
@ -117,7 +117,7 @@ status_t pgw_s5c_build_create_session_response(
status_t pgw_s5c_build_delete_session_response(
pkbuf_t **pkbuf, c_uint8_t type, pgw_sess_t *sess,
gx_cca_message_t *cca_message, gtp_delete_session_request_t *req)
gx_message_t *gx_message, gtp_delete_session_request_t *req)
{
status_t rv;
@ -129,7 +129,7 @@ status_t pgw_s5c_build_delete_session_response(
c_int16_t pco_len;
d_assert(sess, return CORE_ERROR, "Null param");
d_assert(cca_message, return CORE_ERROR, "Null param");
d_assert(gx_message, return CORE_ERROR, "Null param");
d_assert(req, return CORE_ERROR, "Null param");
/* prepare cause */

View File

@ -9,10 +9,10 @@ extern "C" {
CORE_DECLARE(status_t) pgw_s5c_build_create_session_response(
pkbuf_t **pkbuf, c_uint8_t type, pgw_sess_t *sess,
gx_cca_message_t *cca_message, gtp_create_session_request_t *req);
gx_message_t *gx_message, gtp_create_session_request_t *req);
CORE_DECLARE(status_t) pgw_s5c_build_delete_session_response(
pkbuf_t **pkbuf, c_uint8_t type, pgw_sess_t *sess,
gx_cca_message_t *cca_message, gtp_delete_session_request_t *req);
gx_message_t *gx_message, gtp_delete_session_request_t *req);
CORE_DECLARE(status_t) pgw_s5c_build_create_bearer_request(
pkbuf_t **pkbuf, c_uint8_t type, pgw_bearer_t *bearer);

View File

@ -169,25 +169,24 @@ void pgw_state_operational(fsm_t *s, event_t *e)
{
case GX_CMD_CODE_CREDIT_CONTROL:
{
gx_cca_message_t *cca_message = &gx_message->cca_message;
if (gx_message->result_code != ER_DIAMETER_SUCCESS)
{
d_error("Not implemented(%d)", gx_message->result_code);
break;
}
switch(cca_message->cc_request_type)
switch(gx_message->cc_request_type)
{
case GX_CC_REQUEST_TYPE_INITIAL_REQUEST:
{
pgw_gx_handle_cca_initial_request(
xact, sess, cca_message,
xact, sess, gx_message,
&message->create_session_request);
break;
}
case GX_CC_REQUEST_TYPE_TERMINATION_REQUEST:
{
pgw_gx_handle_cca_termination_request(
xact, sess, cca_message,
xact, sess, gx_message,
&message->delete_session_request);
break;
}
@ -197,7 +196,7 @@ void pgw_state_operational(fsm_t *s, event_t *e)
break;
}
}
gx_cca_message_free(cca_message);
gx_message_free(gx_message);
break;
}
default:

View File

@ -158,7 +158,7 @@ void pcscf_rx_send_aar(const char *ip)
ret = fd_msg_avp_new(rx_media_component_number, 0, &avpch1);
d_assert(ret == 0, return,);
val.i32 = RX_MEDIA_TYPE_AUDIO;
val.i32 = 1;
ret = fd_msg_avp_setvalue (avpch1, &val);
d_assert(ret == 0, return,);
ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1);
@ -166,7 +166,7 @@ void pcscf_rx_send_aar(const char *ip)
ret = fd_msg_avp_new(rx_media_type, 0, &avpch1);
d_assert(ret == 0, return,);
val.i32 = 1;
val.i32 = RX_MEDIA_TYPE_AUDIO;
ret = fd_msg_avp_setvalue (avpch1, &val);
d_assert(ret == 0, return,);
ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1);
@ -188,22 +188,6 @@ void pcscf_rx_send_aar(const char *ip)
ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1);
d_assert(ret == 0, return,);
ret = fd_msg_avp_new(rx_min_requested_bandwidth_dl, 0, &avpch1);
d_assert(ret == 0, return,);
val.i32 = 2400;
ret = fd_msg_avp_setvalue (avpch1, &val);
d_assert(ret == 0, return,);
ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1);
d_assert(ret == 0, return,);
ret = fd_msg_avp_new(rx_min_requested_bandwidth_ul, 0, &avpch1);
d_assert(ret == 0, return,);
val.i32 = 2400;
ret = fd_msg_avp_setvalue (avpch1, &val);
d_assert(ret == 0, return,);
ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1);
d_assert(ret == 0, return,);
/* Set Media-Sub-Component #1 */
ret = fd_msg_avp_new(rx_media_sub_component, 0, &avpch1);