[libss7-commits] mattf: branch 1.0 r281 - in /branches/1.0: isup.c isup.h libss7.h mtp3.c ss7.c
SVN commits to the libss7 project
libss7-commits at lists.digium.com
Mon Feb 22 15:13:08 CST 2010
Author: mattf
Date: Mon Feb 22 15:13:04 2010
New Revision: 281
URL: http://svnview.digium.com/svn/libss7?view=rev&rev=281
Log:
Add support for ISUP Suspend and Resume messages. Also, fix problem with ANSI SLC being located in a previously unexpected location (multi link ANSI nodes should work better).
Modified:
branches/1.0/isup.c
branches/1.0/isup.h
branches/1.0/libss7.h
branches/1.0/mtp3.c
branches/1.0/ss7.c
Modified: branches/1.0/isup.c
URL: http://svnview.digium.com/svn/libss7/branches/1.0/isup.c?view=diff&rev=281&r1=280&r2=281
==============================================================================
--- branches/1.0/isup.c (original)
+++ branches/1.0/isup.c Mon Feb 22 15:13:04 2010
@@ -88,6 +88,8 @@
static int cicgroup_params[] = { ISUP_PARM_CIRCUIT_GROUP_SUPERVISION_IND, ISUP_PARM_RANGE_AND_STATUS, -1};
static int cqr_params[] = { ISUP_PARM_RANGE_AND_STATUS, ISUP_PARM_CIRCUIT_STATE_IND, -1};
+
+static int sus_res_params[] = { ISUP_PARM_SUSPEND_RESUME_IND, -1};
static int empty_params[] = { -1};
@@ -126,7 +128,9 @@
{ISUP_CQR, 0, 2, 0, cqr_params},
{ISUP_FAA, 1, 0, 1, faa_params},
{ISUP_FAR, 1, 0, 1, far_params},
- {ISUP_CFN, 0, 1, 0, rel_params}
+ {ISUP_CFN, 0, 1, 0, rel_params},
+ {ISUP_SUS, 1, 0, 1, sus_res_params},
+ {ISUP_RES, 1, 0, 1, sus_res_params}
};
static int isup_send_message(struct ss7 *ss7, struct isup_call *c, int messagetype, int parms[]);
@@ -188,6 +192,10 @@
return "CVR";
case ISUP_CFN:
return "CFN";
+ case ISUP_SUS:
+ return "SUS";
+ case ISUP_RES:
+ return "RES";
default:
return "Unknown";
}
@@ -1972,6 +1980,18 @@
return len;
}
+static FUNC_DUMP(suspend_resume_ind_dump)
+{
+ int indicator = parm[0] & 1;
+ ss7_message(ss7, "\t\t\t%s (%d)", indicator ? "Network initiated" : "ISDN Subscriber initiated", indicator);
+ return 1;
+}
+
+static FUNC_RECV(suspend_resume_ind_receive)
+{
+ c->network_isdn_indicator = parm[0] & 1;
+ return 1;
+}
static struct parm_func parms[] = {
{ISUP_PARM_NATURE_OF_CONNECTION_IND, "Nature of Connection Indicator", nature_of_connection_ind_dump, nature_of_connection_ind_receive, nature_of_connection_ind_transmit },
@@ -2018,6 +2038,7 @@
{ISUP_PARM_FACILITY_IND, "Facility Indicator", facility_ind_dump, facility_ind_receive, facility_ind_transmit},
{ISUP_PARM_REDIRECTING_NUMBER, "Redirecting Number", redirecting_number_dump, redirecting_number_receive, redirecting_number_transmit},
{ISUP_PARM_ACCESS_DELIVERY_INFO, "Access Delivery Information", },
+ {ISUP_PARM_SUSPEND_RESUME_IND, "Suspend/Resume Indicators", suspend_resume_ind_dump, suspend_resume_ind_receive},
};
static char * param2str(int parm)
@@ -3065,6 +3086,32 @@
e->ucic.opc = opc; /* keep OPC information */
e->far.call = c;
return 0;
+ case ISUP_RES:
+ e = ss7_next_empty_event(ss7);
+ if (!e) {
+ isup_free_call(ss7, c);
+ return -1;
+ }
+
+ e->e = ISUP_EVENT_RES;
+ e->res.cic = c->cic;
+ e->res.opc = opc; /* keep OPC information */
+ e->res.call = c;
+ e->res.network_isdn_indicator = c->network_isdn_indicator;
+ return 0;
+ case ISUP_SUS:
+ e = ss7_next_empty_event(ss7);
+ if (!e) {
+ isup_free_call(ss7, c);
+ return -1;
+ }
+
+ e->e = ISUP_EVENT_SUS;
+ e->sus.cic = c->cic;
+ e->sus.opc = opc; /* keep OPC information */
+ e->sus.call = c;
+ e->sus.network_isdn_indicator = c->network_isdn_indicator;
+ return 0;
default:
isup_free_call(ss7, c);
return 0;
Modified: branches/1.0/isup.h
URL: http://svnview.digium.com/svn/libss7/branches/1.0/isup.h?view=diff&rev=281&r1=280&r2=281
==============================================================================
--- branches/1.0/isup.h (original)
+++ branches/1.0/isup.h Mon Feb 22 15:13:04 2010
@@ -89,6 +89,7 @@
#define ISUP_EXM 0xed
/* ISUP Parameters */
+#define ISUP_PARM_SUSPEND_RESUME_IND 0x22
#define ISUP_PARM_NATURE_OF_CONNECTION_IND 0x06
#define ISUP_PARM_FORWARD_CALL_IND 0x07
#define ISUP_PARM_CALLING_PARTY_CAT 0x09
@@ -212,6 +213,8 @@
unsigned int dpc;
/* Backward Call Indicator variables */
unsigned char called_party_status_ind;
+ /* Suspend/Resume Indicator */
+ int network_isdn_indicator;
};
int isup_receive(struct ss7 *ss7, struct mtp2 *sl, struct routing_label *rl, unsigned char *sif, int len);
Modified: branches/1.0/libss7.h
URL: http://svnview.digium.com/svn/libss7/branches/1.0/libss7.h?view=diff&rev=281&r1=280&r2=281
==============================================================================
--- branches/1.0/libss7.h (original)
+++ branches/1.0/libss7.h Mon Feb 22 15:13:04 2010
@@ -65,6 +65,8 @@
#define ISUP_EVENT_FAA 27
#define ISUP_EVENT_CVT 28
#define ISUP_EVENT_CVR 29
+#define ISUP_EVENT_SUS 30
+#define ISUP_EVENT_RES 31
/* Different SS7 types */
#define SS7_ITU (1 << 0)
@@ -263,6 +265,14 @@
struct isup_call *call;
} ss7_event_far;
+typedef struct {
+ int e;
+ int cic;
+ int network_isdn_indicator;
+ unsigned int opc;
+ struct isup_call *call;
+} ss7_event_sus_res;
+
typedef union {
int e;
@@ -292,6 +302,8 @@
ss7_event_ciconly ucic;
ss7_event_rsc rsc;
ss7_event_cpg cpg;
+ ss7_event_sus_res sus;
+ ss7_event_sus_res res;
ss7_event_ciconly lpa;
} ss7_event;
@@ -309,6 +321,8 @@
int ss7_add_link(struct ss7 *ss7, int transport, int fd);
int ss7_set_adjpc(struct ss7 *ss7, int fd, unsigned int pc);
+
+int ss7_set_slc(struct ss7 *ss7, int fd, unsigned int slc);
int ss7_set_network_ind(struct ss7 *ss7, int ni);
Modified: branches/1.0/mtp3.c
URL: http://svnview.digium.com/svn/libss7/branches/1.0/mtp3.c?view=diff&rev=281&r1=280&r2=281
==============================================================================
--- branches/1.0/mtp3.c (original)
+++ branches/1.0/mtp3.c Mon Feb 22 15:13:04 2010
@@ -171,6 +171,21 @@
static inline unsigned char get_h1(unsigned char *byte)
{
return (((*byte) & 0xf0) >> 4);
+}
+
+static inline struct mtp2 * slc_to_link(struct ss7 *ss7, unsigned char sls)
+{
+ struct mtp2 *winner = ss7->links[0];
+ int i;
+
+ for (i = 0; i < ss7->numlinks; i++) {
+ if (ss7->links[i]->slc == sls) {
+ winner = ss7->links[i];
+ break;
+ }
+ }
+
+ return winner;
}
static inline struct mtp2 * sls_to_link(struct ss7 *ss7, unsigned char sls)
@@ -293,7 +308,7 @@
set_h0(layer4, 1);
set_h1(layer4, 1);
- layer4[1] = (testlen << 4);
+ layer4[1] = (testlen << 4) | (link->slc & 0xf);
memcpy(&layer4[2], testmessage, testlen);
ss7_msg_userpart_len(m, rllen + testlen + 2);
@@ -422,7 +437,7 @@
/* Success! */
set_h0(layer4, 1);
set_h1(layer4, 2);
- layer4[1] = (testpatsize << 4);
+ layer4[1] = (testpatsize << 4) | (mtp2->slc & 0xf);
memcpy(&layer4[2], &headerptr[2], testpatsize);
ss7_msg_userpart_len(m, rllen + testpatsize + 2);
@@ -462,7 +477,10 @@
sio = m->buf + MTP2_SIZE;
sif = sio + 1;
- winner = sls_to_link(ss7, sls);
+ if (userpart != SIG_ISUP)
+ winner = slc_to_link(ss7, sls);
+ else
+ winner = sls_to_link(ss7, sls);
if (ss7->switchtype == SS7_ITU)
(*sio) = (ss7->ni << 6) | userpart;
Modified: branches/1.0/ss7.c
URL: http://svnview.digium.com/svn/libss7/branches/1.0/ss7.c?view=diff&rev=281&r1=280&r2=281
==============================================================================
--- branches/1.0/ss7.c (original)
+++ branches/1.0/ss7.c Mon Feb 22 15:13:04 2010
@@ -237,6 +237,24 @@
flags |= POLLOUT;
return flags;
+}
+
+/* TODO: Add entry to routing table instead */
+int ss7_set_slc(struct ss7 *ss7, int fd, unsigned int slc)
+{
+ int i;
+ int winner = -1;
+
+ for (i = 0; i < ss7->numlinks; i++) {
+ if (ss7->links[i]->fd == fd)
+ winner = i;
+ }
+ if (winner > -1)
+ ss7->links[winner]->slc = slc;
+ else
+ return -1;
+
+ return 0;
}
/* TODO: Add entry to routing table instead */
More information about the libss7-commits
mailing list