Added bridgin support for GSM and SIP
[lcr.git] / interface.c
index 3c1a792..60e058f 100644 (file)
@@ -894,31 +894,19 @@ static int inter_gsm_bs(struct interface *interface, char *filename, int line, c
        SPRINT(interface_error, "Error in %s (line %d): GSM BS side not compiled in.\n", filename, line);
        return(-1);
 #else
-       struct interface_port *ifport;
        struct interface *searchif;
 
        searchif = interface_newlist;
        while(searchif) {
-               ifport = searchif->ifport;
-               while(ifport) {
-                       if (ifport->gsm_bs) {
-                               SPRINT(interface_error, "Error in %s (line %d): port '%s' already uses gsm BS side.\n", filename, line, ifport->portname);
-                               return(-1);
-                       }
-                       ifport = ifport->next;
+               if (searchif->gsm_bs) {
+                       SPRINT(interface_error, "Error in %s (line %d): interface '%s' already uses gsm BS side.\n", filename, line, searchif->name);
+                       return(-1);
                }
                searchif = searchif->next;
        }
 
-       /* set portname */
-       if (inter_portname(interface, filename, line, (char *)"portname", options.loopback_lcr))
-               return(-1);
-
        /* goto end of chain again to set gsmflag */
-       ifport = interface->ifport;
-       while(ifport->next)
-               ifport = ifport->next;
-       ifport->gsm_bs = 1;
+       interface->gsm_bs = 1;
 
        return(0);
 #endif
@@ -929,37 +917,23 @@ static int inter_gsm_ms(struct interface *interface, char *filename, int line, c
        SPRINT(interface_error, "Error in %s (line %d): GSM MS side not compiled in.\n", filename, line);
        return(-1);
 #else
-       struct interface_port *ifport, *searchifport;
        struct interface *searchif;
 
-       /* set portname */
-       if (inter_portname(interface, filename, line, (char *)"portname", options.loopback_lcr))
-               return(-1);
-
-       /* goto end of chain again to set gsmflag and socket */
-       ifport = interface->ifport;
-       while(ifport->next)
-               ifport = ifport->next;
-       ifport->gsm_ms = 1;
+       interface->gsm_ms = 1;
 
        /* copy values */
        if (!value || !value[0]) {
                SPRINT(interface_error, "Error in %s (line %d): Missing MS name and socket name.\n", filename, line);
                return(-1);
        }
-       SCPY(ifport->gsm_ms_name, value);
+       SCPY(interface->gsm_ms_name, value);
 
        /* check if name is used multiple times */
        searchif = interface_newlist;
        while(searchif) {
-               searchifport = searchif->ifport;
-               while(searchifport) {
-                       if (searchifport != ifport 
-                        && !strcmp(searchifport->gsm_ms_name, ifport->gsm_ms_name)) {
-                               SPRINT(interface_error, "Error in %s (line %d): mobile '%s' already uses the given MS name '%s', choose a different one.\n", filename, line, ifport->gsm_ms_name, searchifport->gsm_ms_name);
-                               return(-1);
-                       }
-                       searchifport = searchifport->next;
+               if (!strcmp(searchif->gsm_ms_name, interface->gsm_ms_name)) {
+                       SPRINT(interface_error, "Error in %s (line %d): mobile '%s' already uses the given MS name '%s', choose a different one.\n", filename, line, interface->gsm_ms_name, searchif->gsm_ms_name);
+                       return(-1);
                }
                searchif = searchif->next;
        }
@@ -967,6 +941,38 @@ static int inter_gsm_ms(struct interface *interface, char *filename, int line, c
        return(0);
 #endif
 }
+static int inter_sip(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+#ifndef WITH_SIP
+       SPRINT(interface_error, "Error in %s (line %d): SIP not compiled in.\n", filename, line);
+       return(-1);
+#else
+       char *p;
+
+       interface->sip = 1;
+
+       /* copy values */
+       if (!value || !value[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): Missing SIP local IP.\n", filename, line);
+               return(-1);
+       }
+       p = get_seperated(value);
+       if (!p[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): Missing SIP remote IP.\n", filename, line);
+               return(-1);
+       }
+       SCPY(interface->sip_local_ip, value);
+       SCPY(interface->sip_remote_ip, p);
+
+       return(0);
+#endif
+}
+static int inter_rtp_bridge(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+       interface->rtp_bridge = 1;
+
+       return(0);
+}
 static int inter_nonotify(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
        struct interface_port *ifport;
@@ -1214,6 +1220,12 @@ struct interface_param interface_param[] = {
        "The name of the MS folows the interface name.\n"
        "The socket is /tmp/osmocom_l2 by default and need to be changed when multiple\n"
        "MS interfaces are used."},
+       {"sip", &inter_sip, "<local IP> <remote IP>",
+       "Sets up SIP interface that represents one SIP endpoint.\n"
+       "Give SIP configuration file."},
+       {"rtp-bridge", &inter_rtp_bridge, "",
+       "Sets up SIP interface that represents one SIP endpoint.\n"
+       "Give SIP configuration file."},
        {"nonotify", &inter_nonotify, "",
        "Prevents sending notify messages to this interface. A call placed on hold will\n"
        "Not affect the remote end (phone or telcom switch).\n"
@@ -1491,23 +1503,65 @@ static void set_defaults(struct interface_port *ifport)
 void relink_interfaces(void)
 {
        struct mISDNport *mISDNport;
-       struct interface *interface;
+       struct interface *interface, *temp;
        struct interface_port *ifport;
+       int found;
 
-       /* unlink all mISDNports */
-       mISDNport = mISDNport_first;
-       while(mISDNport) {
-               if (mISDNport->ifport) {
-                       ifport = mISDNport->ifport;
+       interface = interface_first;
+       while(interface) {
+               found = 0;
+               temp = interface_newlist;
+               while(temp) {
+                       if (!strcmp(temp->name, interface->name))
+                               found = 1;
+                       temp = temp->next;
+               }
+               if (!found) {
 #ifdef WITH_GSM_MS
-                       if (ifport->gsm_ms)
-                               gsm_ms_delete(ifport->gsm_ms_name);
+                       if (interface->gsm_ms)
+                               gsm_ms_delete(interface->gsm_ms_name);
 #endif
 #ifdef WITH_GSM_BS
-                       if (ifport->gsm_bs)
+                       if (interface->gsm_bs)
                                gsm_bs_exit(0);
 #endif
+#ifdef WITH_SIP
+                       if (interface->sip)
+                               sip_exit_inst(interface);
+#endif
                }
+               interface = interface->next;
+       }
+
+       interface = interface_newlist;
+       while(interface) {
+               found = 0;
+               temp = interface_first;
+               while(temp) {
+                       if (!strcmp(temp->name, interface->name))
+                               found = 1;
+                       temp = temp->next;
+               }
+               if (!found) {
+#ifdef WITH_GSM_MS
+                       if (interface->gsm_ms)
+                               gsm_ms_new(interface);
+#endif
+#ifdef WITH_GSM_BS
+                       if (interface->gsm_bs)
+                               gsm_bs_init(interface);
+#endif
+#ifdef WITH_SIP
+                       if (interface->sip)
+                               sip_init_inst(interface);
+#endif
+               }
+               interface = interface->next;
+       }
+
+       /* unlink all mISDNports */
+       mISDNport = mISDNport_first;
+       while(mISDNport) {
                mISDNport->ifport = NULL;
                mISDNport = mISDNport->next;
        }
@@ -1587,14 +1641,6 @@ void load_port(struct interface_port *ifport)
                set_defaults(ifport);
                /* load static port instances */
                mISDNport_static(mISDNport);
-#ifdef WITH_GSM_MS
-               if (ifport->gsm_ms)
-                       gsm_ms_new(ifport->gsm_ms_name);
-#endif
-#ifdef WITH_GSM_BS
-               if (ifport->gsm_bs)
-                       gsm_bs_init();
-#endif
        } else {
                ifport->block = 2; /* not available */
        }
@@ -1632,12 +1678,21 @@ void doc_interface(void)
 /* screen caller id
  * out==0: incoming caller id, out==1: outgoing caller id
  */
-void do_screen(int out, char *id, int idsize, int *type, int *present, struct interface *interface)
+void do_screen(int out, char *id, int idsize, int *type, int *present, const char *interface_name)
 {
        char                    *msn1;
        struct interface_msn    *ifmsn;
        struct interface_screen *ifscreen;
        char suffix[64];
+       struct interface *interface = interface_first;
+
+       while (interface) {
+               if (!strcmp(interface->name, interface_name))
+                       break;
+               interface = interface->next;
+       }
+       if (!interface)
+               return;
 
        /* screen incoming caller id */
        if (!out) {