osmo-cc-misdn-endpoint/src/libmisdnuser/include/mISDN/mlayer3.h

261 lines
7.9 KiB
C

/* mlayer3.h
*
* Author Karsten Keil <kkeil@linux-pingi.de>
*
* Copyright 2007 by Karsten Keil <kkeil@novell.com>
* Copyright 2011 by Karsten Keil <kkeil@linux-pingi.de>
*
* 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 _MLAYER3_H
#define _MLAYER3_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdarg.h>
#include <pthread.h>
#include <mISDN/mISDNcompat.h>
struct l3_head {
unsigned char type;
unsigned char crlen;
unsigned short cr;
};
struct m_extie {
unsigned char ie;
unsigned char codeset;
unsigned char len;
unsigned char *val;
};
struct l3_msg {
unsigned int type;
unsigned int pid;
unsigned char *bearer_capability; /* ie 0x04 pos 0 */
unsigned char *cause; /* ie 0x08 pos 1 */
unsigned char *call_id; /* ie 0x10 pos 2 */
unsigned char *call_state; /* ie 0x14 pos 3 */
unsigned char *channel_id; /* ie 0x18 pos 4 */
unsigned char *facility; /* ie 0x1c pos 5 */
unsigned char *progress; /* ie 0x1e pos 6 */
unsigned char *net_fac; /* ie 0x20 pos 7 */
unsigned char *notify; /* ie 0x27 pos 8 */
unsigned char *display; /* ie 0x28 pos 9 */
unsigned char *date; /* ie 0x29 pos 10 */
unsigned char *keypad; /* ie 0x2c pos 11 */
unsigned char *signal; /* ie 0x34 pos 12 */
unsigned char *info_rate; /* ie 0x40 pos 13 */
unsigned char *end2end_transit; /* ie 0x42 pos 14 */
unsigned char *transit_delay_sel; /* ie 0x43 pos 15 */
unsigned char *pktl_bin_para; /* ie 0x44 pos 16 */
unsigned char *pktl_window; /* ie 0x45 pos 17 */
unsigned char *pkt_size; /* ie 0x46 pos 18 */
unsigned char *closed_userg; /* ie 0x47 pos 19 */
unsigned char *reverse_charge; /* ie 0x4a pos 20 */
unsigned char *connected_nr; /* ie 0x4c pos 21 */
unsigned char *connected_sub; /* ie 0x4d pos 22 */
unsigned char *calling_nr; /* ie 0x6c pos 23 */
unsigned char *calling_sub; /* ie 0x6d pos 24 */
unsigned char *called_nr; /* ie 0x70 pos 25 */
unsigned char *called_sub; /* ie 0x71 pos 26 */
unsigned char *redirecting_nr; /* ie 0x74 pos 27 */
unsigned char *redirection_nr; /* ie 0x76 pos 28 */
unsigned char *transit_net_sel; /* ie 0x78 pos 29 */
unsigned char *restart_ind; /* ie 0x79 pos 30 */
unsigned char *llc; /* ie 0x7c pos 31 */
unsigned char *hlc; /* ie 0x7d pos 32 */
unsigned char *useruser; /* ie 0x7e pos 33 */
unsigned char comprehension_req;
unsigned char more_data;
unsigned char sending_complete;
unsigned char congestion_level;
struct m_extie extra[8];
};
struct mlayer3;
/*
* callback function to send and receive messages from and to layer3
* @parameter1 struct mlayer3 - identfy the layer3
* @parameter2 message type MT_ constants (Q931 and some private)
* @parameter3 PID (process identification) value to identify the target process
* @parameter4 optional layer3 message, if here are no special IE to deliver, use NULL
*/
typedef int (mlayer3_cb_t)(struct mlayer3 *, unsigned int, unsigned int, struct l3_msg *);
/* debug helper */
#define MISDN_LIBDEBUG_ERROR 1
#define MISDN_LIBDEBUG_WARN 2
#define MISDN_LIBDEBUG_INFO 3
#define MISDN_LIBDEBUG_DEBUG 4
typedef int (*mi_thread_create_t)(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine) (void *),
void *arg, const char *file, const char *caller, int line, const char *start_fn);
typedef int (*mi_debug_t)(const char *file, int line, const char *func, int level, const char *fmt, va_list va);
typedef void * (*mi_malloc_t)(size_t size, const char *file, int line, const char *func);
typedef void * (*mi_calloc_t)(size_t nmemb, size_t size, const char *file, int line, const char *func);
typedef void (*mi_free_t)(void *ptr, const char *file, int line, const char *func);
struct mi_ext_fn_s {
mi_thread_create_t thread_create;
mi_debug_t prt_debug;
mi_malloc_t malloc;
mi_calloc_t calloc;
mi_free_t reuse;
mi_free_t free;
};
extern struct mi_ext_fn_s *mi_extern_func;
/*
* To avoid to include always all headers needed for mISDNif.h we redefine MISDN_CHMAP_SIZE here
* Please make sure to keep it in sync with mISDNif.h (but changes are very unlikely)
*/
#ifndef MISDN_CHMAP_SIZE
#define MISDN_MAX_CHANNEL 127
#define MISDN_CHMAP_SIZE ((MISDN_MAX_CHANNEL + 1) >> 3)
#endif
struct mISDN_devinfo;
struct mlayer3 {
unsigned int device;
unsigned int nr_bchannel;
unsigned long options;
mlayer3_cb_t *to_layer3;
mlayer3_cb_t *from_layer3;
void *priv; /* free use for applications */
struct mISDN_devinfo *devinfo;
};
/*
* Layer3 protocols
*/
#define L3_PROTOCOL_DSS1_USER 0x101
#define L3_PROTOCOL_DSS1_NET 0x102
/*
* Layer3 property Flags
*
* 16...31 reserved for internal use
*
*/
#define MISDN_FLG_PTP 1
#define MISDN_FLG_NET_HOLD 2
#define MISDN_FLG_L2_HOLD 3
#define MISDN_FLG_L2_CLEAN 4
#define MISDN_FLG_L1_HOLD 5
/*
* Layer3 <----> Application additional message types
* Basic messages are coded like Q931 MT_ from q931.h
*/
/* Application <---> L3 */
#define MT_ASSIGN 0x11000
/* L3 ---> Application */
#define MT_FREE 0x11001
#define MT_L2ESTABLISH 0x12000
#define MT_L2RELEASE 0x12001
#define MT_L2IDLE 0x12002
#define MT_ERROR 0x18000
#define MT_TIMEOUT 0x18001
/*
* process IDs
*
*
*/
#define MISDN_PID_DUMMY 0x81000000
#define MISDN_PID_GLOBAL 0x82000000
#define MISDN_PID_NONE 0xFFFFFFFF
#define MISDN_PID_MASTER 0xFF000000
#define MISDN_PID_CRTYPE_MASK 0xFF000000
#define MISDN_PID_CID_MASK 0x00FF0000
#define MISDN_PID_CR_MASK 0xFF00FFFF
#define MISDN_PID_CRVAL_MASK 0x0000FFFF
#define MISDN_PID_CR_FLAG 0x00008000
#define MISDN_CES_MASTER 0x0000FF00
#define MISDN_LIB_VERSION 2
#define MISDN_LIB_RELEASE 5
#define MISDN_LIB_INTERFACE ((MISDN_LIB_VERSION << 16) | MISDN_LIB_RELEASE)
/*
* init layer3 statemachines and caches
* must be called before first open
* @parameter count of cached mbuffers
* @parameter optional block of external functions for debug
* @parameter use linke user space mISDN library instead of kernel socket
* @return: interface version
*/
extern unsigned int init_layer3(int, struct mi_ext_fn_s *, int user_space_misdn);
/*
* cleanup layer3 statemachines and chaches
* must be called after all layer3 are closed
*/
extern void cleanup_layer3(void);
/*
* open a layer3 stack
* @parameter1 - device id
* @parameter2 - protocol
* @parameter3 - layer3 additional properties
* @parameter4 - callback function to deliver messages
* @parameter5 - pointer for private application use
*/
extern struct mlayer3 *open_layer3(unsigned int, unsigned int, unsigned int, mlayer3_cb_t *, void *);
/*
* close a layer3 stack
* parameter1 - stack struct
*/
extern void close_layer3(struct mlayer3 *);
/*
* run stack for one loop
* parameter1 - stack struct
*/
extern int work_layer3(struct mlayer3 *);
extern unsigned int request_new_pid(struct mlayer3 *);
extern int mISDN_get_pcm_slots(struct mlayer3 *, int, int *, int *);
extern int mISDN_set_pcm_slots(struct mlayer3 *, int, int, int);
extern int add_layer3_ie(struct l3_msg *, unsigned char, int, unsigned char *);
extern void l3_msg_increment_refcnt(struct l3_msg *);
#ifdef MEMLEAK_DEBUG
extern struct l3_msg *__alloc_l3_msg(const char *file, int lineno, const char *func);
extern void __free_l3_msg(struct l3_msg *, const char *file, int lineno, const char *func);
#define alloc_l3_msg() __alloc_l3_msg(__FILE__, __LINE__, __PRETTY_FUNCTION__)
#define free_l3_msg(p) __free_l3_msg(p, __FILE__, __LINE__, __PRETTY_FUNCTION__)
#else
extern struct l3_msg *alloc_l3_msg(void);
extern void free_l3_msg(struct l3_msg *);
#endif
extern void mISDN_set_debug_level(unsigned int);
#ifdef __cplusplus
}
#endif
#endif