Пример #1
0
static void
l3_1tr6_t305(struct l3_process *pc, u_char pr, void *arg)
{
	struct sk_buff *skb;
	u_char tmp[16];
	u_char *p = tmp;
	int l;
	u_char cause = 0x90;
	u_char clen = 1;

	L3DelTimer(&pc->timer);
	if (pc->para.cause != NO_CAUSE)
		cause = pc->para.cause;
	/* Map DSS1 causes */
	switch (cause & 0x7f) {
		case 0x10:
			clen = 0;
			break;
		case 0x15:
			cause = CAUSE_CallRejected;
			break;
	}
	MsgHead(p, pc->callref, MT_N1_REL, PROTO_DIS_N1);
	*p++ = WE0_cause;
	*p++ = clen;		/* Laenge */
	if (clen)
		*p++ = cause;
	newl3state(pc, 19);
	l = p - tmp;
	if (!(skb = l3_alloc_skb(l)))
		return;
	memcpy(skb_put(skb, l), tmp, l);
	l3_msg(pc->st, DL_DATA | REQUEST, skb);
	L3AddTimer(&pc->timer, T308, CC_T308_1);
}
Пример #2
0
static void
l3_1tr6_t308_2(struct l3_process *pc, u_char pr, void *arg)
{
	L3DelTimer(&pc->timer);
	pc->st->l3.l3l4(pc->st, CC_RELEASE_ERR, pc);
	release_l3_process(pc);
}
Пример #3
0
static void
l3_1tr6_call_sent(struct l3_process *pc, u_char pr, void *arg)
{
    u_char *p;
    struct sk_buff *skb = arg;

    L3DelTimer(&pc->timer);
    p = skb->data;
    if ((p = findie(p, skb->len, WE0_chanID, 0))) {
        if (p[1] != 1) {
            l3_1tr6_error(pc, "call sent wrong chanID len", skb);
            return;
        }
        if ((p[2] & 0xf4) != 0x80) {
            l3_1tr6_error(pc, "call sent wrong WE0_chanID", skb);
            return;
        }
        if ((pc->state == 2) && (pc->para.bchannel != (p[2] & 0x3))) {
            l3_1tr6_error(pc, "call sent wrong chanID value", skb);
            return;
        }
        pc->para.bchannel = p[2] & 0x3;
    } else {
        l3_1tr6_error(pc, "missing call sent WE0_chanID", skb);
        return;
    }
    dev_kfree_skb(skb);
    L3AddTimer(&pc->timer, T310, CC_T310);
    newl3state(pc, 3);
    pc->st->l3.l3l4(pc->st, CC_PROCEEDING | INDICATION, pc);
}
Пример #4
0
static void
l3_1tr6_t305(struct PStack *st, u_char pr, void *arg)
{
	struct sk_buff *skb;
	u_char tmp[16];
	u_char *p = tmp;
	int l;
	u_char cause = 0x90;
	u_char clen = 1;

	L3DelTimer(&st->l3.timer);
	if (st->pa->cause > 0)
		cause = st->pa->cause;
	/* Map DSS1 causes */
	switch (cause & 0x7f) {
		case 0x10:
			clen = 0;
			break;
		case 0x15:
			cause = CAUSE_CallRejected;
			break;
	}
	MsgHead(p, st->l3.callref, MT_N1_REL, PROTO_DIS_N1);
	*p++ = WE0_cause;
	*p++ = clen;		/* Laenge */
	if (clen)
		*p++ = cause;
	newl3state(st, 19);
	l = p - tmp;
	if (!(skb = l3_alloc_skb(l)))
		return;
	memcpy(skb_put(skb, l), tmp, l);
	st->l3.l3l2(st, DL_DATA, skb);
	L3AddTimer(&st->l3.timer, st->l3.t308, CC_T308_1);
}
Пример #5
0
static void
l3_1tr6_setup_ack(struct l3_process *pc, u_char pr, void *arg)
{
    u_char *p;
    struct sk_buff *skb = arg;

    L3DelTimer(&pc->timer);
    p = skb->data;
    newl3state(pc, 2);
    if ((p = findie(p, skb->len, WE0_chanID, 0))) {
        if (p[1] != 1) {
            l3_1tr6_error(pc, "setup_ack wrong chanID len", skb);
            return;
        }
        if ((p[2] & 0xf4) != 0x80) {
            l3_1tr6_error(pc, "setup_ack wrong WE0_chanID", skb);
            return;
        }
        pc->para.bchannel = p[2] & 0x3;
    } else {
        l3_1tr6_error(pc, "missing setup_ack WE0_chanID", skb);
        return;
    }
    dev_kfree_skb(skb);
    L3AddTimer(&pc->timer, T304, CC_T304);
    pc->st->l3.l3l4(pc->st, CC_MORE_INFO | INDICATION, pc);
}
Пример #6
0
static void
l3_1tr6_t308_2(struct PStack *st, u_char pr, void *arg)
{
	L3DelTimer(&st->l3.timer);
	st->l3.l3l4(st, CC_RELEASE_ERR, NULL);
	newl3state(st, 0);
}
Пример #7
0
static void
l3_1tr6_setup_rsp(struct PStack *st, u_char pr, void *arg)
{
	struct sk_buff *skb;
	u_char tmp[24];
	u_char *p = tmp;
	int l;

	MsgHead(p, st->l3.callref, MT_N1_CONN, PROTO_DIS_N1);
	if (st->pa->spv) {	/* SPV ? */
		/* NSF SPV */
		*p++ = WE0_netSpecFac;
		*p++ = 4;	/* Laenge */
		*p++ = 0;
		*p++ = FAC_SPV;	/* SPV */
		*p++ = st->pa->setup.si1;
		*p++ = st->pa->setup.si2;
		*p++ = WE0_netSpecFac;
		*p++ = 4;	/* Laenge */
		*p++ = 0;
		*p++ = FAC_Activate;	/* aktiviere SPV */
		*p++ = st->pa->setup.si1;
		*p++ = st->pa->setup.si2;
	}
	newl3state(st, 8);
	l = p - tmp;
	if (!(skb = l3_alloc_skb(l)))
		return;
	memcpy(skb_put(skb, l), tmp, l);
	st->l3.l3l2(st, DL_DATA, skb);
	L3DelTimer(&st->l3.timer);
	L3AddTimer(&st->l3.timer, st->l3.t313, CC_T313);
}
Пример #8
0
static void
l3_1tr6_setup_rsp(struct l3_process *pc, u_char pr, void *arg)
{
    struct sk_buff *skb;
    u_char tmp[24];
    u_char *p = tmp;
    int l;

    MsgHead(p, pc->callref, MT_N1_CONN, PROTO_DIS_N1);
    if (pc->para.spv) {	/* SPV ? */
        /* NSF SPV */
        *p++ = WE0_netSpecFac;
        *p++ = 4;	/* Laenge */
        *p++ = 0;
        *p++ = FAC_SPV;	/* SPV */
        *p++ = pc->para.setup.si1;
        *p++ = pc->para.setup.si2;
        *p++ = WE0_netSpecFac;
        *p++ = 4;	/* Laenge */
        *p++ = 0;
        *p++ = FAC_Activate;	/* aktiviere SPV */
        *p++ = pc->para.setup.si1;
        *p++ = pc->para.setup.si2;
    }
    newl3state(pc, 8);
    l = p - tmp;
    if (!(skb = l3_alloc_skb(l)))
        return;
    memcpy(skb_put(skb, l), tmp, l);
    l3_msg(pc->st, DL_DATA | REQUEST, skb);
    L3DelTimer(&pc->timer);
    L3AddTimer(&pc->timer, T313, CC_T313);
}
Пример #9
0
static void
l3_1tr6_t308_1(struct l3_process *pc, u_char pr, void *arg)
{
	L3DelTimer(&pc->timer);
	l3_1TR6_message(pc, MT_N1_REL, PROTO_DIS_N1);
	L3AddTimer(&pc->timer, T308, CC_T308_2);
	newl3state(pc, 19);
}
Пример #10
0
static void
l3_1tr6_t308_1(struct PStack *st, u_char pr, void *arg)
{
	L3DelTimer(&st->l3.timer);
	l3_1TR6_message(st, MT_N1_REL, PROTO_DIS_N1);
	L3AddTimer(&st->l3.timer, st->l3.t308, CC_T308_2);
	newl3state(st, 19);
}
Пример #11
0
static void
l3_1tr6_t313(struct PStack *st, u_char pr, void *arg)
{
	L3DelTimer(&st->l3.timer);
	st->pa->cause = 0xE6;
	l3_1tr6_disconnect_req(st, pr, NULL);
	st->l3.l3l4(st, CC_CONNECT_ERR, NULL);
}
Пример #12
0
static void
l3_1tr6_t313(struct l3_process *pc, u_char pr, void *arg)
{
	L3DelTimer(&pc->timer);
	pc->para.cause = 0xE6;
	l3_1tr6_disconnect_req(pc, pr, NULL);
	pc->st->l3.l3l4(pc->st, CC_CONNECT_ERR, pc);
}
Пример #13
0
void
StopAllL3Timer(l3_process_t *pc)
{
	L3DelTimer(&pc->timer);
	if (pc->t303skb) {
		dev_kfree_skb(pc->t303skb);
		pc->t303skb = NULL;
	}
}
Пример #14
0
static void
l3_1tr6_alert(struct l3_process *pc, u_char pr, void *arg)
{
	struct sk_buff *skb = arg;

	dev_kfree_skb(skb);
	L3DelTimer(&pc->timer);	/* T304 */
	newl3state(pc, 4);
	pc->st->l3.l3l4(pc->st, CC_ALERTING | INDICATION, pc);
}
Пример #15
0
static void
l3_1tr6_alert(struct PStack *st, u_char pr, void *arg)
{
	struct sk_buff *skb = arg;

	SET_SKB_FREE(skb);
	dev_kfree_skb(skb, FREE_READ);
	L3DelTimer(&st->l3.timer);	/* T304 */
	newl3state(st, 4);
	st->l3.l3l4(st, CC_ALERTING_IND, NULL);
}
Пример #16
0
static void
l3_1tr6_connect_ack(struct PStack *st, u_char pr, void *arg)
{
	struct sk_buff *skb = arg;

	SET_SKB_FREE(skb);
	dev_kfree_skb(skb, FREE_READ);
	newl3state(st, 10);
	st->pa->chargeinfo = 0;
	L3DelTimer(&st->l3.timer);
	st->l3.l3l4(st, CC_SETUP_COMPLETE_IND, NULL);
}
Пример #17
0
static void
l3_1tr6_connect_ack(struct l3_process *pc, u_char pr, void *arg)
{
	struct sk_buff *skb = arg;

	if (!findie(skb->data, skb->len, WE6_date, 6)) {
		l3_1tr6_error(pc, "missing connack date", skb);
		return;
	}
	dev_kfree_skb(skb);
	newl3state(pc, 10);
	pc->para.chargeinfo = 0;
	L3DelTimer(&pc->timer);
	pc->st->l3.l3l4(pc->st, CC_SETUP_COMPL | INDICATION, pc);
}
Пример #18
0
static void
l3_1tr6_connect(struct l3_process *pc, u_char pr, void *arg)
{
	struct sk_buff *skb = arg;

	L3DelTimer(&pc->timer);	/* T310 */
	if (!findie(skb->data, skb->len, WE6_date, 6)) {
		l3_1tr6_error(pc, "missing connect date", skb);
		return;
	}
	newl3state(pc, 10);
	dev_kfree_skb(skb);
	pc->para.chargeinfo = 0;
	pc->st->l3.l3l4(pc->st, CC_SETUP | CONFIRM, pc);
}
Пример #19
0
static void
l3_1tr6_call_sent(struct PStack *st, u_char pr, void *arg)
{
	u_char *p;
	struct sk_buff *skb = arg;

	L3DelTimer(&st->l3.timer);
	p = skb->data;
	if ((p = findie(p, skb->len, WE0_chanID, 0))) {
		st->pa->bchannel = p[2] & 0x3;
	} else if (st->l3.debug & L3_DEB_WARN)
		l3_debug(st, "setup answer without bchannel");
	SET_SKB_FREE(skb);
	dev_kfree_skb(skb, FREE_READ);
	L3AddTimer(&st->l3.timer, st->l3.t310, CC_T310);
	newl3state(st, 3);
	st->l3.l3l4(st, CC_PROCEEDING_IND, NULL);
}
void
StopAllL3Timer(struct l3_process *pc)
{
	L3DelTimer(&pc->timer);
}
Пример #21
0
static void
l3_1tr6_setup_req(struct l3_process *pc, u_char pr, void *arg)
{
	struct sk_buff *skb;
	u_char tmp[128];
	u_char *p = tmp;
	u_char *teln;
	u_char *eaz;
	u_char channel = 0;
	int l;

	MsgHead(p, pc->callref, MT_N1_SETUP, PROTO_DIS_N1);
	teln = pc->para.setup.phone;
	pc->para.spv = 0;
	if (!isdigit(*teln)) {
		switch (0x5f & *teln) {
			case 'S':
				pc->para.spv = 1;
				break;
			case 'C':
				channel = 0x08;
			case 'P':
				channel |= 0x80;
				teln++;
				if (*teln == '1')
					channel |= 0x01;
				else
					channel |= 0x02;
				break;
			default:
				if (pc->st->l3.debug & L3_DEB_WARN)
					l3_debug(pc->st, "Wrong MSN Code");
				break;
		}
		teln++;
	}
	if (channel) {
		*p++ = 0x18;	/* channel indicator */
		*p++ = 1;
		*p++ = channel;
	}
	if (pc->para.spv) {	/* SPV ? */
		/* NSF SPV */
		*p++ = WE0_netSpecFac;
		*p++ = 4;	/* Laenge */
		*p++ = 0;
		*p++ = FAC_SPV;	/* SPV */
		*p++ = pc->para.setup.si1;	/* 0 for all Services */
		*p++ = pc->para.setup.si2;	/* 0 for all Services */
		*p++ = WE0_netSpecFac;
		*p++ = 4;	/* Laenge */
		*p++ = 0;
		*p++ = FAC_Activate;	/* aktiviere SPV (default) */
		*p++ = pc->para.setup.si1;	/* 0 for all Services */
		*p++ = pc->para.setup.si2;	/* 0 for all Services */
	}
	eaz = pc->para.setup.eazmsn;
	if (*eaz) {
		*p++ = WE0_origAddr;
		*p++ = strlen(eaz) + 1;
		/* Classify as AnyPref. */
		*p++ = 0x81;	/* Ext = '1'B, Type = '000'B, Plan = '0001'B. */
		while (*eaz)
			*p++ = *eaz++ & 0x7f;
	}
	*p++ = WE0_destAddr;
	*p++ = strlen(teln) + 1;
	/* Classify as AnyPref. */
	*p++ = 0x81;		/* Ext = '1'B, Type = '000'B, Plan = '0001'B. */
	while (*teln)
		*p++ = *teln++ & 0x7f;

	*p++ = WE_Shift_F6;
	/* Codesatz 6 fuer Service */
	*p++ = WE6_serviceInd;
	*p++ = 2;		/* len=2 info,info2 */
	*p++ = pc->para.setup.si1;
	*p++ = pc->para.setup.si2;

	l = p - tmp;
	if (!(skb = l3_alloc_skb(l)))
		return;
	memcpy(skb_put(skb, l), tmp, l);
	L3DelTimer(&pc->timer);
	L3AddTimer(&pc->timer, T303, CC_T303);
	newl3state(pc, 1);
	l3_msg(pc->st, DL_DATA | REQUEST, skb);
}
Пример #22
0
static void
l3_1tr6_setup_req(struct l3_process *pc, u_char pr, void *arg)
{
	struct sk_buff *skb;
	u_char tmp[128];
	u_char *p = tmp;
	u_char *teln;
	u_char *eaz;
	u_char channel = 0;
	int l;

	MsgHead(p, pc->callref, MT_N1_SETUP, PROTO_DIS_N1);
	teln = pc->para.setup.phone;
	pc->para.spv = 0;
	if (!isdigit(*teln)) {
		switch (0x5f & *teln) {
		case 'S':
			pc->para.spv = 1;
			break;
		case 'C':
			channel = 0x08;
		case 'P':
			channel |= 0x80;
			teln++;
			if (*teln == '1')
				channel |= 0x01;
			else
				channel |= 0x02;
			break;
		default:
			if (pc->st->l3.debug & L3_DEB_WARN)
				l3_debug(pc->st, "Wrong MSN Code");
			break;
		}
		teln++;
	}
	if (channel) {
		*p++ = 0x18;	
		*p++ = 1;
		*p++ = channel;
	}
	if (pc->para.spv) {	
		
		*p++ = WE0_netSpecFac;
		*p++ = 4;	
		*p++ = 0;
		*p++ = FAC_SPV;	
		*p++ = pc->para.setup.si1;	
		*p++ = pc->para.setup.si2;	
		*p++ = WE0_netSpecFac;
		*p++ = 4;	
		*p++ = 0;
		*p++ = FAC_Activate;	
		*p++ = pc->para.setup.si1;	
		*p++ = pc->para.setup.si2;	
	}
	eaz = pc->para.setup.eazmsn;
	if (*eaz) {
		*p++ = WE0_origAddr;
		*p++ = strlen(eaz) + 1;
		
		*p++ = 0x81;	
		while (*eaz)
			*p++ = *eaz++ & 0x7f;
	}
	*p++ = WE0_destAddr;
	*p++ = strlen(teln) + 1;
	
	*p++ = 0x81;		
	while (*teln)
		*p++ = *teln++ & 0x7f;

	*p++ = WE_Shift_F6;
	
	*p++ = WE6_serviceInd;
	*p++ = 2;		
	*p++ = pc->para.setup.si1;
	*p++ = pc->para.setup.si2;

	l = p - tmp;
	if (!(skb = l3_alloc_skb(l)))
		return;
	memcpy(skb_put(skb, l), tmp, l);
	L3DelTimer(&pc->timer);
	L3AddTimer(&pc->timer, T303, CC_T303);
	newl3state(pc, 1);
	l3_msg(pc->st, DL_DATA | REQUEST, skb);
}