Added bridgin support for GSM and SIP
[lcr.git] / message.h
index e95e8e7..6330654 100644 (file)
--- a/message.h
+++ b/message.h
 \*****************************************************************************/ 
 
 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,10 +120,39 @@ 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 { /* bchannel assignment */
+       BCHANNEL_REQUEST,               /* application requests bchannel */
+       BCHANNEL_RELEASE,               /* application releases bchannel */
+       BCHANNEL_ASSIGN,                /* bchannel assigned by LCR */
+       BCHANNEL_ASSIGN_ACK,            /* application acknowledges */
+       BCHANNEL_REMOVE,                /* bchannel removed by LCR */
+       BCHANNEL_REMOVE_ACK,            /* application acknowledges */
+};
+enum {
+       B_STATE_IDLE,           /* not open */
+       B_STATE_ACTIVATING,     /* DL_ESTABLISH sent */
+       B_STATE_ACTIVE,         /* channel active */
+       B_STATE_DEACTIVATING,   /* DL_RELEASE sent */
+       B_STATE_EXPORTING,      /* BCHANNEL_ASSIGN sent */
+       B_STATE_REMOTE,         /* bchannel assigned to remote application */
+       B_STATE_IMPORTING,      /* BCHANNEL_REMOVE sent */
+};
+enum {
+       B_MODE_TRANSPARENT,     /* normal transparent audio */
+       B_MODE_HDLC,            /* hdlc data mode */
+};
+
+/* rtp-info structure */
+struct rtp_info {
+       int payload_type;
+       unsigned int ip;
+       unsigned short port;
 };
 
 /* call-info structure CALLER */
@@ -136,30 +167,38 @@ 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 */
 };
 
 /* 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 */
@@ -167,13 +206,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 */
@@ -184,6 +223,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,... */
@@ -195,8 +235,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 */
@@ -205,6 +244,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 */
@@ -222,13 +268,16 @@ struct useruser_info {
 struct message_setup {
        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 */
+       char context[128];                      /* asterisk context */
 };
 
 /* call-info structure PARK */
@@ -237,15 +286,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) */
@@ -263,12 +303,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 */
@@ -278,6 +318,26 @@ 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? */
+       int mode; /* 0 = direct-mode, 1 = PBX mode */
+};
+
 /* structure of message parameter */
 union parameter {
        struct param_tone tone; /* MESSAGE_TONE */
@@ -287,34 +347,39 @@ 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 */
 };
 
 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;
 };
 
@@ -322,8 +387,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 */
@@ -333,32 +398,31 @@ 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 */
 };
 
 #define MESSAGES static const char *messages_txt[] = { \
        "MESSAGE_NONE", \
        "MESSAGE_TONE", \
        "MESSAGE_DTMF", \
+       "MESSAGE_ENABLEKEYPAD", \
        "MESSAGE_mISDNSIGNAL", \
        "MESSAGE_SETUP", \
        "MESSAGE_INFORMATION", \
@@ -370,28 +434,33 @@ 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", \
 };
 
 
-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);