We have lot of roaming subscribers which had set up their wap clients
to pack of well-known IPs.
So, to allow them to work I add all these IPs to loopback interface on
bearerbox machine and enable direct routing to them at access server.

The following patch doing the bearerbox part of work.
-- 
Paul P 'Stingray' Komkoff Jr // http://stingr.net/key <- my pgp key
 This message represents the official view of the voices in my head
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/02/22 20:59:50+03:00 [EMAIL PROTECTED] 
#   Add support for multiple wdp interfaces
# 
# gw/bb_udp.c
#   2004/02/22 20:59:49+03:00 [EMAIL PROTECTED] +37 -12
#   Add support for multiple wdp interfaces
# 
diff -Nru a/gw/bb_udp.c b/gw/bb_udp.c
--- a/gw/bb_udp.c       Sun Feb 22 21:49:25 2004
+++ b/gw/bb_udp.c       Sun Feb 22 21:49:25 2004
@@ -324,6 +324,8 @@
 {
     Octstr *interface_name;
     CfgGroup *grp;
+    Octstr *Ifaces;
+    char* cIf;
     int allow_wtls;
     
     if (udp_running) return -1;
@@ -346,13 +348,18 @@
 
     udpc_list = list_create(); /* have a list of running systems */
 
-    add_service(9200, octstr_get_cstr(interface_name));           /* wsp       */
-    add_service(9201, octstr_get_cstr(interface_name));           /* wsp/wtp   */
+    Ifaces = octstr_duplicate(interface_name);
+    cIf = strtok(octstr_get_cstr(Ifaces), " ,;");
+    while (cIf != NULL) {
+       info(0, "Adding interface %s", cIf);
+        add_service(9200, cIf);           /* wsp       */
+        add_service(9201, cIf);           /* wsp/wtp   */
+    
 #ifdef HAVE_WTLS_OPENSSL
-    if (allow_wtls) {
-        add_service(9202, octstr_get_cstr(interface_name));    /* wsp/wtls     */
-        add_service(9203, octstr_get_cstr(interface_name));    /* wsp/wtp/wtls */
-    }
+        if (allow_wtls) {
+             add_service(9202, cIf);    /* wsp/wtls    */
+             add_service(9203, cIf);    /* wsp/wtp/wtls */
+        }
 #else
     if (allow_wtls)
        error(0, "These is a 'wtls' group in configuration, but no WTLS support 
compiled in!");
@@ -361,6 +368,9 @@
     /* add_service(9205, octstr_get_cstr(interface_name));  * vcal     */
     /* add_service(9206, octstr_get_cstr(interface_name));  * vcard/wtls */
     /* add_service(9207, octstr_get_cstr(interface_name));  * vcal/wtls        */
+        cIf = strtok(NULL, " ,;");
+    }
+    octstr_destroy(Ifaces);
     
     octstr_destroy(interface_name);
     
@@ -377,8 +387,10 @@
 int udp_addwdp(Msg *msg)
 {
     int i;
-    Udpc *udpc;
+    Udpc *udpc, *def_udpc;
+    Octstr *ip;
     
+    def_udpc = NULL;
     if (!udp_running) return -1;
     assert(msg != NULL);
     assert(msg_type(msg) == wdp_datagram);
@@ -388,13 +400,26 @@
     for (i=0; i < list_len(udpc_list); i++) {
                udpc = list_get(udpc_list, i);
 
-               if (msg->wdp_datagram.source_port == udp_get_port(udpc->addr))
-               {
-               list_produce(udpc->outgoing_list, msg);
-               list_unlock(udpc_list);
-               return 0;
+               if (msg->wdp_datagram.source_port == udp_get_port(udpc->addr)) {
+                       def_udpc = udpc;
+                        ip = udp_get_ip(udpc->addr);
+                       if (octstr_compare(msg->wdp_datagram.source_address, ip) == 0)
+                       {
+                                octstr_destroy(ip);
+                               list_produce(udpc->outgoing_list, msg);
+                               list_unlock(udpc_list);
+                               return 0;
+                       }
+                        octstr_destroy(ip);
                }
     }
+
+    if (NULL != def_udpc) {
+       list_produce(def_udpc->outgoing_list, msg);
+       list_unlock(udpc_list);
+       return 0;
+    }
+
     list_unlock(udpc_list);
     return -1;
 }

Reply via email to