diff -Naur libss7-trunk/isup.c libss7-trunk-fixdpc/isup.c --- libss7-trunk/isup.c 2007-02-22 07:22:42.000000000 -0200 +++ libss7-trunk-fixdpc/isup.c 2007-03-30 14:30:38.000000000 -0300 @@ -710,9 +710,15 @@ return c; } -void isup_init_call(struct ss7 *ss7, struct isup_call *c, int cic, char *calledpartynum, char *callingpartynum) +void isup_set_call_dpc(struct isup_call *c, unsigned int dpc) +{ + c->dpc = dpc; +} + +void isup_init_call(struct ss7 *ss7, struct isup_call *c, int cic, unsigned int dpc, char *calledpartynum, char *callingpartynum) { c->cic = cic; + c->dpc = dpc; if (calledpartynum && calledpartynum[0]) { if (ss7->switchtype == SS7_ITU) snprintf(c->called_party_num, sizeof(c->called_party_num), "%s#", calledpartynum); @@ -881,7 +887,9 @@ rlptr = ss7_msg_userpart(msg); rl.opc = ss7->pc; rl.sls = sls_next(ss7); - rl.dpc = ss7->def_dpc; + /* use CIC's DPC instead of linkset's DPC */ + /* rl.dpc = ss7->def_dpc; */ + rl.dpc = c->dpc; rl.type = ss7->switchtype; rlsize = set_routinglabel(rlptr, &rl); mh = (struct isup_h *)(rlptr + rlsize); /* Note to self, do NOT put a typecasted pointer next to an addition operation */ @@ -1251,7 +1259,7 @@ } } -static int isup_send_cicgroupmessage(struct ss7 *ss7, int messagetype, int begincic, int endcic, unsigned char status[]) +static int isup_send_cicgroupmessage(struct ss7 *ss7, int messagetype, int begincic, int endcic, unsigned int dpc, unsigned char status[]) { struct isup_call call; int i; @@ -1261,6 +1269,7 @@ call.cic = begincic; call.range = endcic - begincic; + call.dpc = dpc; if (call.range > 31) return -1; @@ -1268,7 +1277,7 @@ return isup_send_message(ss7, &call, messagetype, cicgroup_params); } -int isup_grs(struct ss7 *ss7, int begincic, int endcic) +int isup_grs(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc) { struct isup_call call; @@ -1277,6 +1286,7 @@ call.cic = begincic; call.range = endcic - begincic; + call.dpc = dpc; if (call.range > 31) return -1; @@ -1284,7 +1294,7 @@ return isup_send_message(ss7, &call, ISUP_GRS, greset_params); } -int isup_gra(struct ss7 *ss7, int begincic, int endcic) +int isup_gra(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc) { struct isup_call call; @@ -1292,6 +1302,7 @@ return -1; call.cic = begincic; call.range = endcic - begincic; + call.dpc = dpc; if (call.range > 31) return -1; @@ -1299,35 +1310,35 @@ return isup_send_message(ss7, &call, ISUP_GRA, greset_params); } -int isup_cgb(struct ss7 *ss7, int begincic, int endcic, unsigned char state[]) +int isup_cgb(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc, unsigned char state[]) { if (!ss7) return -1; - return isup_send_cicgroupmessage(ss7, ISUP_CGB, begincic, endcic, state); + return isup_send_cicgroupmessage(ss7, ISUP_CGB, begincic, endcic, dpc, state); } -int isup_cgu(struct ss7 *ss7, int begincic, int endcic, unsigned char state[]) +int isup_cgu(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc, unsigned char state[]) { if (!ss7) return -1; - return isup_send_cicgroupmessage(ss7, ISUP_CGU, begincic, endcic, state); + return isup_send_cicgroupmessage(ss7, ISUP_CGU, begincic, endcic, dpc, state); } -int isup_cgba(struct ss7 *ss7, int begincic, int endcic, unsigned char state[]) +int isup_cgba(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc, unsigned char state[]) { if (!ss7) return -1; - return isup_send_cicgroupmessage(ss7, ISUP_CGBA, begincic, endcic, state); + return isup_send_cicgroupmessage(ss7, ISUP_CGBA, begincic, endcic, dpc, state); } -int isup_cgua(struct ss7 *ss7, int begincic, int endcic, unsigned char state[]) +int isup_cgua(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc, unsigned char state[]) { if (!ss7) return -1; - return isup_send_cicgroupmessage(ss7, ISUP_CGUA, begincic, endcic, state); + return isup_send_cicgroupmessage(ss7, ISUP_CGUA, begincic, endcic, dpc, state); } int isup_iam(struct ss7 *ss7, struct isup_call *c) @@ -1391,11 +1402,12 @@ return res; } -static int isup_send_message_ciconly(struct ss7 *ss7, int messagetype, int cic) +static int isup_send_message_ciconly(struct ss7 *ss7, int messagetype, int cic, unsigned int dpc) { int res; struct isup_call c; c.cic = cic; + c.dpc = dpc; res = isup_send_message(ss7, &c, messagetype, empty_params); return res; } @@ -1409,43 +1421,43 @@ return isup_send_message(ss7, c, ISUP_CPG, cpg_params); } -int isup_rsc(struct ss7 *ss7, int cic) +int isup_rsc(struct ss7 *ss7, int cic, unsigned int dpc) { if (!ss7) return -1; - return isup_send_message_ciconly(ss7, ISUP_RSC, cic); + return isup_send_message_ciconly(ss7, ISUP_RSC, cic, dpc); } -int isup_blo(struct ss7 *ss7, int cic) +int isup_blo(struct ss7 *ss7, int cic, unsigned int dpc) { if (!ss7) return -1; - return isup_send_message_ciconly(ss7, ISUP_BLO, cic); + return isup_send_message_ciconly(ss7, ISUP_BLO, cic, dpc); } -int isup_ubl(struct ss7 *ss7, int cic) +int isup_ubl(struct ss7 *ss7, int cic, unsigned int dpc) { if (!ss7) return -1; - return isup_send_message_ciconly(ss7, ISUP_UBL, cic); + return isup_send_message_ciconly(ss7, ISUP_UBL, cic, dpc); } -int isup_bla(struct ss7 *ss7, int cic) +int isup_bla(struct ss7 *ss7, int cic, unsigned int dpc) { if (!ss7) return -1; - return isup_send_message_ciconly(ss7, ISUP_BLA, cic); + return isup_send_message_ciconly(ss7, ISUP_BLA, cic, dpc); } -int isup_uba(struct ss7 *ss7, int cic) +int isup_uba(struct ss7 *ss7, int cic, unsigned int dpc) { if (!ss7) return -1; - return isup_send_message_ciconly(ss7, ISUP_UBA, cic); + return isup_send_message_ciconly(ss7, ISUP_UBA, cic, dpc); } /* Janelle is the bomb (Again) */ diff -Naur libss7-trunk/isup.h libss7-trunk-fixdpc/isup.h --- libss7-trunk/isup.h 2007-02-22 07:22:42.000000000 -0200 +++ libss7-trunk-fixdpc/isup.h 2007-03-30 14:30:42.000000000 -0300 @@ -136,6 +136,8 @@ unsigned short cic; unsigned short slc; struct isup_call *next; + /* set DPC according to CIC's DPC, not linkset */ + unsigned int dpc; }; int isup_receive(struct ss7 *ss7, struct mtp2 *sl, unsigned char *sif, int len); diff -Naur libss7-trunk/libss7.h libss7-trunk-fixdpc/libss7.h --- libss7-trunk/libss7.h 2007-02-22 07:22:42.000000000 -0200 +++ libss7-trunk-fixdpc/libss7.h 2007-03-26 16:54:27.000000000 -0300 @@ -218,27 +218,29 @@ int isup_cpg(struct ss7 *ss7, struct isup_call *c, int event); -int isup_gra(struct ss7 *ss7, int begincic, int endcic); +int isup_gra(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc); -int isup_grs(struct ss7 *ss7, int begincic, int endcic); +int isup_grs(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc); -int isup_cgb(struct ss7 *ss7, int begincic, int endcic, unsigned char state[]); +int isup_cgb(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc, unsigned char state[]); -int isup_cgu(struct ss7 *ss7, int begincic, int endcic, unsigned char state[]); +int isup_cgu(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc, unsigned char state[]); -int isup_cgba(struct ss7 *ss7, int begincic, int endcic, unsigned char state[]); +int isup_cgba(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc, unsigned char state[]); -int isup_cgua(struct ss7 *ss7, int begincic, int endcic, unsigned char state[]); +int isup_cgua(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc, unsigned char state[]); -int isup_blo(struct ss7 *ss7, int cic); +int isup_blo(struct ss7 *ss7, int cic, unsigned int dpc); -int isup_ubl(struct ss7 *ss7, int cic); +int isup_ubl(struct ss7 *ss7, int cic, unsigned int dpc); -int isup_bla(struct ss7 *ss7, int cic); +int isup_bla(struct ss7 *ss7, int cic, unsigned int dpc); -int isup_uba(struct ss7 *ss7, int cic); +int isup_uba(struct ss7 *ss7, int cic, unsigned int dpc); -int isup_rsc(struct ss7 *ss7, int cic); +int isup_rsc(struct ss7 *ss7, int cic, unsigned int dpc); -void isup_init_call(struct ss7 *ss7, struct isup_call *c, int cic, char *calledpartynum, char *callingpartynum); +void isup_init_call(struct ss7 *ss7, struct isup_call *c, int cic, unsigned int dpc, char *calledpartynum, char *callingpartynum); + +void isup_set_call_dpc(struct isup_call *c, unsigned int dpc); #endif /* _LIBSS7_H */ diff -Naur libss7-trunk/mtp3.c libss7-trunk-fixdpc/mtp3.c --- libss7-trunk/mtp3.c 2007-02-22 07:22:42.000000000 -0200 +++ libss7-trunk-fixdpc/mtp3.c 2007-03-28 07:46:46.000000000 -0300 @@ -352,6 +352,7 @@ struct ss7_msg *m; struct routing_label drl; unsigned char *layer4; + ss7_event *e; int rllen; m = ss7_msg_new(); @@ -381,6 +382,19 @@ mtp3_transmit(ss7, (ss7->switchtype == SS7_ITU) ? SIG_STD_TEST : SIG_SPEC_TEST, mtp2->slc, m); + /* Update linkstate */ + + mtp3_setstate_mtp2link(ss7, mtp2, MTP2_LINKSTATE_UP); + + if (ss7->state != SS7_STATE_UP) { + e = ss7_next_empty_event(ss7); + if (!e) { + mtp_error(ss7, "Event queue full\n"); + return -1; + } + e->e = SS7_EVENT_UP; + } + return 0; } else if (h1 == 2) { return 0;