X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=message.h;h=97bfddce97edc189e3db59304fb4ca9bae7e8ab9;hp=0a56b9811ce4501083f5aaff481af0f7d4368e4a;hb=3f7ef909c907a374a1760ffae0c01b49487f18d7;hpb=2ed0fee489c37a6e2d4473f6185ebbe3e746ac11 diff --git a/message.h b/message.h index 0a56b98..97bfddc 100644 --- a/message.h +++ b/message.h @@ -1,6 +1,6 @@ /*****************************************************************************\ ** ** -** PBX4Linux ** +** Linux Call Router ** ** ** **---------------------------------------------------------------------------** ** Copyright: Andreas Eversberg ** @@ -10,38 +10,40 @@ \*****************************************************************************/ enum { /* interface types */ - INFO_ITYPE_ISDN, + INFO_ITYPE_ISDN, /* call from external */ INFO_ITYPE_ISDN_EXTENSION, /* call from internal extension */ INFO_ITYPE_CHAN, - INFO_ITYPE_VBOX, + INFO_ITYPE_VBOX }; enum { /* number types */ + INFO_NTYPE_NOTPRESENT = 0, INFO_NTYPE_UNKNOWN, INFO_NTYPE_SUBSCRIBER, INFO_NTYPE_NATIONAL, - INFO_NTYPE_INTERNATIONAL, + INFO_NTYPE_INTERNATIONAL }; enum { /* number presentation */ - INFO_PRESENT_NULL, - INFO_PRESENT_ALLOWED, - INFO_PRESENT_RESTRICTED, INFO_PRESENT_NOTAVAIL, + INFO_PRESENT_ALLOWED, + INFO_PRESENT_RESTRICTED }; enum { /* number presentation */ INFO_SCREEN_USER, /* user provided */ - INFO_SCREEN_NETWORK, /* network provided */ + INFO_SCREEN_USER_VERIFIED_PASSED, + INFO_SCREEN_USER_VERIFIED_FAILED, + INFO_SCREEN_NETWORK /* network provided */ }; enum { /* redirection reason */ - INFO_REDIR_UNKNOWN, + INFO_REDIR_UNKNOWN = 0, INFO_REDIR_BUSY, INFO_REDIR_NORESPONSE, INFO_REDIR_UNCONDITIONAL, INFO_REDIR_OUTOFORDER, - INFO_REDIR_CALLDEFLECT, + INFO_REDIR_CALLDEFLECT }; #define INFO_NOTIFY_NONE 0x00 @@ -118,17 +120,46 @@ enum { /* diversion types */ #define INFO_HLC_AUDIOVISUAL 0xe0 enum { /* isdnsignal */ - mISDNSIGNAL_VOLUME, - mISDNSIGNAL_CONF, - mISDNSIGNAL_NODATA, /* no data required */ - mISDNSIGNAL_ECHO, + mISDNSIGNAL_VOLUME, /* change volume */ + mISDNSIGNAL_CONF, /* joint/split conference */ + mISDNSIGNAL_ECHO, /* enable/disable echoe */ + mISDNSIGNAL_DELAY, /* use delay or adaptive jitter */ +}; + +enum { + B_STATE_IDLE, /* not open */ + B_STATE_ACTIVATING, /* DL_ESTABLISH sent */ + B_STATE_ACTIVE, /* channel active */ + B_STATE_DEACTIVATING, /* DL_RELEASE sent */ +}; + +enum { + B_MODE_TRANSPARENT, /* normal transparent audio */ + B_MODE_HDLC, /* hdlc data mode */ +}; + +enum { + MEDIA_TYPE_ALAW = 1, + MEDIA_TYPE_ULAW, + MEDIA_TYPE_GSM, + MEDIA_TYPE_GSM_EFR, + MEDIA_TYPE_AMR, + MEDIA_TYPE_GSM_HR, +}; + +/* rtp-info structure */ +struct rtp_info { + int payloads; /* number of payloads offered */ + unsigned char payload_types[32];/* rtp payload types */ + int media_types[32]; /* media type of given payload */ + unsigned int ip; /* peer's IP */ + unsigned short port; /* peer's port */ }; /* call-info structure CALLER */ struct caller_info { char id[32]; /* id of caller (user number) */ - char voip[64]; /* URI of voip (or gateway) */ - char intern[32]; /* internal id */ + char extension[32]; /* internal id */ char name[16]; int isdn_port; /* internal/external port (if call is isdn) */ char interface[32]; /* interface name the call was from */ @@ -137,30 +168,39 @@ struct caller_info { int present; /* presentation */ int screen; /* who provided the number */ char display[84]; /* display information */ + char id2[32]; /* second callerid */ + int ntype2; /* second type of number */ + int present2; /* second presentation */ + int screen2; /* second who provided the number */ + char imsi[16]; /* IMSI for gsm originated calls */ }; /* call-info structure DIALING */ struct dialing_info { - char number[256]; /* number dialing (so far) */ + char id[256]; /* number dialing (so far) */ char interfaces[128]; /* interfaces for extenal calls */ int itype; /* type of interface */ int ntype; /* type of number */ int sending_complete; /* end of dialing */ + char display[84]; /* display information */ + char keypad[33]; /* send keypad facility */ + char context[32]; /* asterisk context */ }; /* call-info structure CONNECT */ struct connect_info { char id[32]; /* id of caller (user number) */ - char voip[64]; /* URI of voip (or gateway) */ - char intern[32]; /* internal id */ + char extension[32]; /* internal id */ char name[16]; int isdn_port; /* internal/external port (if call is isdn) */ - char interfaces[128]; /* interfaces for extenal calls */ + char interface[128]; /* interface for extenal calls */ int itype; /* type of interface */ int ntype; /* type of number */ int present; /* presentation */ int screen; /* who provided the number */ char display[84]; /* display information */ + char imsi[16]; /* IMSI for gsm terminated calls */ + struct rtp_info rtpinfo; /* info about RTP peer */ }; /* call-info structure DISCONNECT */ @@ -168,13 +208,13 @@ struct disconnect_info { int cause; /* reason for disconnect */ int location; /* disconnect location */ char display[84]; /* optional display information */ + int force; /* special flag to release imediately */ }; /* call-info structure REDIR */ struct redir_info { char id[32]; /* id of caller (user number) */ - char voip[64]; /* host of voip (or gateway) */ - char intern[32]; /* internal id */ + char extension[32]; /* internal id */ int isdn_port; /* internal/external port (if call is isdn) */ int itype; /* type of interface */ int ntype; /* type of number */ @@ -185,6 +225,7 @@ struct redir_info { /* call-info structure capability */ struct capa_info { + int source_mode; /* forward mode */ int bearer_capa; /* capability */ int bearer_mode; /* circuit/packet */ int bearer_info1; /* alaw,ulaw,... */ @@ -196,8 +237,7 @@ struct capa_info { struct notify_info { int notify; /* notifications (see INFO_NOTIFY_*) */ char id[32]; /* redirection id (user number) */ - char voip[64]; /* host of voip (or gateway) */ - char intern[32]; /* internal id */ + char extension[32]; /* internal id */ int isdn_port; /* internal/external port (if call is isdn) */ int itype; /* type of interface */ int ntype; /* type of number */ @@ -206,6 +246,13 @@ struct notify_info { int local; /* if set, endpoints gets information about audio channel (open/close) */ }; +/* call-info structure PROGRESS */ +struct progress_info { + int progress; /* progress indicator */ + int location; /* progress location */ + struct rtp_info rtpinfo; /* info about RTP peer */ +}; + /* call-info structure FACILITY */ struct facility_info { char data[256]; /* data info about facility */ @@ -221,15 +268,17 @@ struct useruser_info { /* call-info structure SETUP */ struct message_setup { - int isdn_port; /* card number 1...n (only on calls from internal isdn port) */ + int isdn_port; /* card number 1...n (only on calls from isdn port) */ int port_type; /* type of port (only required if message is port -> epoint) */ - int dtmf; /* used to enabled dtmf dialing at setup state */ int partyline; /* if set, call will be a conference room */ + int partyline_jingle; /* if set, the jingle will be played on conference join */ struct caller_info callerinfo; /* information about the caller */ struct dialing_info dialinginfo; /* information about dialing */ struct redir_info redirinfo; /* info on redirection (to the calling user) */ struct capa_info capainfo; /* info on l2,l3 capability */ struct useruser_info useruser; /* user-user */ + struct progress_info progress; /* info on call progress */ + struct rtp_info rtpinfo; /* info about RTP peer */ }; /* call-info structure PARK */ @@ -238,15 +287,6 @@ struct park_info { int len; }; -/* DATA */ -struct param_data { - unsigned char data[512]; /* audio/hdlc data */ - int len; /* audio/hdlc data */ - int compressed; /* 0 for law-data, 1 for 16-bit data */ - unsigned long port_id; /* to identify the source of this data */ - int port_type; /* type of the source's port */ -}; - struct param_play { char file[512]; /* file name */ int offset; /* offset to start file at (in seconds) */ @@ -264,12 +304,12 @@ struct param_counter { struct param_mISDNsignal { int message; - int rxvol; - int txvol; + int tx_gain; + int rx_gain; int conf; - int nodata; int tone; int echo; + int delay; }; /* encryption control structure CRYPT */ @@ -279,6 +319,36 @@ struct param_crypt { unsigned char data[512+32]; /* a block of 512 byte + some overhead */ }; +struct param_hello { + char application[32]; /* name of remote application */ +}; + +struct param_bchannel { + int type; /* BCHANNEL_* */ + unsigned int handle; /* bchannel stack/portid */ + int isloopback; /* in this case the application behaves like an interface, dsp should not be used */ + int tx_gain, rx_gain; + char pipeline[256]; + unsigned char crypt[128]; + int crypt_len; + int crypt_type; /* 1 = blowfish */ +}; + +struct param_newref { + int direction; /* who requests a refe? */ +}; + +struct param_traffic { + int len; /* how much data */ + unsigned char data[160]; /* 20ms */ +}; + +struct param_3pty { + int begin, end; + int invoke, result, error; + unsigned char invoke_id; +}; + /* structure of message parameter */ union parameter { struct param_tone tone; /* MESSAGE_TONE */ @@ -288,34 +358,42 @@ union parameter { struct connect_info connectinfo; /* CONNECT INFO */ struct disconnect_info disconnectinfo; /* DISCONNECT INFO */ struct notify_info notifyinfo; /* some notifications */ + struct progress_info progressinfo; /* some progress */ struct facility_info facilityinfo; /* some notifications */ struct park_info parkinfo; /* MESSAGE_SUSPEND, MESSAGE_RESUME */ int state; /* MESSAGE_TIMEOUT */ int knock; /* MESSAGE_KNOCK 0=off !0=on */ - int channel; /* MESSAGE_CHANNEL see RELATION_CHANNEL_* (call.h) */ - struct param_data data; /* MESSAGE_DATA */ + int audiopath; /* MESSAGE_audiopath see RELATION_CHANNEL_* (join.h) */ struct param_play play; /* MESSAGE_VBOX_PLAY */ int speed; /* MESSAGE_VBOX_PLAY_SPEED */ struct param_counter counter; /* MESSAGE_TONE_COUNTER */ struct param_mISDNsignal mISDNsignal; /* MESSAGE_mISDNSIGNAL */ struct extension ext; /* tell port about extension information */ struct param_crypt crypt; /* MESSAGE_CRYPT */ + struct param_hello hello; /* MESSAGE_HELLO */ + struct param_bchannel bchannel; /* MESSAGE_BCHANNEL */ + struct param_newref newref; /* MESSAGE_NEWREF */ + unsigned int bridge_id; /* MESSAGE_BRIDGE */ + struct param_traffic traffic; /* MESSAGE_TRAFFIC */ + struct param_3pty threepty; /* MESSAGE_TRAFFIC */ + unsigned int queue; /* MESSAGE_DISABLE_DEJITTER */ }; enum { /* message flow */ PORT_TO_EPOINT, - EPOINT_TO_CALL, - CALL_TO_EPOINT, + EPOINT_TO_JOIN, + JOIN_TO_EPOINT, EPOINT_TO_PORT, }; /* message structure */ -struct message { - struct message *next; +struct lcr_msg { + struct lcr_msg *next; int type; /* type of message */ int flow; /* from where to where */ - unsigned long id_from; /* in case of flow==PORT_TO_EPOINT: id_from is the port's serial, id_to is the epoint's serial */ - unsigned long id_to; + unsigned int id_from; /* in case of flow==PORT_TO_EPOINT: id_from is the port's serial, id_to is the epoint's serial */ + unsigned int id_to; + int keep; union parameter param; }; @@ -323,8 +401,8 @@ enum { /* messages between entities */ MESSAGE_NONE, /* no message */ MESSAGE_TONE, /* set information tone (to isdn port) */ MESSAGE_DTMF, /* dtmf digit (from isdn port) */ + MESSAGE_ENABLEKEYPAD, /* remote application requests keypad/dtmf */ MESSAGE_mISDNSIGNAL, /* special mixer command (down to isdn port) */ - MESSAGE_SETUP, /* setup message */ MESSAGE_INFORMATION, /* additional digit information */ MESSAGE_OVERLAP, /* call accepted, send more information */ @@ -334,32 +412,34 @@ enum { /* messages between entities */ MESSAGE_DISCONNECT, /* disconnect with cause */ MESSAGE_RELEASE, /* release with cause */ MESSAGE_TIMEOUT, /* protocol state has timed out (port->epoint) */ - MESSAGE_NOTIFY, /* used to send progress and notify infos */ + MESSAGE_NOTIFY, /* used to send notify info */ + MESSAGE_PROGRESS, /* used to send progress info */ MESSAGE_FACILITY, /* used to facility infos, like aocd */ - MESSAGE_SUSPEND, /* suspend port */ MESSAGE_RESUME, /* resume port */ - - MESSAGE_CHANNEL, /* set status of audio path to endpoint (to call, audio is also set) */ - MESSAGE_REMOTE_AUDIO, /* tell remote to set audio status */ + MESSAGE_AUDIOPATH, /* set status of audio path to endpoint (to call, audio is also set) */ MESSAGE_PATTERN, /* pattern information tones available */ MESSAGE_NOPATTERN, /* pattern information tones unavailable */ MESSAGE_CRYPT, /* encryption message */ - - MESSAGE_DATA, /* audio/hdlc data */ - MESSAGE_VBOX_PLAY, /* play recorded file */ MESSAGE_VBOX_PLAY_SPEED,/* change speed of file */ MESSAGE_VBOX_TONE, /* set answering VBOX tone */ MESSAGE_TONE_COUNTER, /* tone counter (for VBOX tone use) */ MESSAGE_TONE_EOF, /* tone is end of file */ - MESSAGE_VBOX_RECORD, /* tell endpoint to start recording */ + MESSAGE_BCHANNEL, /* request/assign/remove bchannel */ + MESSAGE_HELLO, /* hello message for remote application */ + MESSAGE_NEWREF, /* special message to create and inform ref */ + MESSAGE_BRIDGE, /* control port bridge */ + MESSAGE_TRAFFIC, /* exchange bchannel traffic */ + MESSAGE_3PTY, /* 3PTY call invoke */ + MESSAGE_DISABLE_DEJITTER/* tell (mISDN) port not to dejitter */ }; #define MESSAGES static const char *messages_txt[] = { \ "MESSAGE_NONE", \ "MESSAGE_TONE", \ "MESSAGE_DTMF", \ + "MESSAGE_ENABLEKEYPAD", \ "MESSAGE_mISDNSIGNAL", \ "MESSAGE_SETUP", \ "MESSAGE_INFORMATION", \ @@ -371,28 +451,36 @@ enum { /* messages between entities */ "MESSAGE_RELEASE", \ "MESSAGE_TIMEOUT", \ "MESSAGE_NOTIFY", \ + "MESSAGE_PROGRESS", \ "MESSAGE_FACILITY", \ "MESSAGE_SUSPEND", \ "MESSAGE_RESUME", \ - "MESSAGE_CHANNEL", \ - "MESSAGE_REMOTE_AUDIO", \ + "MESSAGE_AUDIOPATH", \ "MESSAGE_PATTERN", \ "MESSAGE_NOPATTERN", \ "MESSAGE_CRYPT", \ - "MESSAGE_DATA", \ "MESSAGE_VBOX_PLAY", \ "MESSAGE_VBOX_PLAY_SPEED", \ "MESSAGE_VBOX_TONE", \ "MESSAGE_TONE_COUNTER", \ "MESSAGE_TONE_EOF", \ - "MESSAGE_VBOX_RECORD", \ + "MESSAGE_BCHANNEL", \ + "MESSAGE_HELLO", \ + "MESSAGE_NEWREF", \ + "MESSAGE_BRIDGE", \ + "MESSAGE_TRAFFIC", \ + "MESSAGE_3PTY", \ + "MESSAGE_DISABLE_DEJITTER", \ }; -struct message *message_create(int id_from, int id_to, int flow, int type); -void message_put(struct message *message); -struct message *message_get(void); -void message_free(struct message *message); - +struct lcr_msg *message_create(int id_from, int id_to, int flow, int type); +#define message_put(m) _message_put(m, __FILE__, __LINE__) +void _message_put(struct lcr_msg *message, const char *file, int line); +struct lcr_msg *message_forward(int id_from, int id_to, int flow, union parameter *param); +struct lcr_msg *message_get(void); +void message_free(struct lcr_msg *message); +void init_message(void); +void cleanup_message(void);