Module: sip-router
Branch: master
Commit: 178b21cc1f7f7f7a3fa10b6937755f6b72ec84b3
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=178b21cc1f7f7f7a3fa10b6937755f6b72ec84b3

Author: Daniel-Constantin Mierla <mico...@gmail.com>
Committer: Daniel-Constantin Mierla <mico...@gmail.com>
Date:   Sun Aug 14 22:59:53 2011 +0200

core: new core event for received datagrams

- event type defined as SREV_NET_DGRAM_IN
- allow modules to get a callback when a udp datagram is received
- offers the possibility to handle different content sent via datagram,
  such as HEP from Homer project, without invading the core with new
  code

---

 events.c     |   11 +++++++++++
 events.h     |    2 ++
 udp_server.c |   12 ++++++++++++
 3 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/events.c b/events.c
index fccfd1c..048cb45 100644
--- a/events.c
+++ b/events.c
@@ -81,6 +81,11 @@ int sr_event_register_cb(int type, sr_event_cb_f f)
                                        _sr_events_list.pkg_set_real_used = f;
                                else return -1;
                        break;
+               case SREV_NET_DGRAM_IN:
+                               if(_sr_events_list.net_dgram_in==0)
+                                       _sr_events_list.net_dgram_in = f;
+                               else return -1;
+                       break;
                default:
                        return -1;
        }
@@ -154,6 +159,12 @@ int sr_event_exec(int type, void *data)
                                        ret = 
_sr_events_list.pkg_set_real_used(data);
                                        return ret;
                                } else return 1;
+               case SREV_NET_DGRAM_IN:
+                               if(unlikely(_sr_events_list.net_dgram_in!=0))
+                               {
+                                       ret = 
_sr_events_list.net_dgram_in(data);
+                                       return ret;
+                               } else return 1;
                default:
                        return -1;
        }
diff --git a/events.h b/events.h
index fdbcb45..465976f 100644
--- a/events.h
+++ b/events.h
@@ -29,6 +29,7 @@
 #define SREV_CFG_RUN_ACTION            4
 #define SREV_PKG_SET_USED              5
 #define SREV_PKG_SET_REAL_USED 6
+#define SREV_NET_DGRAM_IN              7
 
 typedef int (*sr_event_cb_f)(void *data);
 
@@ -39,6 +40,7 @@ typedef struct sr_event_cb {
        sr_event_cb_f run_action;
        sr_event_cb_f pkg_set_used;
        sr_event_cb_f pkg_set_real_used;
+       sr_event_cb_f net_dgram_in;
 } sr_event_cb_t;
 
 void sr_event_cb_init(void);
diff --git a/udp_server.c b/udp_server.c
index c2c45bb..3889a65 100644
--- a/udp_server.c
+++ b/udp_server.c
@@ -75,6 +75,7 @@
 #include "mem/mem.h"
 #include "ip_addr.h"
 #include "cfg/cfg_struct.h"
+#include "events.h"
 #ifdef USE_RAW_SOCKS
 #include "raw_sock.h"
 #endif /* USE_RAW_SOCKS */
@@ -475,6 +476,17 @@ int udp_rcv_loop()
                su2ip_addr(&ri.src_ip, from);
                ri.src_port=su_getport(from);
 
+               if(unlikely(sr_event_enabled(SREV_NET_DGRAM_IN)))
+               {
+                       void *sredp[3];
+                       sredp[0] = (void*)buf;
+                       sredp[1] = (void*)(&len);
+                       sredp[2] = (void*)(&ri);
+                       if(sr_event_exec(SREV_NET_DGRAM_IN, (void*)sredp)<0) {
+                               /* data handled by callback - continue to next 
packet */
+                               continue;
+                       }
+               }
 #ifndef NO_ZERO_CHECKS
 #ifdef USE_STUN
                /* STUN support can be switched off even if it's compiled */


_______________________________________________
sr-dev mailing list
sr-dev@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to