Exemple #1
0
/**
 * Encode a dialog into a binary form
 * @param x - binary data to append to
 * @param u - the dialog to encode
 * @returns 1 on succcess or 0 on error
 */
int bin_encode_s_dialog(bin_data *x,s_dialog *d)
{
	char ch;
	if (!bin_encode_str(x,&(d->call_id))) goto error;
	ch = d->direction;
	if (!bin_encode_char(x,ch)) goto error;
	
	if (!bin_encode_str(x,&(d->aor))) goto error;
	
	ch = d->method;
	if (!bin_encode_char(x,ch)) goto error;	
	if (!bin_encode_str(x,&(d->method_str))) goto error;
	
	if (!bin_encode_int(x,d->first_cseq)) goto error;	
	if (!bin_encode_int(x,d->last_cseq)) goto error;	

	ch = d->state;
	if (!bin_encode_char(x,ch)) goto error;	

	if (!bin_encode_time_t(x,d->expires)) goto error;
	
	if (!bin_encode_uchar(x,d->is_releasing)) goto error;
	if (!bin_encode_dlg_t(x,d->dialog_c)) goto error;	
	if (!bin_encode_dlg_t(x,d->dialog_s)) goto error;
	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_s_dialog: Error while encoding.\n");
	return 0;		
}
/**
 * Encode an security into a binary form
 * @param x - binary data to append to
 * @param s - the r_security to encode
 * @returns 1 s succcess or 0 on error
 */
int bin_encode_r_security(bin_data *x,r_security *s)
{
	if (!s){
		if (!bin_encode_char(x,0)) goto error;
		return 1;
	}
	
	if (!bin_encode_char(x,1)) goto error;

	if (!bin_encode_str(x,&(s->sec_header))) goto error;	
	if (!bin_encode_int(x,s->type)) goto error;
	switch (s->type){		
		case SEC_NONE:
			break;
		case SEC_TLS:
			if (!bin_encode_tls(x,s->data.tls)) goto error;
			break;
		case SEC_IPSEC:
			if (!bin_encode_ipsec(x,s->data.ipsec)) goto error;
			break;		
	}	
	if (!bin_encode_int(x,s->q*1000)) goto error; /* yeah yeah.... */
	
	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_r_security: Error while encoding.\n");
	return 0;		
}
Exemple #3
0
/**
 *	Encode and Append a Filter Criteria
 * @param x - binary data to append to
 * @param spt - the service point trigger to encode
 * @returns 1 on succcess or 0 on error
 */
static int bin_encode_filter_criteria(bin_data *x, ims_filter_criteria *fc)
{
	int i;
	char ppindicator;

	//priority
	if (!bin_encode_int(x,fc->priority)) goto error;
	
	//profile part indicator
	if (fc->profile_part_indicator) ppindicator = (*fc->profile_part_indicator)+1;
	else ppindicator = 0;
	if (!bin_encode_char(x,ppindicator)) goto error;
			
	// trigger point 
	if (fc->trigger_point) {
		if (!bin_encode_char(x,fc->trigger_point->condition_type_cnf)) goto error;
		
		if (!bin_encode_ushort(x,fc->trigger_point->spt_cnt)) goto error;
		
		for(i=0;i<fc->trigger_point->spt_cnt;i++)
			if (!bin_encode_spt(x,fc->trigger_point->spt+i)) goto error;
	} else {
		if (!bin_encode_char(x,100)) goto error;
	}
	
	//app server
	if (!bin_encode_str(x,&(fc->application_server.server_name))) goto error;
	if (!bin_encode_char(x,fc->application_server.default_handling)) goto error;
	if (!bin_encode_str(x,&(fc->application_server.service_info))) goto error;
	
	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_filter_criteria: Error while encoding.\n");
	return 0;		
}
/**
 * Encode an ipsec into a binary form
 * @param x - binary data to append to
 * @param ipsec - the r_ipsec to encode
 * @returns 1 on succcess or 0 on error
 */
int bin_encode_ipsec(bin_data *x,r_ipsec *ipsec)
{
	if (!ipsec){
		if (!bin_encode_char(x,0)) goto error;
		return 1;
	}
	
	if (!bin_encode_char(x,1)) goto error;

	if (!bin_encode_uint(x,ipsec->spi_uc)) goto error;
	if (!bin_encode_uint(x,ipsec->spi_us)) goto error;
	if (!bin_encode_uint(x,ipsec->spi_pc)) goto error;
	if (!bin_encode_uint(x,ipsec->spi_ps)) goto error;
	if (!bin_encode_ushort(x,ipsec->port_uc)) goto error;
	if (!bin_encode_ushort(x,ipsec->port_us)) goto error;
	
	if (!bin_encode_str(x,&(ipsec->ealg))) goto error;
	if (!bin_encode_str(x,&(ipsec->r_ealg))) goto error;
	if (!bin_encode_str(x,&(ipsec->ck))) goto error;
	if (!bin_encode_str(x,&(ipsec->alg))) goto error;
	if (!bin_encode_str(x,&(ipsec->r_alg))) goto error;
	if (!bin_encode_str(x,&(ipsec->ik))) goto error;

	if (!bin_encode_str(x,&(ipsec->prot))) goto error;
	if (!bin_encode_str(x,&(ipsec->mod))) goto error;
	
	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_ipsec: Error while encoding.\n");
	return 0;		
}
Exemple #5
0
/**
 * Encode a r_public into a binary form
 * @param x - binary data to append to
 * @param p - the r_public to encode
 * @returns 1 on succcess or 0 on error
 */
int bin_encode_r_public(bin_data *x,r_public *p)
{
	unsigned short k;
	char ch;
	r_contact *c=0;
	r_subscriber *s=0;
	
	if (!bin_encode_str(x,&(p->aor))) goto error;
	if (!bin_encode_str(x,&(p->early_ims_ip))) goto error;	
	ch = p->reg_state;
	if (!bin_encode_char(x,ch)) goto error;
	if (!bin_encode_ims_subscription(x,p->s)) goto error;
	
	k=0;
	for(c=p->head;c;c=c->next)
		k++;
	if (!bin_encode_ushort(x,k)) goto error;
	for(c=p->head;c;c=c->next)
		if (!bin_encode_r_contact(x,c)) goto error;	
	
	k=0;
	for(s=p->shead;s;s=s->next)
		k++;
	if (!bin_encode_ushort(x,k)) goto error;
	for(s=p->shead;s;s=s->next)
		if (!bin_encode_r_subscriber(x,s)) goto error;	
	
	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_r_public: Error while encoding.\n");
	return 0;		
}
Exemple #6
0
/**
 *	Encode and append a SPT
 * @param x - binary data to append to
 * @param spt - the service point trigger to encode
 * @returns 1 on succcess or 0 on error
 */
static int bin_encode_spt(bin_data *x, ims_spt *spt)
{
	unsigned char c = spt->condition_negated<<7 | spt->registration_type<<4 | spt->type;
	// cond negated, reg type, spt type
	if (!bin_encode_uchar(x,c)) goto error;

	//group
	if (!bin_encode_int(x,spt->group)) goto error;

	//spt
	switch(spt->type){
		case 1:
			if (!bin_encode_str(x,&(spt->request_uri))) goto error; 
			break;
		case 2:
			if (!bin_encode_str(x,&(spt->method))) goto error; 
			break;
		case 3:
			if (!bin_encode_short(x,spt->sip_header.type)) goto error;
			if (!bin_encode_str(x,&(spt->sip_header.header))) goto error; 
			if (!bin_encode_str(x,&(spt->sip_header.content))) goto error; 
			break;
		case 4:
			if (!bin_encode_char(x,spt->session_case)) goto error;
			break;
		case 5:
			if (!bin_encode_str(x,&(spt->session_desc.line))) goto error; 
			if (!bin_encode_str(x,&(spt->session_desc.content))) goto error; 
			break;
	}
	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_spt: Error while encoding.\n");
	return 0;		
}
/**
 * Encode an tls into a binary form
 * @param x - binary data to append to
 * @param tls - the r_tls to encode
 * @returns 1 on succcess or 0 on error
 */
int bin_encode_tls(bin_data *x,r_tls *tls)
{
	if (!tls){
		if (!bin_encode_char(x,0)) goto error;
		return 1;
	}
	
	if (!bin_encode_char(x,1)) goto error;

	if (!bin_encode_ushort(x,tls->port_tls)) goto error;
	
	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_tls: Error while encoding.\n");
	return 0;		
}
Exemple #8
0
/**
 *	Encode and append a Public Indentity
 * @param x - binary data to append to
 * @param pi - the public identity to encode
 * @returns 1 on succcess or 0 on error
 */
static int bin_encode_public_identity(bin_data *x,ims_public_identity *pi)
{
	if (!bin_encode_char(x,pi->barring)) goto error;
	if (!bin_encode_str(x,&(pi->public_identity))) goto error;	
	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_public_identity: Error while encoding.\n");
	return 0;		
}
/**
 * Encode a r_contact into a binary form
 * @param x - binary data to append to
 * @param p - the r_contact to encode
 * @returns 1 on succcess or 0 on error
 */
int bin_encode_r_contact(bin_data *x,r_contact *c)
{
	int i;
	char k;
	unsigned short us;
	r_public *p=0;
	
	if (!bin_encode_str(x,&(c->host))) goto error;
	if (!bin_encode_ushort(x,c->port)) goto error;
	if (!bin_encode_char(x,c->transport)) goto error;
	
	if (!bin_encode_r_security(x,c->security_temp)) goto error;
	if (!bin_encode_r_security(x,c->security)) goto error;
	
	if (!bin_encode_str(x,&(c->uri))) goto error;
	
	k = c->reg_state;
	if (!bin_encode_char(x,k)) goto error;

	if (!bin_encode_time_t(x,c->expires)) goto error;
	
	if (!bin_encode_ushort(x,c->service_route_cnt)) goto error;
	for(i=0;i<c->service_route_cnt;i++)
		if (!bin_encode_str(x,c->service_route+i)) goto error;
		
	if (!bin_encode_pinhole(x,c->pinhole)) goto error;
	
	k = c->sos_flag;
	if (!bin_encode_char(x,k)) goto error;
	
	if (!bin_encode_str(x,&(c->pcc_session_id))) goto error;
	
	us=0;
	for(p=c->head;p;p=p->next)
		us++;
	if (!bin_encode_ushort(x,us)) goto error;
	for(p=c->head;p;p=p->next)
		if (!bin_encode_r_public(x,p)) goto error;	
	
	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_r_contact: Error while encoding.\n");
	return 0;		
}
Exemple #10
0
/**
 * Encode a r_public into a binary form
 * @param x - binary data to append to
 * @param p - the r_public to encode
 * @returns 1 on succcess or 0 on error
 */
int bin_encode_r_public(bin_data *x,r_public *p)
{
	char c;
	if (!bin_encode_str(x,&(p->aor))) goto error;
	c = p->is_default;
	if (!bin_encode_char(x,c)) goto error;
	
	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_r_public: Error while encoding.\n");
	return 0;		
}
Exemple #11
0
/**
 * Encode a r_subscriber into a binary form
 * @param x - binary data to append to
 * @param s - the r_subscriber to encode
 * @returns 1 on succcess or 0 on error
 */
int bin_encode_r_subscriber(bin_data *x,r_subscriber *s)
{
	if (!bin_encode_str(x,&(s->subscriber))) goto error;
	if (!bin_encode_char(x,s->event)) goto error;
	if (!bin_encode_time_t(x,s->expires)) goto error;
	if (!bin_encode_dlg_t(x,s->dialog)) goto error;
	if (!bin_encode_int(x,s->version)) goto error;

	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_r_subscriber: Error while encoding.\n");
	return 0;		
}
Exemple #12
0
/**
 * Encode a pinhole into a binary form
 * @param x - binary data to append to
 * @param u - the dialog to encode
 * @returns 1 on succcess or 0 on error
 */
int bin_encode_pinhole(bin_data *x,r_nat_dest *pinhole)
{
	if (!pinhole){
		if (!bin_encode_char(x,0)) goto error;
		return 1;
	}
	
	if (!bin_encode_char(x,1)) goto error;

	if (!bin_encode_uint(x,pinhole->nat_addr.af)) goto error;
	if (!bin_encode_uint(x,pinhole->nat_addr.len)) goto error;
	if (!bin_encode_uint(x,pinhole->nat_addr.u.addr32[0])) goto error;
	if (!bin_encode_uint(x,pinhole->nat_addr.u.addr32[1])) goto error;
	if (!bin_encode_uint(x,pinhole->nat_addr.u.addr32[2])) goto error;
	if (!bin_encode_uint(x,pinhole->nat_addr.u.addr32[3])) goto error;
	
	if (!bin_encode_ushort(x,pinhole->nat_port)) goto error;
	
	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_pinhole: Error while encoding.\n");
	return 0;		
}
Exemple #13
0
/**
 * Encode an authentication vector into a binary form
 * @param x - binary data to append to
 * @param v - the authentication vector to encode
 * @returns 1 on succcess or 0 on error
 */
 int bin_encode_auth_vector(bin_data *x,auth_vector *v)
{
	char ch;
	if (!bin_encode_int(x,v->item_number)) goto error;
	if (!bin_encode_uchar(x,v->type)) goto error;
	if (!bin_encode_str(x,&(v->authenticate))) goto error;
	if (!bin_encode_str(x,&(v->authorization))) goto error;
	if (!bin_encode_str(x,&(v->ck))) goto error;
	if (!bin_encode_str(x,&(v->ik))) goto error;
	if (!bin_encode_time_t(x,v->expires)) goto error;
	ch = v->status;
	if (!bin_encode_char(x,ch)) goto error;

	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_auth_vector: Error while encoding.\n");
	return 0;		
}
Exemple #14
0
/**
 * Encode a r_subscription into a binary form
 * @param x - binary data to append to
 * @param p - the r_subscription to encode
 * @returns 1 on succcess or 0 on error
 */
int bin_encode_r_subscription(bin_data *x,r_subscription *s)
{
	char c;
	
	if (!bin_encode_str(x,&(s->req_uri))) goto error;
	if (!bin_encode_int(x,s->duration)) goto error;
	if (!bin_encode_time_t(x,s->expires)) goto error;
	
	c = s->attempts_left;
	if (!bin_encode_char(x,c)) goto error;

	if (!bin_encode_dlg_t(x,s->dialog)) goto error;	
	
	return 1;
error:
	LOG(L_ERR,"ERR:"M_NAME":bin_encode_r_subscription: Error while encoding.\n");
	return 0;		
}