SIP: Register, STUN and authentication support
[lcr.git] / interface.c
index 7619294..71e1d80 100644 (file)
@@ -994,6 +994,139 @@ static int inter_sip(struct interface *interface, char *filename, int line, char
        return(0);
 #endif
 }
+static int inter_authenticate(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;
+
+       if (!interface->sip) {
+               SPRINT(interface_error, "Error in %s (line %d): This is not a SIP interface.\n", filename, line);
+               return(-1);
+       }
+
+       /* copy values */
+       if (!value || !value[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): Missing SIP user.\n", filename, line);
+               return(-1);
+       }
+       p = get_seperated(value);
+       if (!p[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): Missing SIP password.\n", filename, line);
+               return(-1);
+       }
+       SCPY(interface->sip_auth_user, value);
+       SCPY(interface->sip_auth_password, p);
+
+       return(0);
+#endif
+}
+static int options_timer(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
+       if (!interface->sip) {
+               SPRINT(interface_error, "Error in %s (line %d): This is not a SIP interface.\n", filename, line);
+               return(-1);
+       }
+
+       if (value)
+               interface->sip_options_timer = atoi(value);
+
+       return(0);
+#endif
+}
+static int options_stun(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;
+
+       if (!interface->sip) {
+               SPRINT(interface_error, "Error in %s (line %d): This is not a SIP interface.\n", filename, line);
+               return(-1);
+       }
+
+       if (!value || !value[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): Missing STUN server.\n", filename, line);
+               return(-1);
+       }
+       p = get_seperated(value);
+       if (!p[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): Missing STUN timer.\n", filename, line);
+               return(-1);
+       }
+       SCPY(interface->sip_stun_server, value);
+       interface->sip_stun_interval = atoi(p);
+
+       return(0);
+#endif
+}
+static int inter_rtp_ports(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;
+
+       if (!interface->sip) {
+               SPRINT(interface_error, "Error in %s (line %d): This is not a SIP interface.\n", filename, line);
+               return(-1);
+       }
+
+       /* copy values */
+       if (!value || !value[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): Missing 'from' port.\n", filename, line);
+               return(-1);
+       }
+       p = get_seperated(value);
+       if (!p[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): Missing 'to' port.\n", filename, line);
+               return(-1);
+       }
+       interface->rtp_port_from = atoi(value);
+       interface->rtp_port_to = atoi(p);
+
+       return(0);
+#endif
+}
+static int inter_register(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;
+
+       if (!interface->sip) {
+               SPRINT(interface_error, "Error in %s (line %d): This is not a SIP interface.\n", filename, line);
+               return(-1);
+       }
+
+       /* copy values */
+       if (!value || !value[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): Missing SIP user.\n", filename, line);
+               return(-1);
+       }
+       p = get_seperated(value);
+       if (!p[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): Missing SIP host\n", filename, line);
+               return(-1);
+       }
+       interface->sip_register = 1;
+       SCPY(interface->sip_register_user, value);
+       SCPY(interface->sip_register_host, p);
+
+       return(0);
+#endif
+}
 static int inter_rtp_bridge(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
        int supported = 0;
@@ -1366,9 +1499,19 @@ struct interface_param interface_param[] = {
        {"gsm-ms", &inter_gsm_ms, "<socket name>",
        "Sets up GSM mobile station interface for using Osmocom-BB.\n"
        "The socket will be /tmp/ms_mncc_<socket name>."},
-       {"sip", &inter_sip, "<local IP> <remote IP>",
-       "Sets up SIP interface that represents one SIP endpoint.\n"
-       "Give SIP configuration file."},
+       {"sip", &inter_sip, "<local IP/host> <remote IP/host>",
+       "Sets up SIP interface that represents one SIP endpoint."},
+       {"register", &inter_register, "<user> <host>",
+       "Registers to given SIP registrar."},
+       {"authenticate", &inter_authenticate, "<user> <password>",
+       "Defines SIP user and password for authentication."},
+       {"options-timer", &options_timer, "<timer> | 0",
+       "Defines SIP timer to send OPTIONS messages to keepalive SIP sessions."},
+       {"stun", &options_stun, "<server> <interval>",
+       "Defines STUN server to resolv real local IP.\n"
+       "The interval is used to check if IP has changed. (use 300)"},
+       {"rtp-ports", &inter_rtp_ports, "<port from> <port to>",
+       "Defines the range of ports to be used for RTP. This overrides the default."},
        {"rtp-bridge", &inter_rtp_bridge, "",
        "Enables RTP bridging directly from this interface.\n"
        "This only works if both bridged interfaces use RTP, e.g. between gsm-bs and sip.\n"