mISDNuser/lib/include/layer3.h

177 lines
4.1 KiB
C

/* layer3.h
*
* Author Karsten Keil <kkeil@novell.com>
*
* Copyright 2007 by Karsten Keil <kkeil@novell.com>
*
* This code is free software; you can redistribute it and/or modify
* it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE
* version 2.1 as published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU LESSER GENERAL PUBLIC LICENSE for more details.
*
*/
#ifndef LAYER3_H
#define LAYER3_H
#include <mISDN/mbuffer.h>
#include "helper.h"
#include "mlist.h"
#include "mtimer.h"
#include "fsm.h"
#include "debug.h"
typedef struct _l3_process l3_process_t;
struct _layer3;
struct l3protocol {
char *name;
unsigned int protocol;
void (*init)(struct _layer3 *);
};
struct L3Timer {
struct mtimer tl;
struct _layer3 *l3;
unsigned int pid;
unsigned int nr;
};
struct l2l3if;
struct _l3_process {
struct list_head list;
struct _layer3 *L3;
struct l2l3if *l2if;
l3_process_t *master;
struct list_head child;
unsigned long flags;
int pid;
int selpid;
int state;
struct L3Timer timer1;
struct L3Timer timer2;
int n303;
struct l3_msg *t303msg;
unsigned char cid[4];
int cause;
int rm_cause;
int aux_state;
};
#define FLG_L3P_TIMER312 1
#define FLG_L3P_TIMER303_1 2
#define FLG_L3P_TIMER308_1 3
#define FLG_L3P_TIMER309 4
#define FLG_L3P_GOTRELCOMP 5
/*
* maximum orginated callrefs
* have to be a multiple of 8
*/
#define MAX_PID_COUNT 128
struct l2l3if {
struct list_head list;
struct _layer3 *l3;
struct sockaddr_mISDN l2addr;
struct FsmInst l3m;
struct FsmTimer l3m_timer;
struct mqueue squeue;
};
typedef struct _layer3 {
struct mlayer3 ml3;
pthread_t worker;
int l2sock;
int maxfd;
struct l2l3if l2master;
struct timer_base tbase;
int next_cr;
struct list_head plist;
l3_process_t global;
l3_process_t dummy;
int (*p_mgr)(l3_process_t *, u_int, struct l3_msg *);
int (*from_l2)(struct _layer3 *, struct mbuffer *);
int (*to_l3)(struct _layer3 *, struct l3_msg *);
int debug;
struct mqueue app_queue;
struct mqueue mgr_queue;
pthread_mutex_t run;
} layer3_t;
struct stateentry {
unsigned int state;
unsigned int primitive;
void (*rout) (l3_process_t *, unsigned int, struct l3_msg *);
};
extern l3_process_t *get_l3process4pid(layer3_t *, unsigned int);
extern l3_process_t *get_l3process4cref(layer3_t *, unsigned int);
extern l3_process_t *create_new_process(layer3_t *, unsigned int, unsigned int, l3_process_t *);
extern void release_l3_process(struct _l3_process *);
extern void SendMsg(struct _l3_process *, struct l3_msg *, int);
extern void mISDN_l3up(l3_process_t *, unsigned int, struct l3_msg *);
extern void mIl3_debug(layer3_t *, char *, ...);
extern void mIpc_debug(u_int, struct _l3_process *, char *, ...);
static inline void
newl3state(l3_process_t *pc, int state)
{
mIpc_debug(L3_DEB_STATE, pc, "state %d --> %d", pc->state, state);
pc->state = state;
}
static inline struct l3_msg *
MsgStart(l3_process_t *pc, unsigned char mt)
{
struct l3_msg *l3m;
struct mbuffer *mb;
l3m = alloc_l3_msg();
if (!l3m)
return NULL;
mb = container_of(l3m, struct mbuffer, l3);
l3m->type = mt;
mb->l3h.type = mt;
l3m->pid = pc->pid;
return(l3m);
}
/* L3 timer functions */
extern void StopAllL3Timer(struct _l3_process *);
extern void L3AddTimer(struct L3Timer *, int, unsigned int);
extern void L3DelTimer(struct L3Timer *);
extern void l3_manager(struct l2l3if *, unsigned int);
extern int assembleQ931(struct _l3_process *, struct l3_msg *);
#define SBIT(state) (1 << state)
#define ALL_STATES 0xffffffff
/*
* internal used property flags
* 0...15 reserved for set properties
*/
#define FLG_USER 16
#define FLG_NETWORK 17
#define FLG_BASICRATE 18
#define FLG_L2BLOCK 19
#define FLG_RUN_WAIT 30
#define FLG_ABORT 31
extern void init_l3(layer3_t *);
extern void release_l3(layer3_t *);
extern int l3_start(struct _layer3 *);
extern void l3_stop(struct _layer3 *);
extern void mISDNl3New(void);
extern void mISDNl3Free(void);
#endif