/** * 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 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 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; }
/** * Encode a r_public into a binary form * @param x - binary data to append to * @param c - the r_contact to encode * @returns 1 on succcess or 0 on error */ int bin_encode_r_contact(bin_data *x,r_contact *c) { if (!bin_encode_str(x,&(c->uri))) goto error; if (!bin_encode_time_t(x,c->expires)) goto error; if (!bin_encode_str(x,&(c->ua))) goto error; if (!bin_encode_str(x,&(c->path))) goto error; return 1; error: LOG(L_ERR,"ERR:"M_NAME":bin_encode_r_contact: 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; }
/** * 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; }
/** * 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; }
/** * 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; }
/** * Encode an authentication userdata into a binary form * @param x - binary data to append to * @param u - the authentication usedata to encode * @returns 1 on succcess or 0 on error */ int bin_encode_auth_userdata(bin_data *x,auth_userdata *u) { unsigned short k=0; auth_vector *v; if (!bin_encode_str(x,&(u->private_identity))) goto error; if (!bin_encode_str(x,&(u->public_identity))) goto error; if (!bin_encode_time_t(x,u->expires)) goto error; for(v=u->head;v;v=v->next) k++; if (!bin_encode_ushort(x,k)) goto error; for(v=u->head;v;v=v->next) if (!bin_encode_auth_vector(x,v)) goto error; return 1; error: LOG(L_ERR,"ERR:"M_NAME":bin_encode_auth_vector: Error while encoding.\n"); return 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; }
/** * 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 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; }
/** * Encode a r_public into a binary form * @param x - binary data to append to * @param c - the r_contact to encode * @returns 1 on succcess or 0 on error */ int bin_encode_r_contact(bin_data *x,r_contact *c) { unsigned short cpn=0; r_contact_param *cp; if (!bin_encode_str(x,&(c->uri))) goto error; if (!bin_encode_time_t(x,c->expires)) goto error; if (!bin_encode_str(x,&(c->ua))) goto error; if (!bin_encode_str(x,&(c->path))) goto error; for(cp=c->parameters;cp;cp=cp->next) cpn++; if (!bin_encode_ushort(x,cpn)) goto error; for(cp=c->parameters;cp;cp=cp->next){ if (!bin_encode_str(x,&(cp->name))) goto error; if (!bin_encode_str(x,&(cp->value))) goto error; } return 1; error: LOG(L_ERR,"ERR:"M_NAME":bin_encode_r_contact: Error while encoding.\n"); return 0; }
/** * Encode the entire user profile and append it to the binary data * @param x - binary data to append to * @param s - the ims subscription to encode * @returns 1 on succcess or 0 on error */ int bin_encode_ims_subscription(bin_data *x, ims_subscription *s) { int i; if (!bin_encode_str(x,&(s->private_identity))) goto error; if (!bin_encode_ushort(x,s->service_profiles_cnt)) goto error; for(i=0;i<s->service_profiles_cnt;i++) if (!bin_encode_service_profile(x,s->service_profiles+i)) goto error; return 1; error: LOG(L_ERR,"ERR:"M_NAME":bin_encode_ims_subscription: Error while encoding.\n"); return 0; }
/** * Encode a dlg_t into a binary form * @param x - binary data to append to * @param d - the dlg_t to encode * @returns 1 on succcess or 0 on error */ int bin_encode_dlg_t(bin_data *x,dlg_t *d) { str s={0,0}; if (d){ if (dialogb.dlg2str(d,&s)!=0) goto error; } if (!bin_encode_str(x,&s)) goto error; str_free_content(&s); return 1; error: LOG(L_ERR,"ERR:"M_NAME":bin_encode_dlg_t: Error while encoding.\n"); if (s.s) str_free_content(&s); return 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; }
/** * Encode an 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_p_dialog(bin_data *x,p_dialog *d) { int i; char c; if (!bin_encode_str(x,&(d->call_id))) goto error; c = d->direction; if (!bin_encode_uchar(x,c)) goto error; if (!bin_encode_str(x,&(d->host))) goto error; if (!bin_encode_ushort(x,d->port)) goto error; c = d->transport; if (!bin_encode_uchar(x,c)) goto error; if (!bin_encode_ushort(x,d->routes_cnt)) goto error; for(i=0;i<d->routes_cnt;i++) if (!bin_encode_str(x,d->routes+i)) goto error; c = d->method; if (!bin_encode_uchar(x,c)) 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; c = d->state; if (!bin_encode_uchar(x,c)) goto error; if (!bin_encode_time_t(x,d->expires)) goto error; if (!bin_encode_time_t(x,d->lr_session_expires)) goto error; if (!bin_encode_str(x,&(d->refresher))) goto error; if (!bin_encode_uchar(x,d->uac_supp_timer)) goto error; if (!bin_encode_uchar(x,d->is_releasing)) goto error; if (!bin_encode_str(x,&(d->pcc_session_id))) 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_p_dialog: Error while encoding.\n"); return 0; }