+}
+static int inter_gsm_ms(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+#ifndef WITH_GSM_MS
+ SPRINT(interface_error, "Error in %s (line %d): GSM MS side not compiled in.\n", filename, line);
+ return(-1);
+#else
+ struct interface *searchif;
+
+ 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(interface->gsm_ms_name, value);
+
+ /* check if name is used multiple times */
+ searchif = interface_newlist;
+ while(searchif) {
+ if (searchif != interface && !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;
+ }
+
+ 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_peer, value);
+ SCPY(interface->sip_remote_peer, p);
+
+ return(0);
+#endif
+}
+static int inter_rtp_bridge(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ int supported = 0;
+
+#ifdef WITH_GSM_BS
+ if (interface->gsm_bs)
+ supported = 1;
+#endif
+#ifdef WITH_SIP
+ if (interface->sip)
+ supported = 1;
+#endif
+ if (!supported) {
+ SPRINT(interface_error, "Error in %s (line %d): Interface does not support RTP\n", filename, line);
+ return(-1);
+ }
+ interface->rtp_bridge = 1;
+
+ return(0);
+}
+#if 0
+static int inter_rtp_payload(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+#ifndef WITH_GSM_BS
+ SPRINT(interface_error, "Error in %s (line %d): GSM BS side not compiled in.\n", filename, line);
+ return(-1);
+#else
+ if (!interface->gsm_bs) {
+ SPRINT(interface_error, "Error in %s (line %d): This parameter only works for GSM BS side interface\n", filename, line);
+ return(-1);
+ }
+ if (!interface->rtp_bridge) {
+ SPRINT(interface_error, "Error in %s (line %d): This parameter only works here, if RTP bridging is enabled\n", filename, line);
+ return(-1);
+ }
+ if (!value[0]) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one payload type\n", filename, line, parameter);
+ return(-1);
+ }
+ if (interface->gsm_bs_payloads == sizeof(interface->gsm_bs_payload_types)) {
+ SPRINT(interface_error, "Error in %s (line %d): Too many payload types defined\n", filename, line);
+ return(-1);
+ }
+ interface->gsm_bs_payload_types[interface->gsm_bs_payloads++] = atoi(value);
+
+ return(0);
+#endif
+}
+#endif
+static int inter_nonotify(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ struct interface_port *ifport;
+
+ /* port in chain ? */
+ if (!interface->ifport) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+ return(-1);
+ }
+ /* goto end of chain */
+ ifport = interface->ifport;
+ while(ifport->next)
+ ifport = ifport->next;
+ ifport->nonotify = 1;
+ return(0);
+}
+#ifdef WITH_SS5
+static int inter_ss5(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ struct interface_port *ifport;
+ char *element;
+
+ /* port in chain ? */
+ if (!interface->ifport) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+ return(-1);
+ }
+ /* goto end of chain */
+ ifport = interface->ifport;
+ while(ifport->next)
+ ifport = ifport->next;
+ ifport->ss5 |= SS5_ENABLE;
+ while((element = strsep(&value, " "))) {
+ if (element[0] == '\0')
+ continue;
+ if (!strcasecmp(element, "connect"))
+ ifport->ss5 |= SS5_FEATURE_CONNECT;
+ else
+ if (!strcasecmp(element, "nodisconnect"))
+ ifport->ss5 |= SS5_FEATURE_NODISCONNECT;
+ else
+ if (!strcasecmp(element, "releaseguardtimer"))
+ ifport->ss5 |= SS5_FEATURE_RELEASEGUARDTIMER;
+ else
+ if (!strcasecmp(element, "bell"))
+ ifport->ss5 |= SS5_FEATURE_BELL;
+ else
+ if (!strcasecmp(element, "pulsedialing"))
+ ifport->ss5 |= SS5_FEATURE_PULSEDIALING;
+ else
+ if (!strcasecmp(element, "delay"))
+ ifport->ss5 |= SS5_FEATURE_DELAY;
+ else
+ if (!strcasecmp(element, "starrelease"))
+ ifport->ss5 |= SS5_FEATURE_STAR_RELEASE;
+ else
+ if (!strcasecmp(element, "suppress"))
+ ifport->ss5 |= SS5_FEATURE_SUPPRESS;
+ else {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' does not allow value element '%s'.\n", filename, line, parameter, element);
+ return(-1);
+ }
+ }
+ return(0);
+}
+#endif
+static int inter_remote(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ struct interface_port *ifport;
+ struct interface *searchif;
+
+ if (!value[0]) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects application name as value.\n", filename, line, parameter);
+ return(-1);
+ }
+ searchif = interface_newlist;
+ while(searchif) {
+ ifport = searchif->ifport;
+ while(ifport) {
+ if (ifport->remote && !strcmp(ifport->remote_app, value)) {
+ SPRINT(interface_error, "Error in %s (line %d): port '%s' already uses remote application '%s'.\n", filename, line, ifport->portname, value);
+ return(-1);
+ }
+ ifport = ifport->next;
+ }
+ 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 application name */
+ ifport = interface->ifport;
+ while(ifport->next)
+ ifport = ifport->next;
+ ifport->remote = 1;
+ SCPY(ifport->remote_app, value);
+
+ return(0);
+}
+static int inter_shutdown(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ interface->shutdown = 1;
+
+ return(0);
+}
+static int inter_bridge(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ if (!value || !value[0]) {
+ SPRINT(interface_error, "Error in %s (line %d): Missing destination interface name.\n", filename, line);
+ return(-1);
+ }
+ interface->app = EAPP_TYPE_BRIDGE;
+ SCPY(interface->bridge_if, value);
+
+ return(0);
+}