Files
2025-03-03 11:01:26 +08:00

3790 lines
130 KiB
C
Raw Permalink Blame History

/****************
Contributed by: Krishnan Srinivasan <hsirk_6@yahoo.com>
License: to be specified.
TODO:
****************/
#include "extension.h"
#include <signal.h>
#include <time.h>
#include <math.h>
#include "sh_app.h"
#include "sh_conf.h"
#include "../../include/gy_message.h"
#define _TEST_CCA 0
#define PS_ENABLED 0
#define FD_DEBUG_PROCESS 1
#define AUTH_APP_ID 16777238
#define VENDOR_ID_3GPP 10415
/* The content of this file follows the same structure as dict_base_proto.c */
void dump_sess_eyec(struct session *sess, const char *);
static long ts_sec, ts_msec;
static long gx_start_ts = 0;
static int gx_rec_ccr( struct msg ** msg, struct avp * avp, struct session * sess, void * opaque, enum disp_action * act);
static void gx_rec_cca(void *para, struct msg **msg);
_gy_port *gy_get_port_by_cxt_id(char *cxt_id);
static struct disp_hdl * ccr_cb_hdl = NULL; /* handler for ccr req cb */
//static struct disp_hdl * cca_cb_hdl = NULL; /* handler for cca req cb */
// static struct disp_hdl * reauth_cb_hdl = NULL; /* handler for cca req cb */
struct dict_object *ccr_cmd = NULL;
struct dict_object *cca_cmd = NULL;
struct dict_object *dataobj_re_auth_request_type = NULL;
struct dict_object *session_id = NULL;
struct dict_object *origin_host = NULL;
struct dict_object *origin_realm = NULL;
struct dict_object *dest_host = NULL;
struct dict_object *dest_realm = NULL;
struct dict_object *reauth_cmd = NULL;
struct dict_object *auth_app_id = NULL;
struct dict_object *service_cxt_id = NULL ;
struct dict_object *cc_req_type = NULL;
struct dict_object *cc_req_num = NULL;
struct dict_object *result_code = NULL;
struct dict_object *requested_action = NULL;
struct dict_object *check_balance_result = NULL;
/* fj added 20160802 */
struct dict_object *event_timestamp = NULL;
struct dict_object *subscription_id = NULL, *subscription_id_type = NULL, *subscription_id_data = NULL;
struct dict_object *service_information = NULL;
struct dict_object *ims_information = NULL;
struct dict_object *sms_information = NULL;
struct dict_object *time_stamps = NULL;
struct dict_object *service_identifier = NULL;
struct dict_object *rating_group = NULL;
struct dict_object *multiple_services_indicator = NULL;
struct dict_object *multiple_services_credit_control = NULL;
struct dict_object *requested_service_unit = NULL;
struct dict_object *cc_time = NULL;
struct dict_object *cc_total_octects = NULL;
struct dict_object *reporting_reason = NULL;
struct dict_object *final_unit_action = NULL;
struct dict_object *ps_information = NULL;
extern struct dict_object *g_dict_dcca;
struct dict_object *term_cause = NULL;
struct session *g_sess = NULL;
struct session_handler *g_hdlr = NULL;
//static struct dict_avp_request __avp;
enum gx_state
{
STATE_INIT = 0,
STATE_INTERMEDIATE ,
STATE_FINAL
};
struct gx_sm_t
{
enum gx_state state;
pthread_t tid;
struct fifo *events;
pthread_mutex_t p_sm_mtx;
int req_num;
struct session *sess;
} g_gx_sm;
/*---------------------------------*/
static pthread_mutex_t gy_port_lock = PTHREAD_MUTEX_INITIALIZER;
//static pthread_mutex_t gy_cca_lock = PTHREAD_MUTEX_INITIALIZER;
struct session *gy_sess[MAX_GY_PORT];
static _gy_space gy_space;
static _gy_stat gy_stat;
extern GHashTable *g_sess_hash;
//static pthread_mutex_t gy_msg_mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t sess_hash_mutx = PTHREAD_MUTEX_INITIALIZER;
/* -------------------------------------------*/
int pps_recv_gy_process(_gy_msg *gy_ptr);
//static int gx_add_msg_to_list(_gy_msg *pInMsg);
int pps_debug_info(char *app_name, char *str_to_show);
int pps_debug_flag_for_fd();
unsigned int GetLocalIP( );
extern int pps_ro_gy_cb(_gy_msg *gy_ptr);
int fdAsciiToBcdR(char *bcd_buf, int *bcd_buf_len, const char *ascii_buf, int len)
{
int i;
char ch;
*bcd_buf_len = len%2 + len/2;
for(i = 0; i < len; i++)
{
ch = ascii_buf[i];
if(ch >='a' ) ch -= 'a' -10;
else if(ch >='A') ch -= 'A'-10;
else ch -= '0';
if(i & 1) *(bcd_buf++) |= ch<<4;
else *(bcd_buf) = ch & 0x0f;
}
if(len%2)
{
*(bcd_buf++) |= 0xf0;
}
return 0;
}
int fdAsciiToBcd(unsigned char *bcd_buf, int *bcd_buf_len, const char *ascii_buf, int len)
{
int i;
char ch;
*bcd_buf_len = len%2 + len/2;
for(i=0;i<len;i++)
{
ch =ascii_buf[i];
if(ch>='a') ch -='a' -10;
else if(ch>='A') ch -='A'-10;
else ch -='0';
if(i &1) *(bcd_buf++) |=ch & 0x0f;
else *(bcd_buf) =ch<<4;
}
if(len%2)
{
*(bcd_buf++) |= 0x0f;
}
return 0;
}
/* -------------------------------------------*/
static void gy_port_init(_gy_port *gy_port_ptr, int index)
{
if (gy_port_ptr == NULL)
{
return;
}
gy_port_ptr->used_flag = 0;
gy_port_ptr->index = index;
gy_port_ptr->updated_ts = ts_sec;
gy_port_ptr->app_port = INVALID_GY_PORT;
gy_port_ptr->context_id[0] = '\0';
gy_port_ptr->service_type = 0;
gy_port_ptr->request_number = 0;
gy_port_ptr->as_client = 0;
return ;
}
// start==================================
static int print_duplicated_sess_id(const char *cxt_id)
{
int loop=0;
FILE *fpSess=NULL;
fpSess = fopen("../log/dul_sess_id.txt","a");
if(fpSess == NULL)
return 0;
fprintf(fpSess,"now ts=%ld, sess: %s\r\n", ts_sec, cxt_id);
fclose(fpSess);
return 1;
}
int gy_assign_port(char *cxt_id)
{
int i, index, retval = INVALID_GY_PORT;
_gy_port *gy_port_ptr = NULL;
// check if session id already in use========start
gy_port_ptr = gy_get_port_by_cxt_id(cxt_id);
if (gy_port_ptr != NULL)
{
print_duplicated_sess_id(cxt_id);
return retval;
}
CHECK_POSIX_DO( pthread_mutex_lock(&gy_port_lock), { ASSERT(0); } );
for(i=0; i<MAX_GY_PORT; i++)
{
index = gy_space.cur_index++;
gy_space.cur_index %= MAX_GY_PORT;
if(gy_space.gy_port[index].used_flag == 0)
{
gy_port_ptr = &gy_space.gy_port[index];
gy_port_init(gy_port_ptr, index);
gy_port_ptr->used_flag = 1;
strcpy(gy_port_ptr->context_id, cxt_id);
gy_space.used_ports ++;
retval = index;
if(pps_debug_flag_for_fd())
{
char tmp_info[1024];
sprintf(tmp_info, " [fd=%04d][app=0000], ts=%ld.%03ld, used_pots=%d, %s\r\n",
index, ts_sec, ts_msec, gy_space.used_ports, __FUNCTION__);
pps_debug_info("diameter", tmp_info);
}
break;
}
}
CHECK_POSIX_DO( pthread_mutex_unlock(&gy_port_lock), { ASSERT(0); } );
if (gy_port_ptr != NULL)
{
pthread_mutex_lock(&sess_hash_mutx);
//g_hash_table_insert(g_sess_hash, strdup(context_id), (gpointer)gy_cxt_tb.gy_cxt_port[index].index);
g_hash_table_insert(g_sess_hash, gy_port_ptr->context_id, (gpointer)gy_port_ptr);
pthread_mutex_unlock(&sess_hash_mutx);
}
return retval;
}
int gy_release_port(unsigned short index)
{
if(index<MAX_GY_PORT)
{
_gy_port *gy_port_ptr = NULL;
gy_port_ptr = &gy_space.gy_port[index];
if(gy_port_ptr->used_flag)
{
pthread_mutex_lock(&sess_hash_mutx);
if(g_sess_hash != NULL)
g_hash_table_remove(g_sess_hash, gy_port_ptr->context_id);// delete hash index
pthread_mutex_unlock(&sess_hash_mutx);
CHECK_POSIX_DO( pthread_mutex_lock(&gy_port_lock), { ASSERT(0); } );
gy_port_init(gy_port_ptr, index);
gy_space.used_ports --;
CHECK_POSIX_DO( pthread_mutex_unlock(&gy_port_lock), { ASSERT(0); } );
}
if(0)
{
char tmp_info[1024];
sprintf(tmp_info, " [fd=%04d][app=%04d], ts=%ld.%03ld, %s, used_ports=%d\r\n",
index, gy_space.gy_port[index].app_port,ts_sec, ts_msec,
__FUNCTION__,
gy_space.used_ports);
pps_debug_info("diameter", tmp_info);
}
}
return 1;
}
_gy_port *gy_get_port_space(unsigned short index)
{
if(index<MAX_GY_PORT)
{
if(gy_space.gy_port[index].used_flag)
{
return &gy_space.gy_port[index];
}
}
return NULL;
}
_gy_port *gy_get_port_by_cxt_id(char *cxt_id)
{
_gy_port *gy_port_ptr = NULL;
pthread_mutex_lock(&sess_hash_mutx);
gy_port_ptr = g_hash_table_lookup(g_sess_hash, cxt_id);
pthread_mutex_unlock(&sess_hash_mutx);
return gy_port_ptr;
}
/*---------------------------------*/
int gx_send_ccr(struct gx_sm_t **gx_sm , struct dict_object *cmd_r ) ;
void gx_sig_hdlr(void);
int gx_send_ccr_real(struct gx_sm_t **sm , struct dict_object *cmd_r, _gy_msg *msg_ptr) ;
int gx_stat_increase_recv_cca(int type);
int gx_stat_increase_send_cca(int type);
int gx_stat_increase_recv_ccr(int type);
int gx_stat_increase_send_ccr(int type);
int time_t_to_diameter_timestamp(char *strTime);
void *gx_sm_th(void *sm);
int app_gx_entry(char * conffile)
{
{
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Request", &ccr_cmd, ENOENT));
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Answer", &cca_cmd, ENOENT));
}
// Do registeration and init stuff
{
LOG_D("Initializing dispatch callbacks for Gx interface");
if(ta_conf->mode & MODE_SERV )
{
struct disp_when data;
memset(&data, 0, sizeof(data));
data.app = g_dict_dcca;
data.command = ccr_cmd;
/* Now specific handler for CCR-CMD */
CHECK_FCT( fd_disp_register( gx_rec_ccr, DISP_HOW_CC, &data, NULL, &ccr_cb_hdl ) );
LOG_D("fj app_gx_entry register gx_rec_ccr");
}
#ifdef REAUTH
CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Re-Auth-Request", &reauth_cmd, ENOENT));
memset(&data, 0, sizeof(data));
data.app = g_dict_dcca;
data.command = reauth_cmd;
printf("register REAUTH\n");
CHECK_FCT( fd_disp_register( reauth_cb, DISP_HOW_CC, &data, NULL, &reauth_cb_hdl ) );
#endif
}
SEARCH_AVP_("Session-Id", 0, &session_id);
SEARCH_AVP_("Origin-Host", 0, &origin_host);
SEARCH_AVP_("Origin-Realm", 0, &origin_realm);
SEARCH_AVP_("Destination-Host", 0, &dest_host);
SEARCH_AVP_("Destination-Realm", 0, &dest_realm);
SEARCH_AVP_("Auth-Application-Id", 0, &auth_app_id);
SEARCH_AVP_("Service-Context-Id", 0, &service_cxt_id);
SEARCH_AVP_("CC-Request-Type", 0, &cc_req_type);
SEARCH_AVP_("Termination-Cause", 0, &term_cause);
SEARCH_AVP_("CC-Request-Number", 0, &cc_req_num);
SEARCH_AVP_("Requested-Action", 0, &requested_action);
SEARCH_AVP_("Result-Code", 0, &result_code);
SEARCH_AVP_("Check-Balance-Result", 0, &check_balance_result);
/* fj added 20160802 */
SEARCH_AVP_("Event-Timestamp", 0, &event_timestamp);
SEARCH_AVP_("Subscription-Id", 0, &subscription_id);
SEARCH_AVP_("Service-Information", 10415, &service_information);
SEARCH_AVP_("IMS-Information", 10415, &ims_information);
SEARCH_AVP_("SMS-Information", 10415, &sms_information);
SEARCH_AVP_("Time-Stamps", 10415, &time_stamps);
SEARCH_AVP_("PS-Information", 10415, &ps_information);
SEARCH_AVP_("Service-Identifier", 0, &service_identifier);
SEARCH_AVP_("Rating-Group", 0, &rating_group);
SEARCH_AVP_("Multiple-Services-Indicator", 0, &multiple_services_indicator);
SEARCH_AVP_("Multiple-Services-Credit-Control", 0, &multiple_services_credit_control);
SEARCH_AVP_("Requested-Service-Unit", 0, &requested_service_unit);
CHECK_FCT(fd_sess_handler_create( &g_hdlr, (void *)free, NULL, NULL));
CHECK_FCT( fd_fifo_new(&g_gx_sm.events, 0));
CHECK_FCT( fd_disp_app_support( g_dict_dcca, NULL, 1 , 0));
CHECK_FCT( fd_event_trig_regcb(SIGUSR1, "app_gx", gx_sig_hdlr ) );
out:
LOG_D("Extension 'Gx' initialized");
return 0;
}
void * gx_sm_th(void *sm)
{
struct gx_sm_t *gx_sm = (struct gx_sm_t *) sm;
struct timespec tout;
int evt_code;
CHECK_SYS_DO( clock_gettime( CLOCK_REALTIME, &tout), goto out);
tout.tv_sec =+ 60 ;
while(1)
{
fd_event_timedget(gx_sm->events, &tout , ETIMEDOUT, &evt_code, NULL, NULL );
CHECK_SYS_DO( clock_gettime( CLOCK_REALTIME, &tout), goto out);
printf("in tout sec %d\n", (int)tout.tv_sec);
if(evt_code == ETIMEDOUT)
{
gx_send_ccr(&gx_sm, ccr_cmd);
gx_sm->req_num++ ;
gx_sm->state = STATE_INTERMEDIATE;
CHECK_SYS_DO( clock_gettime( CLOCK_REALTIME, &tout), goto out);
tout.tv_sec += 30 ;
}
// printf("press enter\n");
// getchar();
}
out:
return NULL;
}
//TBD
int init_gx_sm(struct gx_sm_t *sm)
{
int i;
sm->state = STATE_INIT;
sm->tid = 0;//
sm->events = NULL;
// pthread_mutex_t p_sm_mtx;
sm->req_num = 0;
sm->sess = NULL;
for(i=0; i<MAX_GY_PORT; i++)
gy_sess[i] = NULL;
return 0;
}
int free_gx_sm(struct gx_sm_t *sm)
{
free(sm);
return 1;
}
int fd_get_session_id(char *src_buf, char *dst_buf, int flag)
{
//int len;
//second_off = strchr(first_off+1, ';');
//third_off = strchr(second_off+1, ';');
//len = third_off - second_off -1;
//if(flag == 0)
/*if(0)
{
memcpy(dst_buf, second_off+1, len);
dst_buf[len] = '\0';
}*/
if(1)
{
char *first_off;//, *second_off, *third_off;
first_off = strchr(src_buf, ';');
strcpy(dst_buf, first_off+1);
}
return 1;
}
int fd_update_cxt_id(int gy_port, char *cxt_value)
{
_gy_port *gy_port_ptr = NULL;
if((gy_port <0) || (gy_port>=MAX_GY_PORT))
return 0;
gy_port_ptr = &gy_space.gy_port[gy_port];
if (gy_port_ptr->used_flag == 0)
{
return 0;
}
pthread_mutex_lock(&sess_hash_mutx);
g_hash_table_remove(g_sess_hash, gy_port_ptr->context_id);// delete hash index
pthread_mutex_unlock(&sess_hash_mutx);
strcpy(gy_port_ptr->context_id, cxt_value);
pthread_mutex_lock(&sess_hash_mutx);
//g_hash_table_insert(g_sess_hash, strdup(context_id), (gpointer)gy_port_ptr);
g_hash_table_insert(g_sess_hash, gy_port_ptr->context_id, (gpointer)gy_port_ptr);
pthread_mutex_unlock(&sess_hash_mutx);
return 1;
}
/*--------------------------------------------*/
struct gx_sm_t *gl_gx_sm = NULL;
void gx_sig_hdlr()
{
struct gx_sm_t *gx_sm = gl_gx_sm;
if( gx_sm)
{
// fd_sess_dump( 0 , g_gx_sm.sess);
}
else
{
if( NULL != (gx_sm= (struct gx_sm_t *)malloc(sizeof(struct gx_sm_t)) ) )
{
init_gx_sm(gx_sm);
}
gl_gx_sm = gx_sm;
}
gx_send_ccr( &gx_sm, ccr_cmd);
return;
}
int gx_sig_hdlr_app(_gy_msg *msg_ptr)
{
struct gx_sm_t *gx_sm = gl_gx_sm;
if( gx_sm)
{
// fd_sess_dump( 0 , g_gx_sm.sess);
}
else
{
if( NULL != (gx_sm= (struct gx_sm_t *)malloc(sizeof(struct gx_sm_t)) ) )
{
init_gx_sm(gx_sm);
}
gl_gx_sm = gx_sm;
}
return gx_send_ccr_real( &gx_sm, ccr_cmd, msg_ptr);
}
/* Search a given AVP model in an AVP (extracted from libfreediameter/message.c ) */
int fd_avp_search_avp ( struct avp * groupedavp, struct dict_object * what, struct avp ** avp )
{
struct avp * nextavp;
struct avp_hdr * nextavphdr;
struct dict_avp_data dictdata;
TRACE_ENTRY("%p %p %p", groupedavp, what, avp);
CHECK_FCT( fd_dict_getval(what, &dictdata) );
// Loop only in the group AVP
CHECK_FCT( fd_msg_browse(groupedavp, MSG_BRW_FIRST_CHILD, (void *)&nextavp, NULL) );
CHECK_FCT( fd_msg_avp_hdr( nextavp, &nextavphdr ) );
while (nextavphdr)
{
if ( (nextavphdr->avp_code == dictdata.avp_code) && (nextavphdr->avp_vendor == dictdata.avp_vendor) ) // always 0 if no Vendor flag
{
break;
}
// Otherwise move to next AVP in the grouped AVP
CHECK_FCT( fd_msg_browse(nextavp, MSG_BRW_NEXT, (void *)&nextavp, NULL) );
if(nextavp!=NULL)
{
CHECK_FCT( fd_msg_avp_hdr( nextavp, &nextavphdr ) );
}
else
nextavphdr=NULL;
}
if (avp)
*avp = nextavp;
if (avp && nextavp)
{
struct dictionary * dict;
CHECK_FCT( fd_dict_getdict( what, &dict) );
CHECK_FCT_DO( fd_msg_parse_dict( nextavp, dict, NULL ), );
}
if (avp || nextavp)
return 0;
else
return ENOENT;
}
static int dcca_ans_from_req( struct dict_object * obj, struct msg *qry, struct msg **msg)
{
struct avp *avp = NULL;
struct avp_hdr * avpdata;
int rc = -1;
CHECK_FCT(fd_msg_search_avp( qry, obj, &avp));
CHECK_FCT(fd_msg_avp_hdr(avp, &avpdata));
avp = NULL;
CHECK_FCT_DO( fd_msg_avp_new ( obj, 0, &avp ), goto out );
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, avpdata->avp_value ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( *msg, MSG_BRW_LAST_CHILD, avp ), goto out );
rc = 0;
out:
return rc;
}
static int gx_parse_cca( struct msg ** msg)
{
struct msg* cca_msg = *msg;
struct avp *avp, *grpavp = NULL, *grpavp_sub1 = NULL;
struct avp_hdr *avphdr;
char tmp_buf[1024], session_id_str[128];
_gy_port *gy_port_ptr = NULL;
_gy_msg gy_msg;
_gy_cca *cca_ptr = NULL;
LOG_N("fj Parse CCA enter");
memset(&gy_msg, 0x00, sizeof(_gy_msg));
memset(session_id_str, 0x00, 128);
cca_ptr = &gy_msg.msg_body.cca;
gy_msg.msg_type = GY_MSG_CCA;
/* Session-Id */
PARSE_AVP_STR(cca_msg, session_id, avp, avphdr, "Parse CCA Session-Id", avphdr->avp_value->os.data)
if (avphdr != NULL )
fd_get_session_id((char *)avphdr->avp_value->os.data, session_id_str, 0);
gy_port_ptr = gy_get_port_by_cxt_id(session_id_str);
if((gy_port_ptr == NULL) || (gy_port_ptr->used_flag == 0))
{
if (pps_debug_flag_for_fd())
{
sprintf(tmp_buf, "%s, can't find gy_port, cxt_id=%s\r\n",
__FUNCTION__, session_id_str);
pps_debug_info("diameter", tmp_buf);
}
return 0;
}
if (pps_debug_flag_for_fd())
{
sprintf(tmp_buf, "\r\n%s, gy_port=%d, app_port=%d, cxt_id=%s\r\n",
__FUNCTION__, gy_port_ptr->index, gy_port_ptr->app_port, session_id_str);
pps_debug_info("diameter", tmp_buf);
}
gy_msg.service_type = gy_port_ptr->service_type;
gy_msg.app_port = gy_port_ptr->app_port;
gy_msg.fd_port = gy_port_ptr->index;
/* Origin-Host */
PARSE_AVP_STR(cca_msg, origin_host, avp, avphdr, "Parse CCA Origin-Host", avphdr->avp_value->os.data)
/* Origin-Realm */
PARSE_AVP_STR(cca_msg, origin_realm, avp, avphdr, "Parse CCA Origin-Realm", avphdr->avp_value->os.data)
/*Destination-Host */
PARSE_AVP_STR(cca_msg, dest_host, avp, avphdr, "Parse CCA Destination-Host", avphdr->avp_value->os.data)
/* Destination-Realm */
PARSE_AVP_STR(cca_msg, dest_realm, avp, avphdr, "Parse CCA Destination-Realm", avphdr->avp_value->os.data)
/* Auth-Application-Id */
PARSE_AVP_U32(cca_msg, auth_app_id, avp, avphdr, "Parse CCA Auth-Application-Id", avphdr->avp_value->u32)
/* CC-Request-Type */
PARSE_AVP_U32(cca_msg, cc_req_type, avp, avphdr, "Parse CCA CC-Request-Type", avphdr->avp_value->u32)
if (avphdr != NULL )
gy_msg.request_type = avphdr->avp_value->u32;
/* CC-Request-Number */
PARSE_AVP_U32(cca_msg, cc_req_num, avp, avphdr, "Parse CCA CC-Request-Number", avphdr->avp_value->u32)
/* Result-Code */
PARSE_AVP_U32(cca_msg, result_code, avp, avphdr, "Parse CCA CC-Result-Code", avphdr->avp_value->u32)
if (avphdr != NULL )
cca_ptr->result = avphdr->avp_value->u32;
/* Multiple-Services-Credit-Control */
struct dict_object *multiple_services_credit_control = NULL;
SEARCH_AVP_("Multiple-Services-Credit-Control", 0, &multiple_services_credit_control);
CHECK_FCT( fd_msg_search_avp ( cca_msg, multiple_services_credit_control, &grpavp) );
if(grpavp != NULL)
{
LOG_N("fj Parse CCA Multiple-Services-Credit-Control");
/* Result-Code */
struct dict_object *result_code = NULL;
SEARCH_AVP_("Result-Code", 0, &result_code);
if(result_code != NULL)
{
PARSE_GRPAVP_U32(grpavp, result_code, avp, avphdr, "Parse CCA Result-Code", avphdr->avp_value->u32)
if (avphdr != NULL )
cca_ptr->result = avphdr->avp_value->u32;
}
/* Granted-Service-Unit */
struct dict_object *granted_service_unit = NULL;
SEARCH_AVP_("Granted-Service-Unit", 0, &granted_service_unit);
CHECK_FCT( fd_sh_avp_search_avp ( grpavp, granted_service_unit, &grpavp_sub1) );
if(grpavp_sub1 != NULL)
{
/* CC-Time */
struct dict_object *cc_time = NULL;
SEARCH_AVP_("CC-Time", 0, &cc_time);
PARSE_GRPAVP_U32(grpavp_sub1, cc_time, avp, avphdr, "Parse CCA CC-Time", avphdr->avp_value->u32)
if (avphdr != NULL )
cca_ptr->grant_value = avphdr->avp_value->u32;
}
cca_ptr->is_final = 0;
struct dict_object *final_unit_indication = NULL;
SEARCH_AVP_("Final-Unit-Indication", 0, &final_unit_indication);
CHECK_FCT( fd_sh_avp_search_avp ( grpavp, final_unit_indication, &grpavp_sub1) );
if(grpavp_sub1 != NULL)
{
/* Final-Unit-Action */
struct dict_object *final_unit_action= NULL;
SEARCH_AVP_("Final-Unit-Action", 0, &final_unit_action);
PARSE_GRPAVP_U32(grpavp_sub1, final_unit_action, avp, avphdr, "Parse CCA Final-Unit-Action", avphdr->avp_value->u32)
if (avphdr != NULL )
cca_ptr->is_final = 1;
}
/*
struct dict_object *final_unit_indication = NULL;
SEARCH_AVP_("Final-Unit-Indication", 0, &final_unit_indication);
if(final_unit_indication != NULL)
{
PARSE_GRPAVP_U32(grpavp, final_unit_indication, avp, avphdr, "Parse CCA Final-Unit-Indication", avphdr->avp_value->u32)
cca_ptr->is_final = avphdr->avp_value->u32;
if(cca_ptr->is_final>1)
cca_ptr->is_final = 0;
}
*/
}
//pps_recv_gy_process(&gy_msg);
pps_ro_gy_cb(&gy_msg);
/*pthread_mutex_lock( &gy_msg_mtx );
gx_add_msg_to_list(&gy_msg);
pthread_mutex_unlock( &gy_msg_mtx );*/
gx_stat_increase_recv_cca(gy_msg.request_type);
if(gy_msg.request_type == RT_TERMINATE_REQUEST ||
gy_msg.request_type == RT_EVENT_REQUEST ||
(cca_ptr->result != 2001 && gy_msg.request_type != RT_UPDATE_REQUEST))
{
unsigned int gy_port;
gy_port = gy_port_ptr->index;
if(gy_port < MAX_GY_PORT)
{
gy_release_port(gy_port);
if(gy_sess[gy_port] != NULL)
fd_sess_destroy(&gy_sess[gy_port]);
}
}
out:
LOG_N("fj Parse CCA exit");
return 0;
}
static int gx_parse_ccr( struct msg ** msg, struct gy_msg *gy_ptr)
{
struct msg* ccr_msg = *msg;
struct avp *avp, *groupedavp=NULL, *groupedavp_sub=NULL, *groupedavp_sub_sub=NULL;
struct avp_hdr *avphdr;
struct gy_ccr *gy_ccr = NULL;
int len;
// struct dict_object *dict_obj_tmp = NULL;
LOG_N("fj Parse CCR enter");
gy_ccr = &gy_ptr->msg_body.ccr;
/* Session-Id */
PARSE_AVP_STR(ccr_msg, session_id, avp, avphdr, "Parse CCR Session-Id", avphdr->avp_value->os.data)
{
//char padding[12]={";CCR_SESS"};
char sess_id[128];
//sprintf(sess_id, "%s%s",avphdr->avp_value->os.data, padding);
if (avphdr != NULL)
{
if (avphdr->avp_value->os.len >= 128)
{
avphdr->avp_value->os.len = 127;
}
memcpy(sess_id, avphdr->avp_value->os.data, avphdr->avp_value->os.len);
sess_id[avphdr->avp_value->os.len] = '\0';
//sprintf(sess_id, "%s",avphdr->avp_value->os.data);
//fd_get_session_id(sess_id, gy_ptr->cxt_id, 0);
strcpy(gy_ptr->cxt_id, sess_id);
}
}
/* Origin-Host */
PARSE_AVP_STR(ccr_msg, origin_host, avp, avphdr, "Parse CCR Origin-Host", avphdr->avp_value->os.data)
if (avphdr != NULL)
{
if (avphdr->avp_value->os.len >= GY_APN_LEN)
{
avphdr->avp_value->os.len = GY_APN_LEN-1;
}
memcpy(gy_ccr->apn, avphdr->avp_value->os.data, avphdr->avp_value->os.len);
gy_ccr->apn[avphdr->avp_value->os.len] = '\0';
}
/* Origin-Realm */
PARSE_AVP_STR(ccr_msg, origin_realm, avp, avphdr, "Parse CCR Origin-Realm", avphdr->avp_value->os.data)
/*Destination-Host */
PARSE_AVP_STR(ccr_msg, dest_host, avp, avphdr, "Parse CCR Destination-Host", avphdr->avp_value->os.data)
/* Destination-Realm */
PARSE_AVP_STR(ccr_msg, dest_realm, avp, avphdr, "Parse CCR Destination-Realm", avphdr->avp_value->os.data)
/* Auth-Application-Id */
PARSE_AVP_U32(ccr_msg, auth_app_id, avp, avphdr, "Parse CCR Auth-Application-Id", avphdr->avp_value->u32)
/* Service-Context-Id */
PARSE_AVP_STR(ccr_msg, service_cxt_id, avp, avphdr, "Parse CCR Service-Context-Id", avphdr->avp_value->os.data)
/* CC-Request-Type */
PARSE_AVP_U32(ccr_msg, cc_req_type, avp, avphdr, "Parse CCR CC-Request-Type", avphdr->avp_value->u32)
if (avphdr != NULL)
{
gy_ptr->request_type = avphdr->avp_value->u32;
}
/* Requested-Action */
PARSE_AVP_U32(ccr_msg, requested_action, avp, avphdr, "Parse CCR Requested-Action", avphdr->avp_value->u32)
if (avphdr != NULL)
{
gy_ptr->msg_body.ccr.request_action = avphdr->avp_value->u32;
}
/* CC-Request-Number */
PARSE_AVP_U32(ccr_msg, cc_req_num, avp, avphdr, "Parse CCR CC-Request-Number", avphdr->avp_value->u32)
if (avphdr != NULL)
{
gy_ptr->request_number = avphdr->avp_value->u32;
}
/* Requested-Service-Unit */
CHECK_FCT( fd_msg_search_avp ( ccr_msg, requested_service_unit, &groupedavp) );
if(groupedavp != NULL)
{
LOG_N("fj Parse CCR Requested-Service-Unit");
/* CC-Money */
struct dict_object *cc_money = NULL;
SEARCH_AVP_("CC-Money", 0, &cc_money);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp, cc_money, &groupedavp_sub) );
if(groupedavp_sub != NULL)
{
/* Unit-Value */
struct dict_object *unit_value = NULL;
SEARCH_AVP_("Unit-Value", 0, &unit_value);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp_sub, unit_value, &groupedavp_sub_sub));
if(groupedavp_sub_sub != NULL)
{
/* Value-Digits */
struct dict_object *value_digits = NULL;
SEARCH_AVP_("Value-Digits", 0, &value_digits);
avphdr = NULL;
PARSE_GRPAVP_U64(groupedavp_sub_sub, value_digits, avp, avphdr, "Parse CCR value-digits", avphdr->avp_value->u64)
if (avphdr != NULL)
{
gy_ptr->msg_body.ccr.req_service_unit = avphdr->avp_value->u64;
}
/* Exponent */
struct dict_object *exponent = NULL;
SEARCH_AVP_("Exponent", 0, &exponent);
avphdr = NULL;
PARSE_GRPAVP_U32(groupedavp_sub_sub, exponent, avp, avphdr, "Parse CCR Exponent", avphdr->avp_value->i32)
if ((avphdr != NULL) && (avphdr->avp_value->i32 != 0))
{
gy_ptr->msg_body.ccr.req_service_unit *= pow(10, avphdr->avp_value->i32);
}
}
}
}
/* Event-Timestamp */
PARSE_AVP_STR(ccr_msg, event_timestamp, avp, avphdr, "Parse CCR Event-Timestamp", avphdr->avp_value->os.data)
/* Subscription-Id */
CHECK_FCT( fd_msg_search_avp ( ccr_msg, subscription_id, &groupedavp) );
if(groupedavp != NULL)
{
LOG_N("fj Parse CCR Subscription-Id");
/* Subscription-Id-Type */
SEARCH_AVP_("Subscription-Id-Type", 0, &subscription_id_type);
PARSE_GRPAVP_U32(groupedavp, subscription_id_type, avp, avphdr, "Parse CCR Subscription-Id-Type", avphdr->avp_value->u32)
/* Subscription-Id-Data */
SEARCH_AVP_("Subscription-Id-Data", 0, &subscription_id_data);
PARSE_GRPAVP_STR(groupedavp, subscription_id_data, avp, avphdr, "Parse CCR Subscription-Id-Data", avphdr->avp_value->os.data)
if(avphdr != NULL )
{
if(avphdr->avp_value != NULL)
{
if(avphdr->avp_value->os.data != NULL)
{
if(strlen((char *)avphdr->avp_value->os.data) >= NUMBER_LEN)
{
memcpy(gy_ccr->caller, avphdr->avp_value->os.data, NUMBER_LEN - 1);
gy_ccr->caller[NUMBER_LEN-1] = '\0';
}
else
strcpy(gy_ccr->caller, (char *)avphdr->avp_value->os.data);
}
}
}
}
gy_ptr->service_type = ST_PS_DATA;
/* Service-Information */
CHECK_FCT( fd_msg_search_avp ( ccr_msg, service_information, &groupedavp) );
if(groupedavp != NULL)
{
LOG_N("fj Parse CCR Service-Information");
/* Value-Digits */
/*struct dict_object *value_digits = NULL;
SEARCH_AVP_("Value-Digits", 0, &value_digits);
avphdr = NULL;
PARSE_GRPAVP_U64(groupedavp, value_digits, avp, avphdr, "Parse CCR value_digits", avphdr->avp_value->u64)
if (avphdr != NULL)
{
gy_ptr->msg_body.ccr.balance_to_check = avphdr->avp_value->u64;
}*/
/* IMS-Information */
SEARCH_AVP_("IMS-Information", 10415, &ims_information);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp, ims_information, &groupedavp_sub) );
if(groupedavp_sub == NULL)
{
gy_ptr->service_type = ST_PS_DATA;
/* PS-Information */
SEARCH_AVP_("PS-Information", 10415, &ps_information);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp, ps_information, &groupedavp_sub) );
if(groupedavp_sub != NULL)
{
gy_ptr->service_type = ST_PS_DATA;
/* SGSN-Address */
struct dict_object *sgsn_address = NULL;
SEARCH_AVP_("SGSN-Address", 10415, &sgsn_address);
PARSE_GRPAVP_STR(groupedavp_sub, sgsn_address, avp, avphdr, "Parse CCR SGSN-Address", avphdr->avp_value->os.data)
if(avphdr != NULL )
{
if(avphdr->avp_value != NULL)
{
if(avphdr->avp_value->os.data != NULL)
{
memcpy(&gy_ptr->msg_body.ccr.sgsn_ip, &avphdr->avp_value->os.data[2], 4);
}
}
}
/* GGSN-Address */
struct dict_object *ggsn_address = NULL;
SEARCH_AVP_("GGSN-Address", 10415, &ggsn_address);
PARSE_GRPAVP_U32(groupedavp_sub, ggsn_address, avp, avphdr, "Parse CCR GGSN-Address", avphdr->avp_value->u32)
if(avphdr != NULL )
{
if(avphdr->avp_value != NULL)
{
if(avphdr->avp_value->os.data != NULL)
{
memcpy(&gy_ptr->msg_body.ccr.ggsn_ip, &avphdr->avp_value->os.data[2], 4);
}
}
}
}
else
{
/* SMS-Information */
SEARCH_AVP_("SMS-Information", 10415, &sms_information);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp, sms_information, &groupedavp_sub) );
if(groupedavp_sub != NULL)
{
gy_ptr->service_type = ST_CS_SMS;
/* Recipient-Info */
struct dict_object *recipient_info = NULL;
SEARCH_AVP_("Recipient-Info", 10415, &recipient_info);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp_sub, recipient_info, &groupedavp_sub_sub) );
if (groupedavp_sub_sub != NULL)
{
/* Recipient-Address */
struct avp *grp_sub = NULL;
struct dict_object *recipient_addr = NULL;
SEARCH_AVP_("Recipient-Address", 10415, &recipient_addr);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp_sub_sub, recipient_addr, &grp_sub) );
if (grp_sub != NULL)
{
/* Address-Data */
struct dict_object *address_data = NULL;
SEARCH_AVP_("Address-Data", 10415, &address_data);
avphdr = NULL;
PARSE_GRPAVP_STR(grp_sub, address_data, avp, avphdr, "Parse CCR Address-Data", avphdr->avp_value->os.data)
if(avphdr != NULL )
{
if(avphdr->avp_value != NULL)
{
if(avphdr->avp_value->os.data != NULL)
{
int len = avphdr->avp_value->os.len;
if (len >= NUMBER_LEN)
{
len = NUMBER_LEN-1;
}
memcpy(&gy_ccr->called, &avphdr->avp_value->os.data[0], len);
gy_ccr->called[len] = '\0';
}
}
}
}
}
/* Number-of-Messages-Sent */
struct dict_object *num_msg_sent = NULL;
SEARCH_AVP_("Number-Of-Messages-Sent", 10415, &num_msg_sent);
avphdr = NULL;
PARSE_GRPAVP_U32(groupedavp_sub, num_msg_sent, avp, avphdr, "Parse CCR Number-Of-Messages-Sent", avphdr->avp_value->u32)
if((avphdr != NULL) && (avphdr->avp_value != NULL))
{
gy_ccr->sent_msg_num = avphdr->avp_value->u32;
}
/* SMSC-Address */
struct dict_object *smsc_address = NULL;
SEARCH_AVP_("SMSC-Address", 10415, &smsc_address);
avphdr = NULL;
PARSE_GRPAVP_STR(groupedavp_sub, smsc_address, avp, avphdr, "Parse CCR SMSC-Address", avphdr->avp_value->os.data)
if(avphdr != NULL )
{
if(avphdr->avp_value != NULL)
{
if((avphdr->avp_value->os.data != NULL) && (avphdr->avp_value->os.len > 2))
{
int len = avphdr->avp_value->os.len - 2;
if (len >= NUMBER_LEN)
{
len = NUMBER_LEN-1;
}
memcpy(&gy_ccr->smsc, &avphdr->avp_value->os.data[2], len);
gy_ccr->smsc[len] = '\0';
}
}
}
}
}
}
else if(groupedavp_sub != NULL)
{
gy_ptr->service_type = ST_CS_VOICE;
/* Node-Functionality */
struct dict_object *node_functionality = NULL;
SEARCH_AVP_("Node-Functionality", 10415, &node_functionality);
PARSE_GRPAVP_U32(groupedavp_sub, node_functionality, avp, avphdr, "Parse CCR Node-Functionality", avphdr->avp_value->u32)
/* Event-Type */
struct dict_object *event_type = NULL;
SEARCH_AVP_("Event-Type", 10415, &event_type);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp_sub, event_type, &groupedavp_sub_sub) );
if(groupedavp_sub_sub != NULL)
{
/* SIP-Method */
struct dict_object *sip_method = NULL;
SEARCH_AVP_("SIP-Method", 10415, &sip_method);
PARSE_GRPAVP_STR(groupedavp_sub_sub, sip_method, avp, avphdr, "Parse CCR Parse CCR SIP-Method", avphdr->avp_value->os.data)
}
/* Role-of-Node */
struct dict_object *role_of_node = NULL;
SEARCH_AVP_("Role-of-Node", 10415, &role_of_node);
PARSE_GRPAVP_U32(groupedavp_sub, role_of_node, avp, avphdr, "Parse CCR Role-of-Node", avphdr->avp_value->u32)
if (avphdr != NULL)
{
gy_ptr->msg_body.ccr.role_of_node = avphdr->avp_value->u32;
}
/* User-Session-Id */
struct dict_object *user_session_id = NULL;
SEARCH_AVP_("User-Session-Id", 10415, &user_session_id);
PARSE_GRPAVP_STR(groupedavp_sub, user_session_id, avp, avphdr, "Parse CCR User-Session-Id", avphdr->avp_value->os.data)
/* Time-Stamps */
struct dict_object *time_stamps = NULL;
SEARCH_AVP_("Time-Stamps", 10415, &time_stamps);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp_sub, time_stamps, &groupedavp_sub_sub) );
if(groupedavp_sub_sub != NULL)
{
/* SIP-Request-Timestamp */
struct dict_object *sip_request_timestamp = NULL;
SEARCH_AVP_("SIP-Request-Timestamp", 10415, &sip_request_timestamp);
PARSE_GRPAVP_STR(groupedavp_sub_sub, sip_request_timestamp, avp, avphdr, "Parse CCR SIP-Request-Timestamp", avphdr->avp_value->os.data)
/*SIP-Response-Timestamp */
struct dict_object *sip_response_timestamp = NULL;
SEARCH_AVP_("SIP-Response-Timestamp", 10415, &sip_response_timestamp);
PARSE_GRPAVP_STR(groupedavp_sub_sub, sip_response_timestamp, avp, avphdr, "Parse CCR SIP-Response-Timestamp", avphdr->avp_value->os.data)
}
/*Inter-Operator-Identifier */
struct dict_object *inter_operator_identifier = NULL;
SEARCH_AVP_("Inter-Operator-Identifier", 10415, &inter_operator_identifier);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp_sub, inter_operator_identifier, &groupedavp_sub_sub) );
if(groupedavp_sub_sub != NULL)
{
/* Originating-IOI */
struct dict_object *originating_ioi = NULL;
SEARCH_AVP_("Originating-IOI", 10415, &originating_ioi);
PARSE_GRPAVP_STR(groupedavp_sub_sub, originating_ioi, avp, avphdr, "Parse CCR Originating-IOI", avphdr->avp_value->os.data)
/* Terminating-IOI */
struct dict_object *terminating_ioi = NULL;
SEARCH_AVP_("Terminating-IOI", 10415, &terminating_ioi);
PARSE_GRPAVP_STR(groupedavp_sub_sub, terminating_ioi, avp, avphdr, "Parse CCR Terminating-IOI", avphdr->avp_value->os.data)
}
/* IMS-Charging-Identifier */
struct dict_object *ims_charging_dentifier = NULL;
SEARCH_AVP_("IMS-Charging-Identifier", 10415, &ims_charging_dentifier);
PARSE_GRPAVP_STR(groupedavp_sub, ims_charging_dentifier, avp, avphdr, "Parse CCR IMS-Charging-Identifier", NULL/*avphdr->avp_value->os.data*/)
/* SDP-Session-Description */
struct dict_object *sdp_session_description = NULL;
SEARCH_AVP_("SDP-Session-Description", 10415, &sdp_session_description);
PARSE_GRPAVP_STR(groupedavp_sub, sdp_session_description, avp, avphdr, "Parse CCR SDP-Session-Description", NULL/*avphdr->avp_value->os.data*/)
/* SDP-Media-Component */
struct dict_object *sdp_media_component = NULL;
SEARCH_AVP_("SDP-Media-Component", 10415, &sdp_media_component);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp_sub, sdp_media_component, &groupedavp_sub_sub) );
if(groupedavp_sub_sub != NULL)
{
/* SDP-Media-Name */
struct dict_object *sdp_media_name = NULL;
SEARCH_AVP_("SDP-Media-Name", 10415, &sdp_media_name);
PARSE_GRPAVP_STR(groupedavp_sub_sub, sdp_media_name, avp, avphdr, "Parse CCR SDP-Media-Name", NULL/*avphdr->avp_value->os.data*/)
/* SDP-Media-Description */
struct dict_object *sdp_media_description = NULL;
SEARCH_AVP_("SDP-Media-Description", 10415, &sdp_media_description);
PARSE_GRPAVP_STR(groupedavp_sub_sub, sdp_media_description, avp, avphdr, "Parse CCR SDP-Media-Description", NULL/*avphdr->avp_value->os.data*/)
}
/* Message-Body */
struct dict_object *message_body = NULL;
SEARCH_AVP_("Message-Body", 10415, &message_body);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp_sub, message_body, &groupedavp_sub_sub) );
if(groupedavp_sub_sub != NULL)
{
/* Content-Type */
struct dict_object *content_type = NULL;
SEARCH_AVP_("Content-Type", 10415, &content_type);
PARSE_GRPAVP_STR(groupedavp_sub_sub, content_type, avp, avphdr, "Parse CCR Content-Type", NULL/*avphdr->avp_value->os.data*/)
/* Content-Length */
struct dict_object *content_length = NULL;
SEARCH_AVP_("Content-Length", 10415, &content_length);
PARSE_GRPAVP_U32(groupedavp_sub_sub, content_length, avp, avphdr, "Parse CCR Content-Length", avphdr->avp_value->u32)
}
/* Access-Network-Information */
struct dict_object *access_network_information = NULL;
SEARCH_AVP_("Access-Network-Information", 10415, &access_network_information);
PARSE_GRPAVP_STR(groupedavp_sub, access_network_information, avp, avphdr, "Parse CCR Access-Network-Information", NULL/*avphdr->avp_value->os.data*/)
/* Calling-Party-Address */
struct dict_object *calling_party_address = NULL;
SEARCH_AVP_("Calling-Party-Address", 10415, &calling_party_address);
PARSE_GRPAVP_STR(groupedavp_sub, calling_party_address, avp, avphdr, "Parse CCR Calling-Party-Address", NULL/*avphdr->avp_value->os.data*/)
if (avphdr != NULL && avphdr->avp_value != NULL)
{
if( avphdr->avp_value->os.data != NULL)
{
len = strlen((char *)avphdr->avp_value->os.data);
if(len>NUMBER_LEN) len = NUMBER_LEN;
memcpy(gy_ccr->caller, avphdr->avp_value->os.data, len);
}
}
/* Called-Party-Address */
struct dict_object *called_party_address = NULL;
SEARCH_AVP_("Called-Party-Address", 10415, &called_party_address);
PARSE_GRPAVP_STR(groupedavp_sub, called_party_address, avp, avphdr, "Parse CCR Called-Party-Address", avphdr->avp_value->os.data)
if (avphdr != NULL && avphdr->avp_value != NULL)
{
if(avphdr->avp_value->os.data != NULL)
{
len = strlen((char *)avphdr->avp_value->os.data);
if(len>NUMBER_LEN) len = NUMBER_LEN;
memcpy(gy_ccr->called, avphdr->avp_value->os.data, len);
gy_ptr->service_type = ST_CS_VOICE;
}
}
/* Requested-Party-Address */
struct dict_object *requested_party_address = NULL;
SEARCH_AVP_("Requested-Party-Address", 10415, &requested_party_address);
PARSE_GRPAVP_STR(groupedavp_sub, requested_party_address, avp, avphdr, "Parse CCR Requested-Party-Address", avphdr->avp_value->os.data)
/* huawei_avp_20820 */
struct dict_object *huawei_avp_20820 = NULL;
SEARCH_AVP_("huawei_avp_20820", 2011, &huawei_avp_20820);
PARSE_GRPAVP_U32(groupedavp_sub, huawei_avp_20820, avp, avphdr, "Parse CCR huawei_avp_20820", avphdr->avp_value->u32)
/* Subscription-Id-Type */
PARSE_GRPAVP_U32(groupedavp_sub, subscription_id_type, avp, avphdr, "Parse CCR Subscription-Id-Type", avphdr->avp_value->u32)
/* IMS-Information */
PARSE_GRPAVP_STR(groupedavp_sub, subscription_id_data, avp, avphdr, "Parse CCR Parse CCR IMS-Information", avphdr->avp_value->os.data)
// if(strlen(avphdr->avp_value->os.data))
// strcpy(gy_ccr->caller, avphdr->avp_value->os.data);
}
}
/* Service-Identifier */
PARSE_AVP_U32(ccr_msg, service_identifier, avp, avphdr, "Parse CCR Service-Identifier", avphdr->avp_value->u32)
/* Multiple-Services-Indicator */
PARSE_AVP_U32(ccr_msg, multiple_services_indicator, avp, avphdr, "Parse CCR Multiple-Services-Indicator", avphdr->avp_value->u32)
/* Multiple-Services-Credit-Control */
//gy_ptr->msg_body.ccr.mscc_presented = 0;
struct dict_object *multiple_services_credit_control = NULL;
SEARCH_AVP_("Multiple-Services-Credit-Control", 0, &multiple_services_credit_control);
CHECK_FCT( fd_msg_search_avp ( ccr_msg, multiple_services_credit_control, &groupedavp) );
gy_ptr->rating_group = 100;// init to 100(huawei PNCC)
gy_ptr->service_identifier = -1;// init to -1(invalid, huawei PNCC)
gy_ptr->msg_body.ccr.reporting_reason = -1;// init to -1
if(groupedavp != NULL)
{
LOG_N("fj Parse CCR Multiple-Services-Credit-Control");
//gy_ptr->msg_body.ccr.mscc_presented = 1;
/* Requested-Service-Unit */
struct dict_object *requested_service_unit = NULL;
SEARCH_AVP_("Requested-Service-Unit", 0, &requested_service_unit);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp, requested_service_unit, &groupedavp_sub) );
if(groupedavp_sub != NULL)
{
/* CC-Time */
/*struct dict_object *cc_time = NULL;
SEARCH_AVP_("CC-Time", 0, &cc_time);
PARSE_GRPAVP_U32(groupedavp_sub, cc_time, avp, avphdr, "Parse CCR CC-Time", avphdr->avp_value->u32)*/
}
/* Used-Service-Unit */
struct dict_object *used_service_unit = NULL;
SEARCH_AVP_("Used-Service-Unit", 0, &used_service_unit);
CHECK_FCT( fd_sh_avp_search_avp ( groupedavp, used_service_unit, &groupedavp_sub) );
if(groupedavp_sub != NULL)
{
if(gy_ptr->service_type == ST_CS_VOICE)
{
/* CC-Time */
struct dict_object *cc_time = NULL;
SEARCH_AVP_("CC-Time", 0, &cc_time);
PARSE_GRPAVP_U32(groupedavp_sub, cc_time, avp, avphdr, "Parse CCR CC-Time", avphdr->avp_value->u32)
if (avphdr != NULL)
{
gy_ptr->msg_body.ccr.used_unit = avphdr->avp_value->u32;
}
}
else if(gy_ptr->service_type == ST_PS_DATA)
{
/* CC-Total-Octets */
struct dict_object *cc_total_octets = NULL;
SEARCH_AVP_("CC-Total-Octets", 0, &cc_total_octets);
PARSE_GRPAVP_U32(groupedavp_sub, cc_total_octets, avp, avphdr, "Parse CCR CC-Total-Octets", avphdr->avp_value->u32)
if (avphdr != NULL)
{
gy_ptr->msg_body.ccr.used_unit = avphdr->avp_value->u32;
}
/* Reporting-Reason */
struct dict_object *reporting_reason = NULL;
avphdr = NULL;
SEARCH_AVP_("Reporting-Reason", 10415, &reporting_reason);
PARSE_GRPAVP_U32(groupedavp_sub, reporting_reason, avp, avphdr, "Parse CCR Reporting-Reason", avphdr->avp_value->u32)
if (avphdr != NULL)
{
gy_ptr->msg_body.ccr.reporting_reason = avphdr->avp_value->u32;
}
}
}
/* Service-Identifier */
struct dict_object *service_id = NULL;
avphdr = NULL;
SEARCH_AVP_("Service-Identifier", 0, &service_id);
PARSE_GRPAVP_U32(groupedavp, service_id, avp, avphdr, "Parse CCR Service-Identifier", avphdr->avp_value->u32)
if (avphdr != NULL)
{
gy_ptr->service_identifier = avphdr->avp_value->u32;
}
/* Rating-Group */
struct dict_object *rating_group = NULL;
avphdr = NULL;
SEARCH_AVP_("Rating-Group", 0, &rating_group);
PARSE_GRPAVP_U32(groupedavp, rating_group, avp, avphdr, "Parse CCR Rating-Group", avphdr->avp_value->u32)
if (avphdr != NULL)
{
gy_ptr->rating_group = avphdr->avp_value->u32;
}
/* Reporting-Reason */
struct dict_object *reporting_reason = NULL;
avphdr = NULL;
SEARCH_AVP_("Reporting-Reason", 10415, &reporting_reason);
PARSE_GRPAVP_U32(groupedavp, reporting_reason, avp, avphdr, "Parse CCR Reporting-Reason", avphdr->avp_value->u32)
//if (avphdr != NULL)
//{
// gy_ptr->msg_body.ccr.reporting_reason = avphdr->avp_value->u32;
//}
}
// strcpy(gy_ptr->cxt_id, gy_ccr->caller);
out:
LOG_N("fj Parse CCR exit");
return 0;
}
struct msg *g_direct_cca_fail_msg_ptr = NULL;
struct msg *g_ccr_msg_ptr[MAX_GY_PORT+1];
struct msg *g_ccr_msg_ptr_ptr[MAX_GY_PORT+1];
int gx_send_cca_test()
{
struct msg *ans;
struct avp *avp = NULL;
struct avp *grpavp = NULL;
struct avp *grpavp_sub1 = NULL;
union avp_value val;
//struct dict_object *dict_obj_tmp = NULL;
ans = g_ccr_msg_ptr[0];
/* set application id */
{
struct msg_hdr * msg_hdr = NULL;
ASSERT( 0 == fd_msg_hdr ( ans, &msg_hdr ) );
msg_hdr->msg_appl = SH_APP_ID;
msg_hdr->msg_flags = msg_hdr->msg_flags & (~CMD_FLAG_PROXIABLE);
}
/* Set the Origin-Host, Origin-Realm, Result-Code AVPs */
CHECK_FCT_DO( fd_msg_rescode_set( ans, "DIAMETER_SUCCESS", NULL, NULL, 1 ), goto out );
/* Get the auth_app_id and from the reply and set it in the reply */
EN_AVP_U32(auth_app_id, 4, ans, "fj CCA Auth-Application-ID");
EN_AVP_U32(cc_req_type, 1, ans, "fj CCA cc_req_type");
EN_AVP_U32(cc_req_num, 0, ans, "fj CCA cc_req_num");
/* Multiple-Services-Credit-Control */
{
CHECK_FCT_DO( fd_msg_avp_new ( multiple_services_credit_control, 0, &grpavp ), goto out );
/* Result-Code */
struct dict_object *result_code = NULL;
EN_GRPAVP_U32("Result-Code", 0, result_code, 2001);
/* Granted-Service-Unit */
struct dict_object *granted_service_unit = NULL;
SEARCH_AVP_("Granted-Service-Unit", 0, &granted_service_unit);
{
CHECK_FCT_DO( fd_msg_avp_new ( granted_service_unit, 0, &grpavp_sub1 ), goto out );
EN_GRPAVP_U32_("CC-Time", 0, cc_time, 1/*granted_value*/, grpavp_sub1)
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out );
LOG_D("fj CCA Granted-Service-Unit Ok\n");
}
CHECK_FCT_DO( fd_msg_avp_add( ans, MSG_BRW_LAST_CHILD, grpavp ), goto out );
LOG_D("fj CCA Multiple-Services-Credit-Control Ok\n");
}
/* Send the answer */
CHECK_FCT_DO( fd_msg_send((struct msg **)(g_ccr_msg_ptr_ptr), NULL, NULL ), goto out );
out:
return 1;
}
int gx_send_cca(_gy_msg *gy_ptr)
{
//struct msg *req = NULL;
struct msg *ans;//, *qry;
struct avp *avp = NULL;
struct avp *grpavp = NULL;
struct avp *grpavp_sub1 = NULL;
union avp_value val;
//struct dict_object *dict_obj_tmp = NULL;
struct msg **pAnsPtr = NULL;
//int ret;
long granted_value = gy_ptr->msg_body.cca.grant_value;
int port = gy_ptr->fd_port;
_gy_port *gy_port = NULL;
long valid_time_len = 900;
gy_port = gy_get_port_space(port);
if(gy_port == NULL)
return 0;
gy_port->app_port = gy_ptr->app_port;
gy_port->updated_ts = ts_sec;
if (pps_debug_flag_for_fd())
{
char tmp_buf[256];
sprintf(tmp_buf, " [%04d] %s , app_port=%d, gy_port=%d",
port, __FUNCTION__, gy_ptr->app_port, gy_port->index);
pps_debug_info("diameter", tmp_buf);
}
gx_stat_increase_send_cca(gy_ptr->request_type);
ans = g_ccr_msg_ptr[port];
//memset(ans, 0x00, sizeof(ans));
// CHECK_FCT_DO( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, &ans, 0 ) , goto out);
/* set application id */
{
struct msg_hdr * msg_hdr = NULL;
ASSERT( 0 == fd_msg_hdr ( ans, &msg_hdr ) );
msg_hdr->msg_appl = SH_APP_ID;
msg_hdr->msg_flags = msg_hdr->msg_flags | (CMD_FLAG_PROXIABLE);
}
/* Set the Origin-Host, Origin-Realm, Result-Code AVPs */
if (gy_ptr->request_type == RT_EVENT_REQUEST)
{
EN_AVP_U32(result_code, gy_ptr->msg_body.cca.result, ans, "fj CCA Result-Code");
}
/*else if (gy_ptr->msg_body.ccr.mscc_presented==0)
{
int result = gy_ptr->msg_body.cca.result;
if (result < 2001)
{
result = 2001;
}
else if (resutl == 4012)
{
result = 4547;
}
else if (resutl != 2001)
{
result = 5012;
}
EN_AVP_U32(result_code, result, ans, "fj CCA Result-Code");
}*/
else
{
CHECK_FCT_DO( fd_msg_rescode_set( ans, "DIAMETER_SUCCESS", NULL, NULL, 1 ), goto out );
}
/* Get the auth_app_id and from the reply and set it in the reply */
EN_AVP_U32(auth_app_id, 4, ans, "fj CCA Auth-Application-ID");
EN_AVP_U32(cc_req_type, gy_ptr->request_type, ans, "fj CCA cc_req_type");
EN_AVP_U32(cc_req_num, gy_port->request_number++, ans, "fj CCA cc_req_num");
if (gy_ptr->request_type == RT_EVENT_REQUEST)
{
if ((gy_ptr->msg_body.ccr.request_action == RA_CHECK_BALANCE)\
&& (gy_ptr->msg_body.cca.result == 2001))// only support CHECK_BALANCE in event request
{
EN_AVP_U32(check_balance_result, gy_ptr->msg_body.cca.check_balance_result, ans, "fj CCA check_balance_result");
}
}
else// if (gy_ptr->msg_body.ccr.mscc_presented)
/* Multiple-Services-Credit-Control */
{
CHECK_FCT_DO( fd_msg_avp_new ( multiple_services_credit_control, 0, &grpavp ), goto out );
/* Result-Code */
struct dict_object *result_code = NULL;
if(gy_ptr->msg_body.cca.result < 2001)
gy_ptr->msg_body.cca.result = 2001;
EN_GRPAVP_U32("Result-Code", 0, result_code, gy_ptr->msg_body.cca.result);
if(gy_ptr->msg_body.cca.is_final && gy_ptr->msg_body.cca.result == 2001) //only successful result can contain this AVP
{
struct dict_object *final_unit_indication = NULL;
SEARCH_AVP_("Final-Unit-Indication", 0, &final_unit_indication);
{
CHECK_FCT_DO( fd_msg_avp_new ( final_unit_indication, 0, &grpavp_sub1 ), goto out );
EN_GRPAVP_U32_("Final-Unit-Action", 0, final_unit_action, 0, grpavp_sub1)// 0, fixed to terminate
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out );
LOG_D("fj CCA Final-Unit-Indication Ok\n");
}
}
struct dict_object *rate_group = NULL;
EN_GRPAVP_U32("Rating-Group", 0, rate_group, gy_ptr->rating_group); //fixed for COOK, should be the same as CCR
if(gy_ptr->service_identifier >= 0)// huawei has no si in CCR, and should not include si in CCA; iplook has si in CCR, and should include si in CCA.
{
struct dict_object *service_id = NULL;
EN_GRPAVP_U32("Service-Identifier", 0, service_id, gy_ptr->service_identifier);
}
struct dict_object *valid_time = NULL;
EN_GRPAVP_U32("Validity-Time", 0, valid_time, valid_time_len);
if (gy_ptr->request_type != RT_TERMINATE_REQUEST)
{
/* Granted-Service-Unit */
struct dict_object *granted_service_unit = NULL;
SEARCH_AVP_("Granted-Service-Unit", 0, &granted_service_unit);
{
CHECK_FCT_DO( fd_msg_avp_new ( granted_service_unit, 0, &grpavp_sub1 ), goto out );
if(gy_port->service_type == ST_PS_DATA)
{
EN_GRPAVP_U64_("CC-Total-Octets", 0, cc_total_octects, granted_value, grpavp_sub1)
/*if (granted_value > 0)
{
EN_GRPAVP_U32_("CC-Time", 0, cc_time, 2400, grpavp_sub1)
}
else
{
EN_GRPAVP_U32_("CC-Time", 0, cc_time, 0, grpavp_sub1)
}*/
}
else
EN_GRPAVP_U32_("CC-Time", 0, cc_time, granted_value, grpavp_sub1)
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out );
LOG_D("fj CCA Granted-Service-Unit Ok\n");
}
}
/*if(granted_value > 0)
{
struct dict_object *time_threshold = NULL;
gy_ptr->msg_body.cca.time_threshold = 60;
EN_GRPAVP_U32("Time-Quota-Threshold", 10415, time_threshold, gy_ptr->msg_body.cca.time_threshold);
}*/
if(gy_ptr->request_type != RT_TERMINATE_REQUEST)
{
struct dict_object *volume_threshold = NULL;
EN_GRPAVP_U32("Volume-Quota-Threshold", 10415, volume_threshold, gy_ptr->msg_body.cca.volume_threshold);
struct dict_object *quota_hold_time = NULL;
EN_GRPAVP_U32("Quota-Holding-Time", 10415, quota_hold_time, gy_ptr->msg_body.cca.time_threshold + 10);
if(1)
{
struct dict_object *time_threshold = NULL;
EN_GRPAVP_U32("Time-Quota-Threshold", 10415, time_threshold, gy_ptr->msg_body.cca.time_threshold);
}
}
CHECK_FCT_DO( fd_msg_avp_add( ans, MSG_BRW_LAST_CHILD, grpavp ), goto out );
LOG_D("fj CCA Multiple-Services-Credit-Control Ok\n");
}
/* Send the answer */
pAnsPtr = &ans;
//CHECK_FCT_DO( fd_msg_send((struct msg **)g_ccr_msg_ptr_ptr[gy_ptr->fd_port], NULL, NULL ), goto out );
//CHECK_FCT_DO( fd_msg_send(pAnsPtr, NULL, NULL ), goto out );
fd_msg_send(pAnsPtr, NULL, NULL );
/*pthread_mutex_lock(&gy_cca_lock);
ret = fd_msg_send(pAnsPtr, NULL, NULL);
pthread_mutex_unlock(&gy_cca_lock);
if (ret != 0)
{
goto out;
}*/
if(gy_ptr->msg_body.cca.is_final)
{
gy_release_port(gy_ptr->fd_port);
}
out:
return 1;
}
static int gx_send_cca_fail(_gy_msg *gy_ptr)
{
//struct msg *req = NULL;
struct msg *ans;//, *qry;
struct avp *avp = NULL;
struct avp *grpavp = NULL;
struct avp *grpavp_sub1 = NULL;
union avp_value val;
//struct dict_object *dict_obj_tmp = NULL;
struct msg **pAnsPtr = NULL;
//int ret;
long granted_value = gy_ptr->msg_body.cca.grant_value;
long valid_time_len = 3;
gx_stat_increase_send_cca(gy_ptr->request_type);
//ans = g_ccr_msg_ptr[port];
ans = g_direct_cca_fail_msg_ptr;
//memset(ans, 0x00, sizeof(ans));
// CHECK_FCT_DO( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, &ans, 0 ) , goto out);
/* set application id */
{
struct msg_hdr * msg_hdr = NULL;
ASSERT( 0 == fd_msg_hdr ( ans, &msg_hdr ) );
msg_hdr->msg_appl = SH_APP_ID;
msg_hdr->msg_flags = msg_hdr->msg_flags | (CMD_FLAG_PROXIABLE);
}
/* Set the Origin-Host, Origin-Realm, Result-Code AVPs */
EN_AVP_U32(result_code, 4001, ans, "fj CCA Result-Code");// DIAMETER_AUTHENTICATION_REJECTED
/* Get the auth_app_id and from the reply and set it in the reply */
EN_AVP_U32(auth_app_id, 4, ans, "fj CCA Auth-Application-ID");
EN_AVP_U32(cc_req_type, gy_ptr->request_type, ans, "fj CCA cc_req_type");
EN_AVP_U32(cc_req_num, gy_ptr->request_number, ans, "fj CCA cc_req_num");
if (gy_ptr->request_type == RT_EVENT_REQUEST)
{
if ((gy_ptr->msg_body.ccr.request_action == RA_CHECK_BALANCE)\
&& (gy_ptr->msg_body.cca.result == 2001))// only support CHECK_BALANCE in event request
{
EN_AVP_U32(check_balance_result, gy_ptr->msg_body.cca.check_balance_result, ans, "fj CCA check_balance_result");
}
}
else
/* Multiple-Services-Credit-Control */
{
CHECK_FCT_DO( fd_msg_avp_new ( multiple_services_credit_control, 0, &grpavp ), goto out );
/* Result-Code */
struct dict_object *result_code = NULL;
if(gy_ptr->msg_body.cca.result < 2001)
gy_ptr->msg_body.cca.result = 2001;
EN_GRPAVP_U32("Result-Code", 0, result_code, gy_ptr->msg_body.cca.result);
/*if(gy_ptr->msg_body.cca.is_final && gy_ptr->msg_body.cca.result == 2001) //only successful result can contain this AVP
{
struct dict_object *final_unit_indication = NULL;
SEARCH_AVP_("Final-Unit-Indication", 0, &final_unit_indication);
{
CHECK_FCT_DO( fd_msg_avp_new ( final_unit_indication, 0, &grpavp_sub1 ), goto out );
EN_GRPAVP_U32_("Final-Unit-Action", 0, final_unit_action, 0, grpavp_sub1)// 0, fixed to terminate
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out );
LOG_D("fj CCA Final-Unit-Indication Ok\n");
}
}*/
struct dict_object *rate_group = NULL;
EN_GRPAVP_U32("Rating-Group", 0, rate_group, gy_ptr->rating_group); //fixed for COOK, should be the same as CCR
if(gy_ptr->service_identifier >= 0)// huawei has no si in CCR, and should not include si in CCA; iplook has si in CCR, and should include si in CCA.
{
struct dict_object *service_id = NULL;
EN_GRPAVP_U32("Service-Identifier", 0, service_id, gy_ptr->service_identifier);
}
struct dict_object *valid_time = NULL;
EN_GRPAVP_U32("Validity-Time", 0, valid_time, valid_time_len);
/* Granted-Service-Unit */
struct dict_object *granted_service_unit = NULL;
SEARCH_AVP_("Granted-Service-Unit", 0, &granted_service_unit);
{
CHECK_FCT_DO( fd_msg_avp_new ( granted_service_unit, 0, &grpavp_sub1 ), goto out );
if(gy_ptr->service_type == ST_PS_DATA)
{
EN_GRPAVP_U64_("CC-Total-Octets", 0, cc_total_octects, granted_value, grpavp_sub1)
/*if (granted_value > 0)
{
EN_GRPAVP_U32_("CC-Time", 0, cc_time, 2400, grpavp_sub1)
}
else
{
EN_GRPAVP_U32_("CC-Time", 0, cc_time, 0, grpavp_sub1)
}*/
}
else
EN_GRPAVP_U32_("CC-Time", 0, cc_time, granted_value, grpavp_sub1)
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out );
LOG_D("fj CCA Granted-Service-Unit Ok\n");
}
/*if(granted_value > 0)
{
struct dict_object *time_threshold = NULL;
gy_ptr->msg_body.cca.time_threshold = 60;
EN_GRPAVP_U32("Time-Quota-Threshold", 10415, time_threshold, gy_ptr->msg_body.cca.time_threshold);
}*/
/*if(gy_ptr->request_type != RT_TERMINATE_REQUEST)
{
struct dict_object *volume_threshold = NULL;
EN_GRPAVP_U32("Volume-Quota-Threshold", 10415, volume_threshold, gy_ptr->msg_body.cca.volume_threshold);
struct dict_object *quota_hold_time = NULL;
EN_GRPAVP_U32("Quota-Holding-Time", 10415, quota_hold_time, 750);
}*/
CHECK_FCT_DO( fd_msg_avp_add( ans, MSG_BRW_LAST_CHILD, grpavp ), goto out );
LOG_D("fj CCA Multiple-Services-Credit-Control Ok\n");
}
/* Send the answer */
pAnsPtr = &ans;
//CHECK_FCT_DO( fd_msg_send((struct msg **)g_ccr_msg_ptr_ptr[gy_ptr->fd_port], NULL, NULL ), goto out );
//CHECK_FCT_DO( fd_msg_send(pAnsPtr, NULL, NULL ), goto out );
fd_msg_send(pAnsPtr, NULL, NULL );
/*pthread_mutex_lock(&gy_cca_lock);
ret = fd_msg_send(pAnsPtr, NULL, NULL);
pthread_mutex_unlock(&gy_cca_lock);
if (ret != 0)
{
goto out;
}*/
/*if(gy_ptr->msg_body.cca.is_final)
{
gy_release_port(gy_ptr->fd_port);
}*/
out:
return 1;
}
int gx_send_ccr_real(struct gx_sm_t **sm , struct dict_object *cmd_r, _gy_msg *msg_ptr)
{
struct msg *req = NULL;
struct avp *avp = NULL;
struct avp *grpavp = NULL;
struct avp *grpavp_sub1 = NULL;
struct avp *grpavp_sub2 = NULL;
struct avp *grpavp_sub3 = NULL;
#if PS_ENABLED
struct avp *grpavp_sub4 = NULL;
#endif
union avp_value val;
struct session *sess = NULL;
struct gx_sm_t *gx_sm = NULL;
struct dict_object *dict_obj_tmp = NULL;
char tmp_buf[128], value_buf[128];
struct in_addr hostAddr;
hostAddr.s_addr = GetLocalIP();
char* phostAddr = inet_ntoa(hostAddr);
int port = msg_ptr->fd_port;
//int cxt_port;
_gy_port *gy_port = NULL;
int tmp_len =0, len;
gy_port = gy_get_port_space(port);
if(gy_port == NULL)
return 0;
gy_port->updated_ts = ts_sec;
gy_port->app_port = msg_ptr->app_port;
//cxt_port = gy_port->cxt_port;
LOG_N("fj gx_send_ccr_real enter");
gx_stat_increase_send_ccr(msg_ptr->request_type);
/* Create the request from template */
CHECK_FCT_DO( fd_msg_new( cmd_r, MSGFL_ALLOC_ETEID, &req ), goto out1 );
/* set application id */
{
struct msg_hdr * msg_hdr = NULL;
ASSERT( 0 == fd_msg_hdr ( req, &msg_hdr ) );
msg_hdr->msg_flags = msg_hdr->msg_flags & (~CMD_FLAG_PROXIABLE);
}
gx_sm = *sm;
/* Create a new session */
// if(!gx_sm->sess)
if(gy_sess[gy_port->index] == NULL)
{
CHECK_FCT_DO( fd_sess_new( &sess,
fd_g_config->cnf_diamid,
fd_g_config->cnf_diamid_len,
(uint8_t *)("CCR_SESSION"),
strlen("CCR_SESSION") ), goto out );
gy_sess[gy_port->index] = sess;
//Hold the session till terminate happens
CHECK_FCT( fd_sess_ref_msg(sess) );
}
else
{
//sess = gx_sm->sess;
sess = gy_sess[gy_port->index];
printf("use previous session %p \n", sess);
}
// fd_sess_dump( 0 , sess);
// dump_sess_eyec( sess, __FUNCTION__);
/* Now set all AVPs values */
/* Session-Id */
{
os0_t sid;
size_t sidlen;
struct dict_object *sess_id = NULL;
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Session-Id", &sess_id, ENOENT) );
CHECK_FCT_DO( fd_sess_getsid ( sess, &sid, &sidlen ), goto out );
CHECK_FCT_DO( fd_msg_avp_new ( sess_id, 0, &avp ), goto out );
val.os.data = sid;
val.os.len = sidlen;
fd_get_session_id((char *)val.os.data, tmp_buf, 0);
fd_update_cxt_id(port, tmp_buf);
printf("\r\ncxt_port=%d, app_port=%d, session id=%s\r\n", port, gy_port->app_port, tmp_buf);
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_FIRST_CHILD, avp ), goto out );
}
char *pRealm = g_sh_conf_ext.pi_diamid_realm_peer, *pHost = g_sh_conf_ext.pi_diamid_peer;
if ((msg_ptr->service_type == ST_CS_SMS) || (msg_ptr->service_type == ST_CS_VOICE))
{
GetRoDiamIdPeer(&pRealm, &pHost, (msg_ptr->service_type == ST_CS_SMS)?1:0);
}
if (pRealm == NULL || pHost == NULL)
{
LOG_N("fj gx_send_ccr_real, no link available, pRealm[%p], pHost[%p]", pRealm, pHost);
return 0;
}
/*if ((msg_ptr->service_type == ST_CS_SMS) && (g_rosms_conf_ext.pi_diamid_realm_peer!=NULL) && (g_rosms_conf_ext.pi_diamid_peer!=NULL))
{
pRealm = g_rosms_conf_ext.pi_diamid_realm_peer;
pHost = g_rosms_conf_ext.pi_diamid_peer;
}
else if ((msg_ptr->service_type == ST_CS_VOICE) && (g_rovoice_conf_ext.pi_diamid_realm_peer!=NULL) && (g_rovoice_conf_ext.pi_diamid_peer!=NULL))
{
pRealm = g_rovoice_conf_ext.pi_diamid_realm_peer;
pHost = g_rovoice_conf_ext.pi_diamid_peer;
}*/
/* Destination-Realm */
EN_AVP_STR(dest_realm, pRealm, req, "fj CCR Destination-Realm Ok");
/* Destination-Host */
EN_AVP_STR(dest_host, pHost, req, "fj CCR Destination-Host-Ok");
/* Origin-Host & Origin-Realm */
CHECK_FCT_DO( fd_msg_add_origin ( req, 0 ), goto out );
/* Auth-Application-Id */
EN_AVP_U32(auth_app_id, 4, req, "fj CCR Auth-Application-ID");
/* Service-Context-ID */
if(msg_ptr->service_type == ST_CS_SMS)
{
//EN_AVP_STR(service_cxt_id, "agrandtech_sms@3gpp.org", req, "fj CCR Service-Context-ID Ok");
EN_AVP_STR(service_cxt_id, fd_g_config->service_context_sms, req, "fj CCR Service-Context-ID Ok");
//EN_AVP_STR(route_record, "ocsclient.seagullCTF.org", req , "fj CCR Route-Record OK");
}
else
{
//EN_AVP_STR(service_cxt_id, "agrandtech_ro@3gpp.org", req, "fj CCR Service-Context-ID Ok");
EN_AVP_STR(service_cxt_id, fd_g_config->service_context_voice, req, "fj CCR Service-Context-ID Ok");
}
/* CC-Request-Type */
{
#define CCR_INIT_REQUEST 1
#define CCR_UPDATE_REQUEST 2
#define CCR_TERMINATION_REQUEST 3
#define CCR_EVENT_REQUEST 4
//TODO Change this to use enum object
CHECK_FCT_DO( fd_msg_avp_new ( cc_req_type, 0, &avp ), goto out );
/*
if(gx_sm->state == STATE_INIT)
val.i32 = CCR_INIT_REQUEST;
else if(gx_sm->state == STATE_FINAL)
val.i32 = CCR_TERMINATION_REQUEST;
else
val.i32 = CCR_UPDATE_REQUEST;
*/
if(msg_ptr->request_type>RT_EVENT_REQUEST)
val.i32 = RT_EVENT_REQUEST;
else
val.i32 = msg_ptr->request_type;
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, avp ), goto out );
}
/* CC-Requested-Action */
if(msg_ptr->service_type == ST_CS_SMS)
EN_AVP_U32(requested_action, msg_ptr->msg_body.ccr.request_action, req, "fj CCR Requested-Action");
/* CC-Request-Number */
EN_AVP_U32(cc_req_num, msg_ptr->request_number, req, "fj CCR CC-Request-Number");
/* Event-Timestamp */
time_t_to_diameter_timestamp(tmp_buf);
EN_AVP_BCDSTR(event_timestamp, tmp_buf, 4, req, "fj CCR Event-Timestamp");
/* Subscription-Id */
{
int offset = 0;
if(msg_ptr->msg_body.ccr.role_of_node == 0)
{
if(msg_ptr->msg_body.ccr.caller[0] == '+')
offset = 1;
sprintf(tmp_buf, "%s", &msg_ptr->msg_body.ccr.caller[offset]);
}
else if(msg_ptr->msg_body.ccr.role_of_node == 1)
{
if(msg_ptr->msg_body.ccr.called[0] == '+')
offset = 1;
sprintf(tmp_buf, "%s", &msg_ptr->msg_body.ccr.called[offset]);
}
else if(msg_ptr->msg_body.ccr.role_of_node == 2)
{
if(msg_ptr->msg_body.ccr.caller[0] == '+')
offset = 1;
sprintf(tmp_buf, "%s", &msg_ptr->msg_body.ccr.caller[offset]);
}
CHECK_FCT_DO( fd_msg_avp_new ( subscription_id, 0, &grpavp ), goto out );
EN_GRPAVP_U32_("Subscription-Id-Type", 0, subscription_id_type, 0, grpavp);
EN_GRPAVP_STR("Subscription-Id-Data", 0, subscription_id_data, tmp_buf, grpavp);
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, grpavp ), goto out );
if(1)
{
tmp_len = strlen(msg_ptr->msg_body.ccr.imsi);
if(tmp_len>4)
{
strcpy(tmp_buf, msg_ptr->msg_body.ccr.imsi);
CHECK_FCT_DO( fd_msg_avp_new ( subscription_id, 0, &grpavp ), goto out );
EN_GRPAVP_U32_("Subscription-Id-Type", 0, subscription_id_type, 1, grpavp);
EN_GRPAVP_STR("Subscription-Id-Data", 0, subscription_id_data, tmp_buf, grpavp);
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, grpavp ), goto out );
}
}
}
/* Service-Information */
{
CHECK_FCT_DO( fd_msg_avp_new ( service_information, 0, &grpavp ), goto out );
/* AoC-Information */
/* SMS-Information */
if(msg_ptr->service_type == ST_CS_SMS)
{
struct dict_object *SMS_Information = NULL;
SEARCH_AVP_("SMS-Information", SH_VND_ID, &SMS_Information);
CHECK_FCT_DO( fd_msg_avp_new ( SMS_Information, 0, &grpavp_sub1 ), goto out);
EN_GRPAVP_U32_("SMS-Node", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub1)
/*
EN_GRPAVP_U32_("SM-Message-Type", SH_VND_ID, dict_obj_tmp, 0, grpavp_sub1)
*/
EN_GRPAVP_U32_("Number-Of-Messages-Sent", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub1)
/*
EN_GRPAVP_U32_("SM-Service-Type", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub1)
*/
EN_GRPAVP_STR("SMSC-Address", SH_VND_ID, dict_obj_tmp, msg_ptr->msg_body.ccr.smsc, grpavp_sub1)
/*
struct dict_object *SMSC_Address = NULL;
SEARCH_AVP_("SMSC-Address", SH_VND_ID, &SMSC_Address);
CHECK_FCT_DO( fd_msg_avp_new ( SMSC_Address, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_U32_("Address-Type", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub2)
EN_GRPAVP_STR("Address-Data", SH_VND_ID, dict_obj_tmp, msg_ptr->msg_body.ccr.smsc, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
*/
struct dict_object *Originator_Received_Address = NULL;
SEARCH_AVP_("Originator-Received-Address", SH_VND_ID, &Originator_Received_Address);
CHECK_FCT_DO( fd_msg_avp_new ( Originator_Received_Address, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_U32_("Address-Type", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub2)
EN_GRPAVP_STR("Address-Data", SH_VND_ID, dict_obj_tmp, msg_ptr->msg_body.ccr.caller, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
struct dict_object *Recipient_Info = NULL;
SEARCH_AVP_("Recipient-Info", SH_VND_ID, &Recipient_Info);
CHECK_FCT_DO( fd_msg_avp_new ( Recipient_Info, 0, &grpavp_sub2 ), goto out);
{
struct dict_object *Recipient_Address = NULL;
SEARCH_AVP_("Recipient-Address", SH_VND_ID, &Recipient_Address);
CHECK_FCT_DO( fd_msg_avp_new ( Recipient_Address, 0, &grpavp_sub3 ), goto out);
{
EN_GRPAVP_U32_("Address-Type", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub3)
EN_GRPAVP_STR("Address-Data", SH_VND_ID, dict_obj_tmp, msg_ptr->msg_body.ccr.called, grpavp_sub3)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub2, MSG_BRW_LAST_CHILD, grpavp_sub3 ), goto out );
}
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
if(msg_ptr->msg_body.ccr.cellid_presented == 1)
{
/* fj added 2021.2.24 for OCS CCR witch avp Service-Specific-Info */
struct dict_object *service_specific_info = NULL;
SEARCH_AVP_("Service-Specific-Info", SH_VND_ID, &service_specific_info);
CHECK_FCT_DO( fd_msg_avp_new ( service_specific_info, 0, &grpavp_sub2 ), goto out);
{ /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҪӦ<D2AA>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
EN_GRPAVP_U32_("Service-Specific-Type", SH_VND_ID, dict_obj_tmp, 6006, grpavp_sub2)
EN_GRPAVP_STR("Service-Specific-Data", SH_VND_ID, dict_obj_tmp, msg_ptr->msg_body.ccr.cellid, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
}
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out );
}
else /* IMS-Information */
{
CHECK_FCT_DO( fd_msg_avp_new ( ims_information, 0, &grpavp_sub1 ), goto out );
EN_GRPAVP_U32_("Node-Functionality", SH_VND_ID, dict_obj_tmp, 6, grpavp_sub1)
if(msg_ptr->msg_body.ccr.cellid_presented == 1)
{
/* fj added 2021.2.24 for OCS CCR witch avp Service-Specific-Info */
struct dict_object *service_specific_info = NULL;
SEARCH_AVP_("Service-Specific-Info", SH_VND_ID, &service_specific_info);
CHECK_FCT_DO( fd_msg_avp_new ( service_specific_info, 0, &grpavp_sub2 ), goto out);
{ /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҪӦ<D2AA>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
EN_GRPAVP_U32_("Service-Specific-Type", SH_VND_ID, dict_obj_tmp, 6006, grpavp_sub2)
EN_GRPAVP_STR("Service-Specific-Data", SH_VND_ID, dict_obj_tmp, msg_ptr->msg_body.ccr.cellid, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
}
struct dict_object *event_type = NULL;
SEARCH_AVP_("Event-Type", SH_VND_ID, &event_type);
CHECK_FCT_DO( fd_msg_avp_new ( event_type, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_STR("SIP-Method", SH_VND_ID, dict_obj_tmp, "INVITE", grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
EN_GRPAVP_U32_("Role-of-Node", SH_VND_ID, dict_obj_tmp, msg_ptr->msg_body.ccr.role_of_node, grpavp_sub1)
sprintf( tmp_buf,"%04d.agt@%s", msg_ptr->fd_port, phostAddr );
EN_GRPAVP_STR("User-Session-Id", SH_VND_ID, dict_obj_tmp, tmp_buf, grpavp_sub1)
/* Time-Stamps */
CHECK_FCT_DO( fd_msg_avp_new ( time_stamps, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_STR("SIP-Request-Timestamp", SH_VND_ID, dict_obj_tmp, "3580", grpavp_sub2)
EN_GRPAVP_STR("SIP-Response-Timestamp", SH_VND_ID, dict_obj_tmp, "3580", grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
/* Inter-Operator-Identifier */
struct dict_object *inter_operator_identifier = NULL;
SEARCH_AVP_("Inter-Operator-Identifier", SH_VND_ID, &inter_operator_identifier);
CHECK_FCT_DO( fd_msg_avp_new ( inter_operator_identifier, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_STR("Originating-IOI", SH_VND_ID, dict_obj_tmp, fd_g_config->cnf_diamid, grpavp_sub2)
// EN_GRPAVP_STR("Originating-IOI", SH_VND_ID, dict_obj_tmp, "agrandtech_ocs@3gpp.org", grpavp_sub2)
EN_GRPAVP_STR("Terminating-IOI", SH_VND_ID, dict_obj_tmp, pHost, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
EN_GRPAVP_STR("IMS-Charging-Identifier", SH_VND_ID, dict_obj_tmp, "286eae5698fb00530e05090ffee03c60.3580811571.1100844.12", grpavp_sub1)
if(msg_ptr->service_type != ST_CS_SMS)
{
sprintf(tmp_buf, "v=0 o=- 26967515390 IN IP4 %s s=SBC call c=IN IP4 %s t=0 0", phostAddr, phostAddr);
EN_GRPAVP_STR("SDP-Session-Description", SH_VND_ID, dict_obj_tmp, tmp_buf, grpavp_sub1)
/* SDP-Media-Component */
struct dict_object *sdp_media_component = NULL;
SEARCH_AVP_("SDP-Media-Component", SH_VND_ID, &sdp_media_component);
CHECK_FCT_DO( fd_msg_avp_new ( sdp_media_component, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_STR("SDP-Media-Name", SH_VND_ID, dict_obj_tmp, "audio 19556 RTP/AVP 8 101", grpavp_sub2)
EN_GRPAVP_STR("SDP-Media-Description", SH_VND_ID, dict_obj_tmp, " a=rtpmap:8 PCMA/8000 a=rtpmap:101 telephone-event/8000 a=fmtp:101 0-15 a=ptime:20 a=sendrecv", grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
/* Message-Body */
struct dict_object *message_body = NULL;
SEARCH_AVP_("Message-Body", SH_VND_ID, &message_body);
CHECK_FCT_DO( fd_msg_avp_new ( message_body, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_STR("Content-Type", SH_VND_ID, dict_obj_tmp, "application/sdp", grpavp_sub2)
EN_GRPAVP_U32_("Content-Length", SH_VND_ID, dict_obj_tmp, 22, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
LOG_D("fj CCR Message-Body Ok\n");
}
}
if(msg_ptr->msg_body.ccr.cellid_presented == 1)
{
if (msg_ptr->msg_body.ccr.cellid[3] == 'F')
{
char mcc[8]="";
strncpy(mcc, msg_ptr->msg_body.ccr.cellid, 3);
sprintf(tmp_buf, "3GPP-GERAN;cgi-3gpp=%s%s", mcc, &msg_ptr->msg_body.ccr.cellid[4]);
}
else
{
sprintf(tmp_buf, "3GPP-GERAN;cgi-3gpp=%s", msg_ptr->msg_body.ccr.cellid);
}
}
else
{
sprintf(tmp_buf, "XDSL;'location-info=%s'", phostAddr );
}
EN_GRPAVP_STR("Access-Network-Information", SH_VND_ID, dict_obj_tmp, tmp_buf, grpavp_sub1)
if(msg_ptr->msg_body.ccr.role_of_node == 2)
sprintf(tmp_buf, "%s", msg_ptr->msg_body.ccr.origin_caller);
else
sprintf(tmp_buf, "%s", msg_ptr->msg_body.ccr.caller);
// sprintf(tmp_buf, "%s", msg_ptr->msg_body.ccr.caller);
EN_GRPAVP_STR("Calling-Party-Address", SH_VND_ID, dict_obj_tmp, tmp_buf, grpavp_sub1)
sprintf(tmp_buf, "%s", msg_ptr->msg_body.ccr.called);
EN_GRPAVP_STR("Called-Party-Address", SH_VND_ID, dict_obj_tmp, tmp_buf, grpavp_sub1)
/*
if(msg_ptr->msg_body.ccr.role_of_node == 0)
{
sprintf(tmp_buf, "%s", msg_ptr->msg_body.ccr.caller);
}
else
{
sprintf(tmp_buf, "%s", msg_ptr->msg_body.ccr.called);
}
EN_GRPAVP_STR("Requested-Party-Address", SH_VND_ID, dict_obj_tmp, tmp_buf, grpavp_sub1)
*/
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out );
}
#if PS_ENABLED
/* PS-Information */
struct dict_object *ps_information = NULL;
SEARCH_AVP_("PS-Information", SH_VND_ID, &ps_information);
{
CHECK_FCT_DO( fd_msg_avp_new ( ps_information, 0, &grpavp_sub1 ), goto out );
EN_GRPAVP_U32_("3GPP-Charging-Id", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub1);
EN_GRPAVP_U32_("PDN-Connection-ID", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub1);
EN_GRPAVP_STR("Node-Id", SH_VND_ID, dict_obj_tmp, "Node-Id", grpavp_sub1);
EN_GRPAVP_U32_("3GPP-PDP-Type", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub1);
EN_GRPAVP_STR("PDP-Address", SH_VND_ID, dict_obj_tmp, "10.10.10.10", grpavp_sub1);
EN_GRPAVP_U32_("Dynamic-Address-Flag", SH_VND_ID, dict_obj_tmp, 4, grpavp_sub1);
/* QoS-Information */
struct dict_object *qos_information = NULL;
SEARCH_AVP_("QoS-Information", SH_VND_ID, &qos_information);
CHECK_FCT_DO( fd_msg_avp_new ( qos_information, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_U32_("QoS-Class-Identifier", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub2)
EN_GRPAVP_U32_("Max-Requested-Bandwidth-UL", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub2)
EN_GRPAVP_U32_("Guaranteed-Bitrate-UL", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub2)
EN_GRPAVP_U32_("Guaranteed-Bitrate-DL", SH_VND_ID, dict_obj_tmp, 4, grpavp_sub2)
EN_GRPAVP_STR("Bearer-Identifier", SH_VND_ID, dict_obj_tmp, "Bearer-Identifier", grpavp_sub2)
/* Allocation-Retention-Priority */
struct dict_object *allocation_retention_priority = NULL;
SEARCH_AVP_("Allocation-Retention-Priority", SH_VND_ID, &allocation_retention_priority);
CHECK_FCT_DO( fd_msg_avp_new ( allocation_retention_priority, 0, &grpavp_sub3 ), goto out);
{
EN_GRPAVP_U32_("Priority-Level", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub3)
EN_GRPAVP_U32_("Pre-emption-Capability", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub3)
EN_GRPAVP_U32_("Pre-emption-Vulnerability", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub3)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub2, MSG_BRW_LAST_CHILD, grpavp_sub3 ), goto out );
}
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-UL", SH_VND_ID, dict_obj_tmp, 5, grpavp_sub2)
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-DL", SH_VND_ID, dict_obj_tmp, 6, grpavp_sub2)
/* Conditional-APN-Aggregate-Max-Bitrate */
struct dict_object *conditional_apn_aggregate_max_btrate = NULL;
SEARCH_AVP_("Conditional-APN-Aggregate-Max-Bitrate", SH_VND_ID, &conditional_apn_aggregate_max_btrate);
CHECK_FCT_DO( fd_msg_avp_new ( conditional_apn_aggregate_max_btrate, 0, &grpavp_sub3 ), goto out);
{
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-UL", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub3)
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-DL", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub3)
EN_GRPAVP_U32_("IP-CAN-Type", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub3)
EN_GRPAVP_U32_("RAT-Type", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub3)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub2, MSG_BRW_LAST_CHILD, grpavp_sub3 ), goto out );
}
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
EN_GRPAVP_STR("SGSN-Address", SH_VND_ID, dict_obj_tmp, "10.10.10.10", grpavp_sub1);
EN_GRPAVP_STR("GGSN-Address", SH_VND_ID, dict_obj_tmp, "10.10.10.10", grpavp_sub1);
EN_GRPAVP_STR("SGW-Address", SH_VND_ID, dict_obj_tmp, "10.10.10.10", grpavp_sub1);
EN_GRPAVP_STR("CG-Address", SH_VND_ID, dict_obj_tmp, "10.10.10.10", grpavp_sub1);
EN_GRPAVP_U32_("Serving-Node-Type", SH_VND_ID, dict_obj_tmp, 4, grpavp_sub1);
EN_GRPAVP_U32_("SGW-Change", SH_VND_ID, dict_obj_tmp, 4, grpavp_sub1);
EN_GRPAVP_STR("3GPP-IMSI-MCC-MNC", SH_VND_ID, dict_obj_tmp, "3GPP-IMSI-MCC-MNC", grpavp_sub1);
EN_GRPAVP_U32_("IMSI-Unauthenticated-Flag", SH_VND_ID, dict_obj_tmp, 4, grpavp_sub1);
EN_GRPAVP_STR("3GPP-GGSN-MCC-MNC", SH_VND_ID, dict_obj_tmp, "3GPP-GGSN-MCC-MNC", grpavp_sub1);
EN_GRPAVP_STR("3GPP-NSAPI", SH_VND_ID, dict_obj_tmp, "3GPP-NSAPI", grpavp_sub1);
EN_GRPAVP_STR("Called-Station-Id", 0, dict_obj_tmp, "Called-Station-Id", grpavp_sub1);
EN_GRPAVP_STR("3GPP-Session-Stop-Indicator", SH_VND_ID, dict_obj_tmp, "3GPP-Session-Stop-Indicator", grpavp_sub1);
EN_GRPAVP_STR("3GPP-Selection-Mode", SH_VND_ID, dict_obj_tmp, "3GPP-Selection-Mode", grpavp_sub1);
EN_GRPAVP_STR("3GPP-Charging-Characteristics", SH_VND_ID, dict_obj_tmp, "3GPP-Charging-Characteristics", grpavp_sub1);
EN_GRPAVP_U32_("Charging-Characteristics-Selection-Mode", SH_VND_ID, dict_obj_tmp, 5, grpavp_sub1);
EN_GRPAVP_STR("3GPP-SGSN-MCC-MNC", SH_VND_ID, dict_obj_tmp, "3GPP-SGSN-MCC-MNC", grpavp_sub1);
EN_GRPAVP_STR("3GPP-MS-TimeZone", SH_VND_ID, dict_obj_tmp, "3GPP-MS-TimeZone", grpavp_sub1);
EN_GRPAVP_STR("Charging-Rule-Base-Name", SH_VND_ID, dict_obj_tmp, "Charging-Rule-Base-Name", grpavp_sub1);
EN_GRPAVP_STR("3GPP-User-Location-Info", SH_VND_ID, dict_obj_tmp, "3GPP-User-Location-Info", grpavp_sub1);
/* User-CSG-Information */
struct dict_object *user_csg_information = NULL;
SEARCH_AVP_("User-CSG-Information", SH_VND_ID, &user_csg_information);
CHECK_FCT_DO( fd_msg_avp_new ( user_csg_information, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_U32_("CSG-Id", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub2)
EN_GRPAVP_U32_("CSG-Access-Mode", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub2)
EN_GRPAVP_U32_("CSG-Membership-Indication", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
EN_GRPAVP_STR("3GPP2-BSID", 5535, dict_obj_tmp, "3GPP2-BSID", grpavp_sub1);
EN_GRPAVP_STR("3GPP-RAT-Type", SH_VND_ID, dict_obj_tmp, "3GPP-RAT-Type", grpavp_sub1);
/* PS-Furnish-Charging-Information */
struct dict_object *ps_furnish_charging_information = NULL;
SEARCH_AVP_("PS-Furnish-Charging-Information", SH_VND_ID, &ps_furnish_charging_information);
CHECK_FCT_DO( fd_msg_avp_new ( ps_furnish_charging_information, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_STR("PS-Free-Format-Data", SH_VND_ID, dict_obj_tmp, "PS-Free-Format-Data", grpavp_sub2)
EN_GRPAVP_U32_("PS-Append-Free-Format-Data", SH_VND_ID, dict_obj_tmp, 22, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
EN_GRPAVP_U32_("PDP-Context-Type", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub1);
LOG_D("fj CCR PDP-Context-Type Ok\n");
/* Offline-Charging */
struct dict_object *offline_charging = NULL;
SEARCH_AVP_("Offline-Charging", SH_VND_ID, &offline_charging);
CHECK_FCT_DO( fd_msg_avp_new ( offline_charging, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_U32_("Quota-Consumption-Time", SH_VND_ID, dict_obj_tmp, 22, grpavp_sub2)
/* Time-Quota-Mechanism */
struct dict_object *time_quota_mechanism = NULL;
SEARCH_AVP_("Time-Quota-Mechanism", SH_VND_ID, &time_quota_mechanism);
CHECK_FCT_DO( fd_msg_avp_new ( time_quota_mechanism, 0, &grpavp_sub3 ), goto out);
{
EN_GRPAVP_U32_("Time-Quota-Type", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub3)
EN_GRPAVP_U32_("Base-Time-Interval", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub3)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub2, MSG_BRW_LAST_CHILD, grpavp_sub3 ), goto out );
}
EN_GRPAVP_U32_("Envelope-Reporting", SH_VND_ID, dict_obj_tmp, 22, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
/* Traffic-Data-Volumes */
struct dict_object *traffic_data_volumes = NULL;
SEARCH_AVP_("Traffic-Data-Volumes", SH_VND_ID, &traffic_data_volumes);
CHECK_FCT_DO( fd_msg_avp_new ( traffic_data_volumes, 0, &grpavp_sub2 ), goto out );
{
/* QoS-Information */
struct dict_object *qos_information = NULL;
SEARCH_AVP_("QoS-Information", SH_VND_ID, &qos_information);
CHECK_FCT_DO( fd_msg_avp_new ( qos_information, 0, &grpavp_sub3 ), goto out);
{
EN_GRPAVP_U32_("QoS-Class-Identifier", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub3)
EN_GRPAVP_U32_("Max-Requested-Bandwidth-UL", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub3)
EN_GRPAVP_U32_("Guaranteed-Bitrate-UL", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub3)
EN_GRPAVP_U32_("Guaranteed-Bitrate-DL", SH_VND_ID, dict_obj_tmp, 4, grpavp_sub3)
EN_GRPAVP_STR("Bearer-Identifier", SH_VND_ID, dict_obj_tmp, "Bearer-Identifier", grpavp_sub3)
/* Allocation-Retention-Priority */
struct dict_object *allocation_retention_priority = NULL;
SEARCH_AVP_("Allocation-Retention-Priority", SH_VND_ID, &allocation_retention_priority);
CHECK_FCT_DO( fd_msg_avp_new ( allocation_retention_priority, 0, &grpavp_sub4 ), goto out);
{
EN_GRPAVP_U32_("Priority-Level", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub4)
EN_GRPAVP_U32_("Pre-emption-Capability", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub4)
EN_GRPAVP_U32_("Pre-emption-Vulnerability", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub4)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub3, MSG_BRW_LAST_CHILD, grpavp_sub4 ), goto out );
}
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-UL", SH_VND_ID, dict_obj_tmp, 5, grpavp_sub3)
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-DL", SH_VND_ID, dict_obj_tmp, 6, grpavp_sub3)
/* Conditional-APN-Aggregate-Max-Bitrate */
struct dict_object *conditional_apn_aggregate_max_btrate = NULL;
SEARCH_AVP_("Conditional-APN-Aggregate-Max-Bitrate", SH_VND_ID, &conditional_apn_aggregate_max_btrate);
CHECK_FCT_DO( fd_msg_avp_new ( conditional_apn_aggregate_max_btrate, 0, &grpavp_sub4 ), goto out);
{
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-UL", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub4)
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-DL", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub4)
EN_GRPAVP_U32_("IP-CAN-Type", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub4)
EN_GRPAVP_U32_("RAT-Type", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub4)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub3, MSG_BRW_LAST_CHILD, grpavp_sub4 ), goto out );
}
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub2, MSG_BRW_LAST_CHILD, grpavp_sub3 ), goto out );
}
EN_GRPAVP_U64_("Accounting-Input-Octets", 0, dict_obj_tmp, 1, grpavp_sub2)
EN_GRPAVP_U64_("Accounting-Input-Packets", 0, dict_obj_tmp, 2, grpavp_sub2)
EN_GRPAVP_U64_("Accounting-Output-Octets", 0, dict_obj_tmp, 3, grpavp_sub2)
EN_GRPAVP_U64_("Accounting-Output-Packets", 0, dict_obj_tmp, 4, grpavp_sub2)
EN_GRPAVP_U32_("Change-Condition", SH_VND_ID, dict_obj_tmp, 5, grpavp_sub2)
EN_GRPAVP_STR("Change-Time", SH_VND_ID, dict_obj_tmp, "1111", grpavp_sub2)
EN_GRPAVP_STR("3GPP-User-Location-Info", SH_VND_ID, dict_obj_tmp, "3GPP-User-Location-Info", grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
/* Service-Data-Container */
/* User-Equipment-Info */
struct dict_object *user_equipment_info = NULL;
SEARCH_AVP_("User-Equipment-Info", 0, &user_equipment_info);
CHECK_FCT_DO( fd_msg_avp_new ( user_equipment_info, 0, &grpavp_sub2 ), goto out );
{
EN_GRPAVP_U32_("User-Equipment-Info-Type", 0, dict_obj_tmp, 1, grpavp_sub2)
EN_GRPAVP_STR("User-Equipment-Info-Value", 0, dict_obj_tmp, "User-Equipment-Info-Value", grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
/* Terminal-Information */
EN_GRPAVP_STR("Start-Time", SH_VND_ID, dict_obj_tmp, "2016-08-10T19:09:30-05:00", grpavp_sub1);
EN_GRPAVP_STR("Stop-Time", SH_VND_ID, dict_obj_tmp, "2016-08-10T19:09:30-05:00 ", grpavp_sub1);
EN_GRPAVP_U32_("Change-Condition", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub1);
EN_GRPAVP_U32_("Diagnostics", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub1);
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out );
}
#endif
/* fj added 20170218. for ccr.vcs_information */
/* VCS-Information */
tmp_len = strlen(msg_ptr->msg_body.ccr.vlr_number);
if(tmp_len == 0)
tmp_len = strlen(msg_ptr->msg_body.ccr.msc_addr);
if(tmp_len)
{
struct dict_object *vcs_information = NULL;
SEARCH_AVP_("VCS-Information", SH_VND_ID, &vcs_information);
{
CHECK_FCT_DO( fd_msg_avp_new ( vcs_information, 0, &grpavp_sub1 ), goto out );
//if(strlen(msg_ptr->msg_body.ccr.msc_addr))
{
tmp_len = strlen(msg_ptr->msg_body.ccr.msc_addr);
fdAsciiToBcd((unsigned char *)tmp_buf, &len, msg_ptr->msg_body.ccr.msc_addr, tmp_len);
//sprintf(tmp_buf, "%s", msg_ptr->msg_body.ccr.msc_addr);
//EN_GRPAVP_STR("MSC-Address", SH_VND_ID, dict_obj_tmp, tmp_buf, grpavp_sub1);
EN_GRPAVP_STR_BCD("MSC-Address", SH_VND_ID, dict_obj_tmp, tmp_buf, len, grpavp_sub1);
}
/* Basic-Service-Code */
struct dict_object *basic_service_code = NULL;
SEARCH_AVP_("Basic-Service-Code", SH_VND_ID, &basic_service_code);
CHECK_FCT_DO( fd_msg_avp_new ( basic_service_code, 0, &grpavp_sub2 ), goto out );
{
sprintf(value_buf, "%d", 0);
tmp_len = strlen(value_buf);
fdAsciiToBcd((unsigned char *)tmp_buf, &len, value_buf, tmp_len);
//EN_GRPAVP_STR("Bearer-Service", SH_VND_ID, dict_obj_tmp, tmp_buf, grpavp_sub2);
EN_GRPAVP_STR_BCD("Bearer-Service", SH_VND_ID, dict_obj_tmp, tmp_buf, len, grpavp_sub2);
sprintf(value_buf, "%d", msg_ptr->msg_body.ccr.service_key);
tmp_len = strlen(value_buf);
fdAsciiToBcd((unsigned char *)tmp_buf, &len, value_buf, tmp_len);
//EN_GRPAVP_STR("Teleservice", SH_VND_ID, dict_obj_tmp, tmp_buf, grpavp_sub2);
EN_GRPAVP_STR_BCD("Teleservice", SH_VND_ID, dict_obj_tmp, tmp_buf, len, grpavp_sub2);
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
//if(strlen(msg_ptr->msg_body.ccr.vlr_number))
{
tmp_len = strlen(msg_ptr->msg_body.ccr.vlr_number);
fdAsciiToBcd((unsigned char *)tmp_buf, &len, msg_ptr->msg_body.ccr.vlr_number, tmp_len);
//sprintf(tmp_buf, "%s", msg_ptr->msg_body.ccr.vlr_number);
//EN_GRPAVP_STR("VLR-Number", SH_VND_ID, dict_obj_tmp, tmp_buf, grpavp_sub1);
EN_GRPAVP_STR_BCD("VLR-Number", SH_VND_ID, dict_obj_tmp, tmp_buf, len, grpavp_sub1);
}
}
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out );
}
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, grpavp ), goto out );
LOG_D("fj CCR Service-Information Ok\n");
}
if(msg_ptr->service_type != ST_CS_SMS)
{
/* Service-Identifier */
EN_AVP_U32(service_identifier, 65534, req, "fj CCR Service-Identifier");
/* Multiple-Services-Indicator */
EN_AVP_U32(multiple_services_indicator, 1, req, "fj CCR Multiple-Services-Indicator");
/* Multiple-Services-Credit-Control */
{
CHECK_FCT_DO( fd_msg_avp_new ( multiple_services_credit_control, 0, &grpavp ), goto out);
/* Requested-Service-Unit */
if(msg_ptr->request_type != RT_TERMINATE_REQUEST)
{
CHECK_FCT_DO( fd_msg_avp_new ( requested_service_unit, 0, &grpavp_sub1 ), goto out);
EN_GRPAVP_U32_("CC-Time", 0, dict_obj_tmp, 60, grpavp_sub1)
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out);
}
/* Used-Service-Unit */
if(msg_ptr->msg_body.ccr.used_unit>0 || msg_ptr->request_type == RT_TERMINATE_REQUEST)
{
struct dict_object* used_service_unit = NULL;
SEARCH_AVP_("Used-Service-Unit", 0, &used_service_unit);
{
CHECK_FCT_DO( fd_msg_avp_new ( used_service_unit, 0, &grpavp_sub1 ), goto out);
EN_GRPAVP_U32_("CC-Time", 0, dict_obj_tmp, msg_ptr->msg_body.ccr.used_unit, grpavp_sub1)
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out);
}
}
if(msg_ptr->request_type == RT_UPDATE_REQUEST)
EN_GRPAVP_U32("Reporting-Reason", SH_VND_ID, reporting_reason, 0);
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, grpavp ), goto out );
}
}
/* CC-Correlation-Id */
/* User-Equipment-Info */
#if 0
switch(gx_sm->state) {
case STATE_INIT:
{
//Set Bearer-Usage
//TODO Change this to use enum object
CHECK_FCT_DO( fd_msg_avp_new ( bearer_usage, 0, &avp ), goto out );
val.i32 = 1;//IMS
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, avp ), goto out );
}
{
//Set Packet Filter Operation
//TODO Change this to use enum object
CHECK_FCT_DO( fd_msg_avp_new ( pflt_oper, 0, &avp ), goto out );
val.i32 = 1;//ADDITION
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, avp ), goto out );
}
struct avp *flt_info = NULL;
{
//Set Packet Filter Information
CHECK_FCT_DO( fd_msg_avp_new ( pflt_info, 0, &flt_info ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, flt_info ), goto out );
}
// Set Packet Filter Identity
{
CHECK_FCT_DO( fd_msg_avp_new ( pflt_id, 0, &avp ), goto out );
val.os.data = (unsigned char *)("ID");
val.os.len = strlen("ID");
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), goto out );
if(flt_info) {
CHECK_FCT_DO( fd_msg_avp_add( flt_info, MSG_BRW_LAST_CHILD, avp ), goto out );
}else {
printf("flt_info NULL\n");
}
}
CHECK_FCT(fd_sess_state_store(g_hdlr, sess, &gx_sm));
break;
case STATE_FINAL:
{
//Set Packet Filter Operation
//TODO Change this to use enum object
CHECK_FCT_DO( fd_msg_avp_new ( term_cause, 0, &avp ), goto out );
val.i32 = 1;//Diameter logout
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, avp ), goto out );
}
break;
default:
printf("State mismatch \n");
}
#else
/* fj added 20160828: this allow send more than once */
// CHECK_FCT(fd_sess_state_store(g_hdlr, sess, &gx_sm));
#endif
fflush(stderr);
/* Send the request */
//printf("CCA %p\n",req);
// Everthing Done Store the state: reply should retreive it
CHECK_FCT_DO( fd_msg_send( &req, gx_rec_cca, NULL ), goto out );
out:
if(req != NULL)
fd_msg_free(req);
out1:
return 1;
}
int gx_send_ccr(struct gx_sm_t **sm , struct dict_object *cmd_r )
{
struct msg *req = NULL;
struct avp *avp = NULL;
struct avp *grpavp = NULL;
struct avp *grpavp_sub1 = NULL;
struct avp *grpavp_sub2 = NULL;
struct avp *grpavp_sub3 = NULL;
struct avp *grpavp_sub4 = NULL;
union avp_value val;
struct session *sess = NULL;
struct gx_sm_t *gx_sm = NULL;
struct dict_object *dict_obj_tmp = NULL;
fprintf(stderr, "ECHO ccr send from done...\n");
LOG_N("fj gx_send_ccr enter");
/* Create the request from template */
CHECK_FCT_DO( fd_msg_new( cmd_r, MSGFL_ALLOC_ETEID, &req ), goto out );
/* set application id */
{
struct msg_hdr * msg_hdr = NULL;
ASSERT( 0 == fd_msg_hdr ( req, &msg_hdr ) );
msg_hdr->msg_flags = msg_hdr->msg_flags | (CMD_FLAG_PROXIABLE);
}
gx_sm = *sm;
/* Create a new session */
if(!gx_sm->sess)
{
CHECK_FCT_DO( fd_sess_new( &sess, fd_g_config->cnf_diamid, fd_g_config->cnf_diamid_len, (uint8_t *)("CCR_SESSION"), strlen("CCR_SESSION") ), goto out );
printf("statemachine: %p %p %p\n", *(&gx_sm), gx_sm , *sm);
gx_sm->sess = sess;
printf("new session %p \n", sess);
//Hold the session till terminate happens
CHECK_FCT( fd_sess_ref_msg(sess) );
}
else
{
sess = gx_sm->sess;
printf("use previous session %p \n", sess);
}
// fd_sess_dump( 0 , sess);
// dump_sess_eyec( sess, __FUNCTION__);
/* Now set all AVPs values */
/* Session-Id */
{
os0_t sid;
size_t sidlen;
struct dict_object *sess_id = NULL;
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Session-Id", &sess_id, ENOENT) );
CHECK_FCT_DO( fd_sess_getsid ( sess, &sid, &sidlen ), goto out );
CHECK_FCT_DO( fd_msg_avp_new ( sess_id, 0, &avp ), goto out );
val.os.data = sid;
val.os.len = sidlen;
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_FIRST_CHILD, avp ), goto out );
}
/* Destination-Realm */
EN_AVP_STR(dest_realm, g_sh_conf_ext.pi_diamid_realm_peer, req, "fj CCR Destination-Realm Ok");
/* Destination-Host */
EN_AVP_STR(dest_host, g_sh_conf_ext.pi_diamid_peer, req, "fj CCR Destination-Host-Ok");
/* Origin-Host & Origin-Realm */
CHECK_FCT_DO( fd_msg_add_origin ( req, 0 ), goto out );
/* Auth-Application-Id */
EN_AVP_U32(auth_app_id, 4, req, "fj CCR Auth-Application-ID");
/* Service-Context-ID */
EN_AVP_STR(service_cxt_id, "32260@3gpp.org", req, "fj CCR Service-Context-ID Ok");
/* CC-Request-Type */
{
#define CCR_INIT_REQUEST 1
#define CCR_UPDATE_REQUEST 2
#define CCR_TERMINATION_REQUEST 3
#define CCR_EVENT_REQUEST 4
//TODO Change this to use enum object
CHECK_FCT_DO( fd_msg_avp_new ( cc_req_type, 0, &avp ), goto out );
if(gx_sm->state == STATE_INIT)
val.i32 = CCR_INIT_REQUEST;
else if(gx_sm->state == STATE_FINAL)
val.i32 = CCR_TERMINATION_REQUEST;
else
val.i32 = CCR_UPDATE_REQUEST;
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, avp ), goto out );
}
/* CC-Request-Number */
EN_AVP_U32(cc_req_num, gx_sm->req_num, req, "fj CCR CC-Request-Number");
gx_sm->req_num++;
/* Event-Timestamp */
EN_AVP_STR(event_timestamp, "20130721T135252+00", req, "fj CCR Event-Timestamp");
/* Subscription-Id */
{
CHECK_FCT_DO( fd_msg_avp_new ( subscription_id, 0, &grpavp ), goto out );
EN_GRPAVP_U32_("Subscription-Id-Type", 0, subscription_id_type, 0, grpavp);
EN_GRPAVP_STR("Subscription-Id-Data", 0, subscription_id_data, "+23412340001", grpavp);
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, grpavp ), goto out );
}
/* Service-Information */
{
CHECK_FCT_DO( fd_msg_avp_new ( service_information, 0, &grpavp ), goto out );
/* AoC-Information */
/* IMS-Information */
{
CHECK_FCT_DO( fd_msg_avp_new ( ims_information, 0, &grpavp_sub1 ), goto out );
EN_GRPAVP_U32_("Node-Functionality", SH_VND_ID, dict_obj_tmp, 6, grpavp_sub1)
struct dict_object *event_type = NULL;
SEARCH_AVP_("Event-Type", SH_VND_ID, &event_type);
CHECK_FCT_DO( fd_msg_avp_new ( event_type, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_STR("SIP-Method", SH_VND_ID, dict_obj_tmp, "INVITE", grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
EN_GRPAVP_U32_("Role-of-Node", SH_VND_ID, dict_obj_tmp, 0, grpavp_sub1)
EN_GRPAVP_STR("User-Session-Id", SH_VND_ID, dict_obj_tmp, "sbccOVeV.003P3wh421n1w0HG3ezL@192.168.200.2", grpavp_sub1)
/* Time-Stamps */
CHECK_FCT_DO( fd_msg_avp_new ( time_stamps, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_STR("SIP-Request-Timestamp", SH_VND_ID, dict_obj_tmp, "3580", grpavp_sub2)
EN_GRPAVP_STR("SIP-Response-Timestamp", SH_VND_ID, dict_obj_tmp, "3580", grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
/* Inter-Operator-Identifier */
struct dict_object *inter_operator_identifier = NULL;
SEARCH_AVP_("Inter-Operator-Identifier", SH_VND_ID, &inter_operator_identifier);
CHECK_FCT_DO( fd_msg_avp_new ( inter_operator_identifier, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_STR("Originating-IOI", SH_VND_ID, dict_obj_tmp, "spectranet.com.ng", grpavp_sub2)
EN_GRPAVP_STR("Terminating-IOI", SH_VND_ID, dict_obj_tmp, "spectranet.com.ng", grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
EN_GRPAVP_STR("IMS-Charging-Identifier", SH_VND_ID, dict_obj_tmp, "286eae5698fb00530e05090ffee03c60.3580811571.1100844.12", grpavp_sub1)
EN_GRPAVP_STR("SDP-Session-Description", SH_VND_ID, dict_obj_tmp, " v=0 o=- 26967515390 IN IP4 10.10.80.80 s=SBC call c=IN IP4 10.10.80.80 t=0 0", grpavp_sub1)
/* SDP-Media-Component */
struct dict_object *sdp_media_component = NULL;
SEARCH_AVP_("SDP-Media-Component", SH_VND_ID, &sdp_media_component);
CHECK_FCT_DO( fd_msg_avp_new ( sdp_media_component, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_STR("SDP-Media-Name", SH_VND_ID, dict_obj_tmp, "audio 19556 RTP/AVP 8 101", grpavp_sub2)
EN_GRPAVP_STR("SDP-Media-Description", SH_VND_ID, dict_obj_tmp, " a=rtpmap:8 PCMA/8000 a=rtpmap:101 telephone-event/8000 a=fmtp:101 0-15 a=ptime:20 a=sendrecv", grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
/* Message-Body */
struct dict_object *message_body = NULL;
SEARCH_AVP_("Message-Body", SH_VND_ID, &message_body);
CHECK_FCT_DO( fd_msg_avp_new ( message_body, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_STR("Content-Type", SH_VND_ID, dict_obj_tmp, "application/sdp", grpavp_sub2)
EN_GRPAVP_U32_("Content-Length", SH_VND_ID, dict_obj_tmp, 22, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
LOG_D("fj CCR Message-Body Ok\n");
}
EN_GRPAVP_STR("Access-Network-Information", SH_VND_ID, dict_obj_tmp, " XDSL;'location-info=10.10.80.80'", grpavp_sub1)
EN_GRPAVP_STR("Calling-Party-Address", SH_VND_ID, dict_obj_tmp, " tel:+23412340001", grpavp_sub1)
EN_GRPAVP_STR("Called-Party-Address", SH_VND_ID, dict_obj_tmp, " tel:+23412340020", grpavp_sub1)
EN_GRPAVP_STR("Requested-Party-Address", SH_VND_ID, dict_obj_tmp, " tel:012340020", grpavp_sub1)
EN_GRPAVP_U32_("huawei_avp_20820", 2011, dict_obj_tmp, 0, grpavp_sub1)
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out );
}
/* PS-Information */
struct dict_object *ps_information = NULL;
SEARCH_AVP_("PS-Information", SH_VND_ID, &ps_information);
{
CHECK_FCT_DO( fd_msg_avp_new ( ps_information, 0, &grpavp_sub1 ), goto out );
EN_GRPAVP_U32_("3GPP-Charging-Id", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub1);
EN_GRPAVP_U32_("PDN-Connection-ID", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub1);
EN_GRPAVP_STR("Node-Id", SH_VND_ID, dict_obj_tmp, "Node-Id", grpavp_sub1);
EN_GRPAVP_U32_("3GPP-PDP-Type", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub1);
EN_GRPAVP_STR("PDP-Address", SH_VND_ID, dict_obj_tmp, "10.10.10.10", grpavp_sub1);
EN_GRPAVP_U32_("Dynamic-Address-Flag", SH_VND_ID, dict_obj_tmp, 4, grpavp_sub1);
/* QoS-Information */
struct dict_object *qos_information = NULL;
SEARCH_AVP_("QoS-Information", SH_VND_ID, &qos_information);
CHECK_FCT_DO( fd_msg_avp_new ( qos_information, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_U32_("QoS-Class-Identifier", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub2)
EN_GRPAVP_U32_("Max-Requested-Bandwidth-UL", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub2)
EN_GRPAVP_U32_("Guaranteed-Bitrate-UL", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub2)
EN_GRPAVP_U32_("Guaranteed-Bitrate-DL", SH_VND_ID, dict_obj_tmp, 4, grpavp_sub2)
EN_GRPAVP_STR("Bearer-Identifier", SH_VND_ID, dict_obj_tmp, "Bearer-Identifier", grpavp_sub2)
/* Allocation-Retention-Priority */
struct dict_object *allocation_retention_priority = NULL;
SEARCH_AVP_("Allocation-Retention-Priority", SH_VND_ID, &allocation_retention_priority);
CHECK_FCT_DO( fd_msg_avp_new ( allocation_retention_priority, 0, &grpavp_sub3 ), goto out);
{
EN_GRPAVP_U32_("Priority-Level", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub3)
EN_GRPAVP_U32_("Pre-emption-Capability", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub3)
EN_GRPAVP_U32_("Pre-emption-Vulnerability", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub3)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub2, MSG_BRW_LAST_CHILD, grpavp_sub3 ), goto out );
}
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-UL", SH_VND_ID, dict_obj_tmp, 5, grpavp_sub2)
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-DL", SH_VND_ID, dict_obj_tmp, 6, grpavp_sub2)
/* Conditional-APN-Aggregate-Max-Bitrate */
struct dict_object *conditional_apn_aggregate_max_btrate = NULL;
SEARCH_AVP_("Conditional-APN-Aggregate-Max-Bitrate", SH_VND_ID, &conditional_apn_aggregate_max_btrate);
CHECK_FCT_DO( fd_msg_avp_new ( conditional_apn_aggregate_max_btrate, 0, &grpavp_sub3 ), goto out);
{
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-UL", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub3)
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-DL", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub3)
EN_GRPAVP_U32_("IP-CAN-Type", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub3)
EN_GRPAVP_U32_("RAT-Type", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub3)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub2, MSG_BRW_LAST_CHILD, grpavp_sub3 ), goto out );
}
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
EN_GRPAVP_STR("SGSN-Address", SH_VND_ID, dict_obj_tmp, "10.10.10.10", grpavp_sub1);
EN_GRPAVP_STR("GGSN-Address", SH_VND_ID, dict_obj_tmp, "10.10.10.10", grpavp_sub1);
EN_GRPAVP_STR("SGW-Address", SH_VND_ID, dict_obj_tmp, "10.10.10.10", grpavp_sub1);
EN_GRPAVP_STR("CG-Address", SH_VND_ID, dict_obj_tmp, "10.10.10.10", grpavp_sub1);
EN_GRPAVP_U32_("Serving-Node-Type", SH_VND_ID, dict_obj_tmp, 4, grpavp_sub1);
EN_GRPAVP_U32_("SGW-Change", SH_VND_ID, dict_obj_tmp, 4, grpavp_sub1);
EN_GRPAVP_STR("3GPP-IMSI-MCC-MNC", SH_VND_ID, dict_obj_tmp, "3GPP-IMSI-MCC-MNC", grpavp_sub1);
EN_GRPAVP_U32_("IMSI-Unauthenticated-Flag", SH_VND_ID, dict_obj_tmp, 4, grpavp_sub1);
EN_GRPAVP_STR("3GPP-GGSN-MCC-MNC", SH_VND_ID, dict_obj_tmp, "3GPP-GGSN-MCC-MNC", grpavp_sub1);
EN_GRPAVP_STR("3GPP-NSAPI", SH_VND_ID, dict_obj_tmp, "3GPP-NSAPI", grpavp_sub1);
EN_GRPAVP_STR("Called-Station-Id", 0, dict_obj_tmp, "Called-Station-Id", grpavp_sub1);
EN_GRPAVP_STR("3GPP-Session-Stop-Indicator", SH_VND_ID, dict_obj_tmp, "3GPP-Session-Stop-Indicator", grpavp_sub1);
EN_GRPAVP_STR("3GPP-Selection-Mode", SH_VND_ID, dict_obj_tmp, "3GPP-Selection-Mode", grpavp_sub1);
EN_GRPAVP_STR("3GPP-Charging-Characteristics", SH_VND_ID, dict_obj_tmp, "3GPP-Charging-Characteristics", grpavp_sub1);
EN_GRPAVP_U32_("Charging-Characteristics-Selection-Mode", SH_VND_ID, dict_obj_tmp, 5, grpavp_sub1);
EN_GRPAVP_STR("3GPP-SGSN-MCC-MNC", SH_VND_ID, dict_obj_tmp, "3GPP-SGSN-MCC-MNC", grpavp_sub1);
EN_GRPAVP_STR("3GPP-MS-TimeZone", SH_VND_ID, dict_obj_tmp, "3GPP-MS-TimeZone", grpavp_sub1);
EN_GRPAVP_STR("Charging-Rule-Base-Name", SH_VND_ID, dict_obj_tmp, "Charging-Rule-Base-Name", grpavp_sub1);
EN_GRPAVP_STR("3GPP-User-Location-Info", SH_VND_ID, dict_obj_tmp, "3GPP-User-Location-Info", grpavp_sub1);
/* User-CSG-Information */
struct dict_object *user_csg_information = NULL;
SEARCH_AVP_("User-CSG-Information", SH_VND_ID, &user_csg_information);
CHECK_FCT_DO( fd_msg_avp_new ( user_csg_information, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_U32_("CSG-Id", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub2)
EN_GRPAVP_U32_("CSG-Access-Mode", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub2)
EN_GRPAVP_U32_("CSG-Membership-Indication", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
EN_GRPAVP_STR("3GPP2-BSID", 5535, dict_obj_tmp, "3GPP2-BSID", grpavp_sub1);
EN_GRPAVP_STR("3GPP-RAT-Type", SH_VND_ID, dict_obj_tmp, "3GPP-RAT-Type", grpavp_sub1);
/* PS-Furnish-Charging-Information */
struct dict_object *ps_furnish_charging_information = NULL;
SEARCH_AVP_("PS-Furnish-Charging-Information", SH_VND_ID, &ps_furnish_charging_information);
CHECK_FCT_DO( fd_msg_avp_new ( ps_furnish_charging_information, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_STR("PS-Free-Format-Data", SH_VND_ID, dict_obj_tmp, "PS-Free-Format-Data", grpavp_sub2)
EN_GRPAVP_U32_("PS-Append-Free-Format-Data", SH_VND_ID, dict_obj_tmp, 22, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
EN_GRPAVP_U32_("PDP-Context-Type", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub1);
LOG_D("fj CCR PDP-Context-Type Ok\n");
/* Offline-Charging */
struct dict_object *offline_charging = NULL;
SEARCH_AVP_("Offline-Charging", SH_VND_ID, &offline_charging);
CHECK_FCT_DO( fd_msg_avp_new ( offline_charging, 0, &grpavp_sub2 ), goto out);
{
EN_GRPAVP_U32_("Quota-Consumption-Time", SH_VND_ID, dict_obj_tmp, 22, grpavp_sub2)
/* Time-Quota-Mechanism */
struct dict_object *time_quota_mechanism = NULL;
SEARCH_AVP_("Time-Quota-Mechanism", SH_VND_ID, &time_quota_mechanism);
CHECK_FCT_DO( fd_msg_avp_new ( time_quota_mechanism, 0, &grpavp_sub3 ), goto out);
{
EN_GRPAVP_U32_("Time-Quota-Type", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub3)
EN_GRPAVP_U32_("Base-Time-Interval", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub3)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub2, MSG_BRW_LAST_CHILD, grpavp_sub3 ), goto out );
}
EN_GRPAVP_U32_("Envelope-Reporting", SH_VND_ID, dict_obj_tmp, 22, grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
/* Traffic-Data-Volumes */
struct dict_object *traffic_data_volumes = NULL;
SEARCH_AVP_("Traffic-Data-Volumes", SH_VND_ID, &traffic_data_volumes);
CHECK_FCT_DO( fd_msg_avp_new ( traffic_data_volumes, 0, &grpavp_sub2 ), goto out );
{
/* QoS-Information */
struct dict_object *qos_information = NULL;
SEARCH_AVP_("QoS-Information", SH_VND_ID, &qos_information);
CHECK_FCT_DO( fd_msg_avp_new ( qos_information, 0, &grpavp_sub3 ), goto out);
{
EN_GRPAVP_U32_("QoS-Class-Identifier", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub3)
EN_GRPAVP_U32_("Max-Requested-Bandwidth-UL", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub3)
EN_GRPAVP_U32_("Guaranteed-Bitrate-UL", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub3)
EN_GRPAVP_U32_("Guaranteed-Bitrate-DL", SH_VND_ID, dict_obj_tmp, 4, grpavp_sub3)
EN_GRPAVP_STR("Bearer-Identifier", SH_VND_ID, dict_obj_tmp, "Bearer-Identifier", grpavp_sub3)
/* Allocation-Retention-Priority */
struct dict_object *allocation_retention_priority = NULL;
SEARCH_AVP_("Allocation-Retention-Priority", SH_VND_ID, &allocation_retention_priority);
CHECK_FCT_DO( fd_msg_avp_new ( allocation_retention_priority, 0, &grpavp_sub4 ), goto out);
{
EN_GRPAVP_U32_("Priority-Level", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub4)
EN_GRPAVP_U32_("Pre-emption-Capability", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub4)
EN_GRPAVP_U32_("Pre-emption-Vulnerability", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub4)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub3, MSG_BRW_LAST_CHILD, grpavp_sub4 ), goto out );
}
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-UL", SH_VND_ID, dict_obj_tmp, 5, grpavp_sub3)
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-DL", SH_VND_ID, dict_obj_tmp, 6, grpavp_sub3)
/* Conditional-APN-Aggregate-Max-Bitrate */
struct dict_object *conditional_apn_aggregate_max_btrate = NULL;
SEARCH_AVP_("Conditional-APN-Aggregate-Max-Bitrate", SH_VND_ID, &conditional_apn_aggregate_max_btrate);
CHECK_FCT_DO( fd_msg_avp_new ( conditional_apn_aggregate_max_btrate, 0, &grpavp_sub4 ), goto out);
{
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-UL", SH_VND_ID, dict_obj_tmp, 1, grpavp_sub4)
EN_GRPAVP_U32_("APN-Aggregate-Max-Bitrate-DL", SH_VND_ID, dict_obj_tmp, 2, grpavp_sub4)
EN_GRPAVP_U32_("IP-CAN-Type", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub4)
EN_GRPAVP_U32_("RAT-Type", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub4)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub3, MSG_BRW_LAST_CHILD, grpavp_sub4 ), goto out );
}
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub2, MSG_BRW_LAST_CHILD, grpavp_sub3 ), goto out );
}
EN_GRPAVP_U64_("Accounting-Input-Octets", 0, dict_obj_tmp, 1, grpavp_sub2)
EN_GRPAVP_U64_("Accounting-Input-Packets", 0, dict_obj_tmp, 2, grpavp_sub2)
EN_GRPAVP_U64_("Accounting-Output-Octets", 0, dict_obj_tmp, 3, grpavp_sub2)
EN_GRPAVP_U64_("Accounting-Output-Packets", 0, dict_obj_tmp, 4, grpavp_sub2)
EN_GRPAVP_U32_("Change-Condition", SH_VND_ID, dict_obj_tmp, 5, grpavp_sub2)
EN_GRPAVP_STR("Change-Time", SH_VND_ID, dict_obj_tmp, "1111", grpavp_sub2)
EN_GRPAVP_STR("3GPP-User-Location-Info", SH_VND_ID, dict_obj_tmp, "3GPP-User-Location-Info", grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
/* Service-Data-Container */
/* User-Equipment-Info */
struct dict_object *user_equipment_info = NULL;
SEARCH_AVP_("User-Equipment-Info", 0, &user_equipment_info);
CHECK_FCT_DO( fd_msg_avp_new ( user_equipment_info, 0, &grpavp_sub2 ), goto out );
{
EN_GRPAVP_U32_("User-Equipment-Info-Type", 0, dict_obj_tmp, 1, grpavp_sub2)
EN_GRPAVP_STR("User-Equipment-Info-Value", 0, dict_obj_tmp, "User-Equipment-Info-Value", grpavp_sub2)
CHECK_FCT_DO( fd_msg_avp_add( grpavp_sub1, MSG_BRW_LAST_CHILD, grpavp_sub2 ), goto out );
}
/* Terminal-Information */
EN_GRPAVP_STR("Start-Time", SH_VND_ID, dict_obj_tmp, "2016-08-10T19:09:30-05:00", grpavp_sub1);
EN_GRPAVP_STR("Stop-Time", SH_VND_ID, dict_obj_tmp, "2016-08-10T19:09:30-05:00 ", grpavp_sub1);
EN_GRPAVP_U32_("Change-Condition", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub1);
EN_GRPAVP_U32_("Diagnostics", SH_VND_ID, dict_obj_tmp, 3, grpavp_sub1);
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out );
}
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, grpavp ), goto out );
LOG_D("fj CCR Service-Information Ok\n");
}
/* Service-Identifier */
EN_AVP_U32(service_identifier, 65534, req, "fj CCR Service-Identifier");
/* Multiple-Services-Indicator */
EN_AVP_U32(multiple_services_indicator, 1, req, "fj CCR Multiple-Services-Indicator");
/* Multiple-Services-Credit-Control */
{
CHECK_FCT_DO( fd_msg_avp_new ( multiple_services_credit_control, 0, &grpavp ), goto out);
/* Requested-Service-Unit */
{
CHECK_FCT_DO( fd_msg_avp_new ( requested_service_unit, 0, &grpavp_sub1 ), goto out);
EN_GRPAVP_U32_("CC-Time", 0, dict_obj_tmp, 60, grpavp_sub1)
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out);
}
/* Used-Service-Unit */
struct dict_object* used_service_unit = NULL;
SEARCH_AVP_("Used-Service-Unit", 0, &used_service_unit);
{
CHECK_FCT_DO( fd_msg_avp_new ( used_service_unit, 0, &grpavp_sub1 ), goto out);
EN_GRPAVP_U32_("CC-Time", 0, dict_obj_tmp, 0, grpavp_sub1)
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out);
}
EN_GRPAVP_U32("Reporting-Reason", SH_VND_ID, reporting_reason, 0);
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, grpavp ), goto out );
}
/* CC-Correlation-Id */
/* User-Equipment-Info */
#if 0
switch(gx_sm->state) {
case STATE_INIT:
{
//Set Bearer-Usage
//TODO Change this to use enum object
CHECK_FCT_DO( fd_msg_avp_new ( bearer_usage, 0, &avp ), goto out );
val.i32 = 1;//IMS
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, avp ), goto out );
}
{
//Set Packet Filter Operation
//TODO Change this to use enum object
CHECK_FCT_DO( fd_msg_avp_new ( pflt_oper, 0, &avp ), goto out );
val.i32 = 1;//ADDITION
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, avp ), goto out );
}
struct avp *flt_info = NULL;
{
//Set Packet Filter Information
CHECK_FCT_DO( fd_msg_avp_new ( pflt_info, 0, &flt_info ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, flt_info ), goto out );
}
// Set Packet Filter Identity
{
CHECK_FCT_DO( fd_msg_avp_new ( pflt_id, 0, &avp ), goto out );
val.os.data = (unsigned char *)("ID");
val.os.len = strlen("ID");
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), goto out );
if(flt_info) {
CHECK_FCT_DO( fd_msg_avp_add( flt_info, MSG_BRW_LAST_CHILD, avp ), goto out );
}else {
printf("flt_info NULL\n");
}
}
CHECK_FCT(fd_sess_state_store(g_hdlr, sess, &gx_sm));
break;
case STATE_FINAL:
{
//Set Packet Filter Operation
//TODO Change this to use enum object
CHECK_FCT_DO( fd_msg_avp_new ( term_cause, 0, &avp ), goto out );
val.i32 = 1;//Diameter logout
CHECK_FCT_DO( fd_msg_avp_setvalue( avp, &val ), goto out );
CHECK_FCT_DO( fd_msg_avp_add( req, MSG_BRW_LAST_CHILD, avp ), goto out );
}
break;
default:
printf("State mismatch \n");
}
#else
/* fj added 20160828: this allow send more than once */
// CHECK_FCT(fd_sess_state_store(g_hdlr, sess, &gx_sm));
#endif
fflush(stderr);
/* Send the request */
printf("CCA %p\n",req);
// Everthing Done Store the state: reply should retreive it
CHECK_FCT_DO( fd_msg_send( &req, gx_rec_cca, NULL ), goto out );
out:
return 0;
}
/* Dummy ccr which :
Read the cc-req-type && cc-req-number from the msg and stick it back
in the reply
*/
int gx_handle_ccr_from_client_getport(char *cxt_id, struct gy_msg *gy_ptr)
{
int sh_port, app_port=INVALID_GY_PORT;
struct gy_port *gy_port_ptr = NULL;
gx_stat_increase_recv_ccr(gy_ptr->request_type);
if(gy_ptr->request_type == RT_INITIAL_REQUEST ||
gy_ptr->request_type == RT_EVENT_REQUEST)
{
sh_port = gy_assign_port(cxt_id);
if(sh_port == INVALID_GY_PORT)
{
return INVALID_GY_PORT;
}
gy_port_ptr = &gy_space.gy_port[sh_port];
gy_port_ptr->service_type = gy_ptr->service_type;
}
else
{
gy_port_ptr = gy_get_port_by_cxt_id(cxt_id);
if((gy_port_ptr == NULL) || (gy_port_ptr->used_flag == 0))
{
return INVALID_GY_PORT;
}
sh_port = gy_port_ptr->index;
app_port = gy_port_ptr->app_port;
}
gy_ptr->app_port = app_port;
gy_ptr->fd_port = sh_port;
gy_port_ptr->service_type = gy_ptr->service_type;
return sh_port;
}
int gx_handle_cca_from_server(struct gy_msg *gy_ptr)
{
gx_send_cca(gy_ptr);
return 1;
}
int gx_send_ccr_from_client(struct gy_msg *gy_ptr)
{
int sh_port, app_port=INVALID_GY_PORT;
int retval = 0;
struct gy_port *gy_port_ptr = NULL;
app_port = gy_ptr->app_port;
if(gy_ptr->request_type == RT_INITIAL_REQUEST ||
gy_ptr->request_type == RT_EVENT_REQUEST)
{
char context_id[32];
sprintf(context_id, "%d", app_port);
sh_port = gy_assign_port(context_id);
if(sh_port == INVALID_GY_PORT)
{
return 0;
}
gy_port_ptr = &gy_space.gy_port[sh_port];
gy_port_ptr->app_port = app_port;
gy_port_ptr->service_type = gy_ptr->request_type;
gy_port_ptr->as_client = 1;
fd_sess_destroy(&gy_sess[sh_port]);
gy_sess[sh_port] = NULL;
}
else
{
sh_port = gy_ptr->fd_port;
if(sh_port >= INVALID_GY_PORT)
return 0;
gy_port_ptr = &gy_space.gy_port[sh_port];
}
gy_ptr->app_port = app_port;
gy_ptr->fd_port = sh_port;
gy_ptr->request_number = gy_port_ptr->request_number++;
gy_port_ptr->service_type = gy_ptr->service_type;
retval = gx_sig_hdlr_app(gy_ptr);
if(pps_debug_flag_for_fd())
{
char tmp_info[1024];
sprintf(tmp_info, "[fd=%04d][app=%04d], ts=%ld.%03ld, %s \r\nmsg_type=%d, result=%d, cxt_id=%s\r\n",
sh_port, app_port, ts_sec, ts_msec, __FUNCTION__,
gy_ptr->request_type, retval, gy_port_ptr->context_id);
pps_debug_info("diameter", tmp_info);
}
return 1;
}
int gx_release_port_for_timerout(unsigned short pid)
{
_gy_port *gy_port = NULL;
gy_port = gy_get_port_space(pid);
if(gy_port == NULL)
return 0;
if(0)
{
char tmp_info[1024];
printf(" [fd=%04d][app=%04d], ts=%ld.%03ld, %s \r\n",
pid, gy_port->app_port, ts_sec, ts_msec, __FUNCTION__);
pps_debug_info("diameter", tmp_info);
}
CHECK_POSIX_DO( pthread_mutex_lock(&gy_port_lock), { ASSERT(0); } );
if(1)
{
gy_port_init(gy_port, pid);
gy_space.used_ports --;
}
else
{
gy_release_port(pid);
}
CHECK_POSIX_DO( pthread_mutex_unlock(&gy_port_lock), { ASSERT(0); } );
return 1;
}
static int gx_rec_ccr( struct msg ** msg, struct avp * r_avp, struct session * sess, void * opaque, enum disp_action * act)
{
//struct msg *tmp_ccr_msg_ptr;
//struct msg *tmp_ccr_msg_ptr_ptr;
struct msg *ans, *qry;
struct avp *avp = NULL;
struct avp *grpavp = NULL;
struct avp *grpavp_sub1 = NULL;
union avp_value val;
// struct avp *avp = NULL;
// struct avp_hdr * avp_data;
int rc = - 1;
int fd_port = -1;
struct gy_msg gy_msg;
struct gy_msg *gy_ptr=&gy_msg;
LOG_D("%p %p %p %p", msg, r_avp, sess, act);
if (msg == NULL)
return EINVAL;
fprintf(stderr, "ECHO ccr rec from done...\n");
LOG_D("fj gx_rec_ccr enter");
memset(gy_ptr, 0x00, sizeof(_gy_msg));
gy_ptr->msg_type = GY_MSG_CCR;
#if _TEST_CCA
gx_send_cca_test();
#else
gx_parse_ccr(msg, gy_ptr);
#endif
CHECK_FCT_DO( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, msg, 0 ) , goto out);
/*
tmp_ccr_msg_ptr = *msg;
tmp_ccr_msg_ptr_ptr = msg;
*/
*act = DISP_ACT_ERROR + 1;
fd_port = gx_handle_ccr_from_client_getport(gy_ptr->cxt_id, gy_ptr);
if (pps_debug_flag_for_fd())
{
char tmp_buf[256];
sprintf(tmp_buf, "CCR received with context id=%s, fd_port=%d, app_port=%d",
gy_ptr->cxt_id, fd_port, gy_ptr->app_port);
pps_debug_info("diameter", tmp_buf);
}
if(fd_port >= INVALID_GY_PORT )
{
// add CCA fail========================================
gy_ptr->fd_port = INVALID_GY_PORT;
gy_ptr->app_port = INVALID_GY_PORT;
gy_ptr->msg_type = GY_MSG_CCA;
gy_ptr->msg_body.cca.result = 4010;
gy_ptr->msg_body.cca.check_balance_result = CBR_NO_CREDIT;
gy_ptr->msg_body.cca.grant_value = 0;
gy_ptr->msg_body.cca.volume_threshold = 0;
gy_ptr->msg_body.cca.time_threshold = 0;
gy_ptr->msg_body.cca.is_final = 0;
g_direct_cca_fail_msg_ptr = *msg;
gx_send_cca_fail(gy_ptr);// response CCA
//
return 0;
}
//CHECK_FCT_DO( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, msg, 0 ) , goto out);
if(fd_port != INVALID_GY_PORT )
{
g_ccr_msg_ptr[fd_port] = *msg;
//g_ccr_msg_ptr_ptr[fd_port] = msg;
}
//pps_recv_gy_process(gy_ptr);
pps_ro_gy_cb(gy_ptr);
/*pthread_mutex_lock( &gy_msg_mtx );
gx_add_msg_to_list(gy_ptr);
pthread_mutex_unlock( &gy_msg_mtx );*/
rc = 0;
return rc;
/* Create answer header */
qry = *msg;
CHECK_FCT_DO( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, msg, 0 ) , goto out);
ans = *msg;
/* set application id */
{
struct msg_hdr * msg_hdr = NULL;
ASSERT( 0 == fd_msg_hdr ( ans, &msg_hdr ) );
msg_hdr->msg_appl = SH_APP_ID;
msg_hdr->msg_flags = msg_hdr->msg_flags & (~CMD_FLAG_PROXIABLE);
}
/* Set the Origin-Host, Origin-Realm, Result-Code AVPs */
CHECK_FCT_DO( fd_msg_rescode_set( ans, "DIAMETER_SUCCESS", NULL, NULL, 1 ), goto out );
// Get the auth_app_id and from the reply and set it in the reply
CHECK_FCT_DO(dcca_ans_from_req( auth_app_id, qry, msg), goto out);
CHECK_FCT_DO(dcca_ans_from_req( cc_req_type, qry, msg), goto out);
CHECK_FCT_DO(dcca_ans_from_req( cc_req_num, qry, msg), goto out);
/* Multiple-Services-Credit-Control */
{
CHECK_FCT_DO( fd_msg_avp_new ( multiple_services_credit_control, 0, &grpavp ), goto out );
/* Result-Code */
struct dict_object *result_code = NULL;
EN_GRPAVP_U32("Result-Code", 0, result_code, 2001);
/* Granted-Service-Unit */
struct dict_object *granted_service_unit = NULL;
SEARCH_AVP_("Granted-Service-Unit", 0, &granted_service_unit);
{
CHECK_FCT_DO( fd_msg_avp_new ( granted_service_unit, 0, &grpavp_sub1 ), goto out );
EN_GRPAVP_U32_("CC-Time", 0, cc_time, 120, grpavp_sub1)
CHECK_FCT_DO( fd_msg_avp_add( grpavp, MSG_BRW_LAST_CHILD, grpavp_sub1 ), goto out );
LOG_D("fj CCR Granted-Service-Unit Ok\n");
}
CHECK_FCT_DO( fd_msg_avp_add( ans, MSG_BRW_LAST_CHILD, grpavp ), goto out );
LOG_D("fj CCR Multiple-Services-Credit-Control Ok\n");
}
/* Send the answer */
CHECK_FCT_DO( fd_msg_send( msg, NULL, NULL ), goto out );
rc = 0;
out:
LOG_D("fj gx_rec_ccr rc:%d exit", rc);
//Free up the memory
return rc ;
}
static void gx_rec_cca(void *para, struct msg **msg)
{
LOG_D("fj gx_rec_cca enter");
gx_parse_cca(msg);
CHECK_FCT_DO( fd_msg_free( *msg), return);
*msg = NULL;
LOG_D("fj gx_rec_cca exit");
}
int gx_stat_clean_all()
{
memset(&gy_stat, 0x00, sizeof(gy_stat));
return 1;
}
int gx_stat_increase_recv_ccr(int type)
{
gy_stat.recv_stat.ccr ++;
switch(type)
{
case RT_INITIAL_REQUEST:
gy_stat.recv_stat.ccr_init ++;
break;
case RT_UPDATE_REQUEST:
gy_stat.recv_stat.ccr_update ++;
break;
case RT_TERMINATE_REQUEST:
gy_stat.recv_stat.ccr_terminate ++;
break;
case RT_EVENT_REQUEST:
gy_stat.recv_stat.ccr_event ++;
break;
}
return 1;
}
int gx_stat_increase_send_ccr(int type)
{
gy_stat.send_stat.ccr ++;
switch(type)
{
case RT_INITIAL_REQUEST:
gy_stat.send_stat.ccr_init ++;
break;
case RT_UPDATE_REQUEST:
gy_stat.send_stat.ccr_update ++;
break;
case RT_TERMINATE_REQUEST:
gy_stat.send_stat.ccr_terminate ++;
break;
case RT_EVENT_REQUEST:
gy_stat.send_stat.ccr_event ++;
break;
}
return 1;
}
int gx_stat_increase_recv_cca(int type)
{
gy_stat.recv_stat.cca ++;
switch(type)
{
case RT_INITIAL_REQUEST:
gy_stat.recv_stat.cca_init ++;
break;
case RT_UPDATE_REQUEST:
gy_stat.recv_stat.cca_update ++;
break;
case RT_TERMINATE_REQUEST:
gy_stat.recv_stat.cca_terminate ++;
break;
case RT_EVENT_REQUEST:
gy_stat.recv_stat.cca_event ++;
break;
}
return 1;
}
int gx_stat_increase_send_cca(int type)
{
gy_stat.send_stat.cca ++;
switch(type)
{
case RT_INITIAL_REQUEST:
gy_stat.send_stat.cca_init ++;
break;
case RT_UPDATE_REQUEST:
gy_stat.send_stat.cca_update ++;
break;
case RT_TERMINATE_REQUEST:
gy_stat.send_stat.cca_terminate ++;
break;
case RT_EVENT_REQUEST:
gy_stat.send_stat.cca_event ++;
break;
}
return 1;
}
int gx_print_all_port_status()
{
int loop=0;
FILE *fpStatus=NULL;
fpStatus = fopen("../log/fd_state.txt","w");
if(fpStatus == NULL)
return 0;
fprintf(fpStatus,"start ts=%ld, now ts=%ld\r\n", gx_start_ts, ts_sec);
for(loop=0; loop<MAX_GY_PORT; loop++)
{
if(gy_space.gy_port[loop].used_flag == 1)
{
fprintf(fpStatus,"[%04d].update_ts=%ld, duration=%ld(s)\r\n",
loop,
gy_space.gy_port[loop].updated_ts,
ts_sec - gy_space.gy_port[loop].updated_ts);
}
}
fclose(fpStatus);
return 1;
}
int gx_print_stat()
{
char buf[1024], tmp_buf[128], buf_value[10][128];
sprintf(buf,"%12s %8s %8s\r\n"," ","Send","Recv");
sprintf(tmp_buf,"%s\r\n","--------------------------------------------------------");
strcat(buf, tmp_buf);
sprintf(buf_value[0],"%d", gy_stat.send_stat.ccr);
sprintf(buf_value[1],"%d", gy_stat.recv_stat.ccr);
sprintf(tmp_buf,"%12s %8s %8s\r\n","CCR", buf_value[0], buf_value[1]);
strcat(buf, tmp_buf);
sprintf(buf_value[0],"%d", gy_stat.send_stat.ccr_init);
sprintf(buf_value[1],"%d", gy_stat.recv_stat.ccr_init);
sprintf(tmp_buf,"%12s %8s %8s\r\n","CCR_Init", buf_value[0], buf_value[1]);
strcat(buf, tmp_buf);
sprintf(buf_value[0],"%d", gy_stat.send_stat.ccr_update);
sprintf(buf_value[1],"%d", gy_stat.recv_stat.ccr_update);
sprintf(tmp_buf,"%12s %8s %8s\r\n","CCR_Update", buf_value[0], buf_value[1]);
strcat(buf, tmp_buf);
sprintf(buf_value[0],"%d", gy_stat.send_stat.ccr_terminate);
sprintf(buf_value[1],"%d", gy_stat.recv_stat.ccr_terminate);
sprintf(tmp_buf,"%12s %8s %8s\r\n","CCR_Term", buf_value[0], buf_value[1]);
strcat(buf, tmp_buf);
sprintf(buf_value[0],"%d", gy_stat.send_stat.ccr_event);
sprintf(buf_value[1],"%d", gy_stat.recv_stat.ccr_event);
sprintf(tmp_buf,"%12s %8s %8s\r\n","CCR_Event", buf_value[0], buf_value[1]);
strcat(buf, tmp_buf);
sprintf(tmp_buf,"%s\r\n","--------------------------------------------------------");
strcat(buf, tmp_buf);
sprintf(buf_value[0],"%d", gy_stat.send_stat.cca);
sprintf(buf_value[1],"%d", gy_stat.recv_stat.cca);
sprintf(tmp_buf,"%12s %8s %8s\r\n","CCA", buf_value[0], buf_value[1]);
strcat(buf, tmp_buf);
sprintf(buf_value[0],"%d", gy_stat.send_stat.cca_init);
sprintf(buf_value[1],"%d", gy_stat.recv_stat.cca_init);
sprintf(tmp_buf,"%12s %8s %8s\r\n","CCA_Init", buf_value[0], buf_value[1]);
strcat(buf, tmp_buf);
sprintf(buf_value[0],"%d", gy_stat.send_stat.cca_update);
sprintf(buf_value[1],"%d", gy_stat.recv_stat.cca_update);
sprintf(tmp_buf,"%12s %8s %8s\r\n","CCA_Update", buf_value[0], buf_value[1]);
strcat(buf, tmp_buf);
sprintf(buf_value[0],"%d", gy_stat.send_stat.cca_terminate);
sprintf(buf_value[1],"%d", gy_stat.recv_stat.cca_terminate);
sprintf(tmp_buf,"%12s %8s %8s\r\n","CCA_Term", buf_value[0], buf_value[1]);
strcat(buf, tmp_buf);
sprintf(buf_value[0],"%d", gy_stat.send_stat.cca_event);
sprintf(buf_value[1],"%d", gy_stat.recv_stat.cca_event);
sprintf(tmp_buf,"%12s %8s %8s\r\n","CCA_Event", buf_value[0], buf_value[1]);
strcat(buf, tmp_buf);
pps_debug_info("diameter", buf);
return 1;
}
int gx_clear_all_port_for_timeout()
{
static int fd_timer_counter = 0;
register int fd_loop=0;
int index;
long updated_ts=0;
if(fd_timer_counter ++ % 100)//every second
return 0;
for(fd_loop=0; fd_loop<MAX_GY_PORT; fd_loop++)
{
index = fd_loop;
if(gy_space.gy_port[index].used_flag == 1)
{
updated_ts = gy_space.gy_port[index].updated_ts;
if(gy_space.gy_port[index].as_client == 1)
{
if(gy_space.gy_port[index].service_type == ST_CS_SMS)
{
if( (ts_sec - updated_ts ) > 10) //timeout for SMS
{
gx_release_port_for_timerout(index);
}
}
else
{
if( ( ts_sec - updated_ts ) >1800 ) //half hour
{
gx_release_port_for_timerout(index);
}
}
}
else
{
if(( ts_sec - updated_ts) > 1800) //half hour
{
gx_release_port_for_timerout(index);
}
}
}
}
return 1;
}
int gx_fsm(long sec, int msec)
{
ts_sec = sec;
ts_msec = msec;
if(gx_start_ts<=1)
gx_start_ts = sec;
return gx_clear_all_port_for_timeout();
}
// *********************************************************************
/*#define MAX_GY_MSG_NUM 8192
#define MAX_HANDLED_GY_MSG_PER_CYCLE 100
typedef struct
{
unsigned int header;
unsigned int tailer;
_gy_msg msg[MAX_GY_MSG_NUM];
}GY_MSG_LIST;
GY_MSG_LIST gy_msg_list = {0, 0, };
static int gx_add_msg_to_list(_gy_msg *pInMsg)
{
_gy_msg *pMsg = NULL;
if (pInMsg == NULL)
{
return -1;
}
if(((gy_msg_list.tailer+1) % MAX_GY_MSG_NUM) == gy_msg_list.header)
{
return -1;
}
pMsg = &gy_msg_list.msg[gy_msg_list.tailer];
memcpy(pMsg, pInMsg, sizeof(_gy_msg));
gy_msg_list.tailer = (gy_msg_list.tailer+1) % MAX_GY_MSG_NUM;
return 0;
}
static int gx_get_msg_from_list(_gy_msg *pOutMsg)
{
_gy_msg *pMsg = NULL;
if (pOutMsg == NULL)
{
return -1;
}
if (gy_msg_list.header != gy_msg_list.tailer)
{
pMsg = &gy_msg_list.msg[gy_msg_list.header];
memcpy(pOutMsg, pMsg, sizeof(_gy_msg));
gy_msg_list.header = (gy_msg_list.header+1) % (MAX_GY_MSG_NUM);
return 0;
}
return -1;
}
void gx_handle_msg_cb()
{
int i, ret;
_gy_msg gy_msg, *gy_ptr;
gy_ptr = &gy_msg;
for (i=0; i<MAX_HANDLED_GY_MSG_PER_CYCLE; i++)
{
pthread_mutex_lock( &gy_msg_mtx );
ret = gx_get_msg_from_list(gy_ptr);
pthread_mutex_unlock( &gy_msg_mtx );
if (ret < 0)
{
break;
}
pps_recv_gy_process(gy_ptr);
}
return ;
}*/