Kannel: Open Source WAP and SMS gateway  $Revision: 5037 $
bb_udp.c File Reference
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <assert.h>
#include "gwlib/gwlib.h"
#include "msg.h"
#include "bearerbox.h"

Go to the source code of this file.

Data Structures

struct  _udpc
 

Typedefs

typedef struct _udpc Udpc
 

Functions

static void udpc_destroy (Udpc *udpc)
 
static void udp_receiver (void *arg)
 
static int send_udp (int fd, Msg *msg)
 
static void udp_sender (void *arg)
 
static Udpcudpc_create (int port, char *interface_name)
 
static int add_service (int port, char *interface_name)
 
int udp_start (Cfg *cfg)
 
int udp_addwdp (Msg *msg)
 
int udp_shutdown (void)
 
int udp_die (void)
 
int udp_outgoing_queue (void)
 

Variables

volatile sig_atomic_t bb_status
 
Listincoming_wdp
 
Counterincoming_wdp_counter
 
Counteroutgoing_wdp_counter
 
Listflow_threads
 
Listsuspended
 
Listisolated
 
static volatile sig_atomic_t udp_running
 
static Listudpc_list
 
static Octstrallow_ip
 
static Octstrdeny_ip
 

Typedef Documentation

typedef struct _udpc Udpc

Function Documentation

static int add_service ( int  port,
char *  interface_name 
)
static

Definition at line 292 of file bb_udp.c.

References error(), gwlist_add_producer(), gwlist_append(), gwthread_create, _udpc::outgoing_list, _udpc::receiver, udp_receiver(), udp_sender(), udpc_create(), and udpc_destroy().

Referenced by udp_start().

293 {
294  Udpc *udpc;
295 
296  if ((udpc = udpc_create(port, interface_name)) == NULL)
297  goto error;
299 
300  udpc->receiver = gwthread_create(udp_receiver, udpc);
301  if (udpc->receiver == -1)
302  goto error;
303 
304  if (gwthread_create(udp_sender, udpc) == -1)
305  goto error;
306 
307  gwlist_append(udpc_list, udpc);
308  return 0;
309 
310 error:
311  error(0, "Failed to start UDP receiver/sender thread");
312  udpc_destroy(udpc);
313  return -1;
314 }
void error(int err, const char *fmt,...)
Definition: log.c:612
Definition: http.c:1998
void gwlist_append(List *list, void *item)
Definition: list.c:179
static List * udpc_list
Definition: bb_udp.c:97
static void udpc_destroy(Udpc *udpc)
Definition: bb_udp.c:277
Definition: bb_udp.c:100
static void udp_receiver(void *arg)
Definition: bb_udp.c:123
List * outgoing_list
Definition: bb_udp.c:103
#define gwthread_create(func, arg)
Definition: gwthread.h:90
long receiver
Definition: bb_udp.c:104
static Udpc * udpc_create(int port, char *interface_name)
Definition: bb_udp.c:242
static Octstr * interface_name
Definition: wapproxy.c:111
void gwlist_add_producer(List *list)
Definition: list.c:383
static void udp_sender(void *arg)
Definition: bb_udp.c:205
static int send_udp ( int  fd,
Msg msg 
)
static

Definition at line 190 of file bb_udp.c.

References error(), octstr_destroy(), udp_create_address(), and udp_sendto().

Referenced by udp_sender().

191 {
192  Octstr *cliaddr;
193  int ret;
194 
195  cliaddr = udp_create_address(msg->wdp_datagram.destination_address,
196  msg->wdp_datagram.destination_port);
197  ret = udp_sendto(fd, msg->wdp_datagram.user_data, cliaddr);
198  if (ret == -1)
199  error(0, "WDP/UDP: could not send UDP datagram");
200  octstr_destroy(cliaddr);
201  return ret;
202 }
void error(int err, const char *fmt,...)
Definition: log.c:612
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
Definition: octstr.c:118
int udp_sendto(int s, Octstr *datagram, Octstr *addr)
Definition: socket.c:567
Octstr * udp_create_address(Octstr *host_or_ip, int port)
Definition: socket.c:517
int udp_addwdp ( Msg msg)

Definition at line 385 of file bb_udp.c.

References _udpc::addr, gwlist_get(), gwlist_len(), gwlist_lock(), gwlist_produce(), gwlist_unlock(), octstr_compare(), octstr_destroy(), _udpc::outgoing_list, udp_get_ip(), udp_get_port(), and udp_running.

Referenced by wdp_router().

386 {
387  int i;
388  Udpc *udpc, *def_udpc;
389  Octstr *ip;
390 
391  def_udpc = NULL;
392  if (!udp_running) return -1;
393  assert(msg != NULL);
394  assert(msg_type(msg) == wdp_datagram);
395 
397  /* select in which list to add this */
398  for (i=0; i < gwlist_len(udpc_list); i++) {
399  udpc = gwlist_get(udpc_list, i);
400 
401  if (msg->wdp_datagram.source_port == udp_get_port(udpc->addr)) {
402  def_udpc = udpc;
403  ip = udp_get_ip(udpc->addr);
404  if (octstr_compare(msg->wdp_datagram.source_address, ip) == 0) {
405  octstr_destroy(ip);
406  gwlist_produce(udpc->outgoing_list, msg);
408  return 0;
409  }
410  octstr_destroy(ip);
411  }
412  }
413 
414  if (NULL != def_udpc) {
415  gwlist_produce(def_udpc->outgoing_list, msg);
417  return 0;
418  }
419 
421  return -1;
422 }
void gwlist_produce(List *list, void *item)
Definition: list.c:411
long gwlist_len(List *list)
Definition: list.c:166
int udp_get_port(Octstr *addr)
Definition: socket.c:547
void * gwlist_get(List *list, long pos)
Definition: list.c:292
msg_type
Definition: msg.h:73
static List * udpc_list
Definition: bb_udp.c:97
void gwlist_unlock(List *list)
Definition: list.c:354
Definition: bb_udp.c:100
List * outgoing_list
Definition: bb_udp.c:103
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
Octstr * addr
Definition: bb_udp.c:102
void gwlist_lock(List *list)
Definition: list.c:347
Definition: octstr.c:118
static volatile sig_atomic_t udp_running
Definition: bb_udp.c:96
Octstr * udp_get_ip(Octstr *addr)
Definition: socket.c:557
int octstr_compare(const Octstr *ostr1, const Octstr *ostr2)
Definition: octstr.c:869
int udp_die ( void  )

Definition at line 434 of file bb_udp.c.

References debug(), gwlist_consume(), gwlist_destroy(), gwlist_remove_producer(), octstr_destroy(), _udpc::outgoing_list, and udp_running.

Referenced by wdp_router().

435 {
436  Udpc *udpc;
437 
438  if (!udp_running) return -1;
439 
440  /*
441  * remove producers from all outgoing lists.
442  */
443  debug("bb.udp", 0, "udp_die: removing producers from udp-lists");
444 
445  while((udpc = gwlist_consume(udpc_list)) != NULL) {
447  }
448  gwlist_destroy(udpc_list, NULL);
449  udp_running = 0;
450 
453  allow_ip = NULL;
454  deny_ip = NULL;
455 
456  return 0;
457 }
static List * udpc_list
Definition: bb_udp.c:97
Definition: bb_udp.c:100
void gwlist_remove_producer(List *list)
Definition: list.c:401
List * outgoing_list
Definition: bb_udp.c:103
static Octstr * deny_ip
Definition: bb_udp.c:112
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
static Octstr * allow_ip
Definition: bb_udp.c:111
void * gwlist_consume(List *list)
Definition: list.c:427
void debug(const char *place, int err, const char *fmt,...)
Definition: log.c:690
static volatile sig_atomic_t udp_running
Definition: bb_udp.c:96
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145
int udp_outgoing_queue ( void  )

Definition at line 460 of file bb_udp.c.

References gwlist_get(), gwlist_len(), gwlist_lock(), gwlist_unlock(), _udpc::outgoing_list, and udp_running.

Referenced by bb_print_status().

461 {
462  int i, q = 0;
463  Udpc *udpc;
464 
465  if (!udp_running || udpc_list == NULL)
466  return 0;
467 
469  for (i=0; i < gwlist_len(udpc_list); i++) {
470  udpc = gwlist_get(udpc_list, i);
471  q += gwlist_len(udpc->outgoing_list);
472  }
474  return q;
475 }
long gwlist_len(List *list)
Definition: list.c:166
void * gwlist_get(List *list, long pos)
Definition: list.c:292
static List * udpc_list
Definition: bb_udp.c:97
void gwlist_unlock(List *list)
Definition: list.c:354
Definition: bb_udp.c:100
List * outgoing_list
Definition: bb_udp.c:103
void gwlist_lock(List *list)
Definition: list.c:347
static volatile sig_atomic_t udp_running
Definition: bb_udp.c:96
static void udp_receiver ( void *  arg)
static

Definition at line 123 of file bb_udp.c.

References _udpc::addr, BB_DEAD, BB_SHUTDOWN, bb_status, counter_increase(), debug(), error(), _udpc::fd, gwlist_add_producer(), gwlist_consume(), gwlist_produce(), gwlist_remove_producer(), gwthread_wakeup(), is_allowed_ip(), MAIN_THREAD_ID, msg, msg_create, octstr_destroy(), octstr_get_cstr, read_available(), udp_get_ip(), udp_get_port(), udp_recvfrom(), and warning().

Referenced by add_service().

124 {
125  Octstr *datagram, *cliaddr;
126  int ret;
127  Msg *msg;
128  Udpc *conn = arg;
129  Octstr *ip;
130 
134 
135  /* remove messages from socket until it is closed */
136  while (bb_status != BB_DEAD && bb_status != BB_SHUTDOWN) {
137 
138  gwlist_consume(isolated); /* block here if suspended/isolated */
139 
140  if (read_available(conn->fd, 100000) < 1)
141  continue;
142 
143  ret = udp_recvfrom(conn->fd, &datagram, &cliaddr);
144  if (ret == -1) {
145  if (errno == EAGAIN)
146  /* No datagram available, don't block. */
147  continue;
148 
149  error(errno, "Failed to receive an UDP");
150  /*
151  * just continue, or is there ANY error that would result
152  * in situation where it would be better to break; or even
153  * die off? - Kalle 28.2
154  */
155  continue;
156  }
157 
158  /* discard the message if the client is not allowed */
159  ip = udp_get_ip(cliaddr);
160  if (!is_allowed_ip(allow_ip, deny_ip, ip)) {
161  warning(0, "UDP: Discarding packet from %s, IP is denied.",
162  octstr_get_cstr(ip));
163  octstr_destroy(datagram);
164  } else {
165  debug("bb.udp", 0, "datagram received");
166  msg = msg_create(wdp_datagram);
167 
168  msg->wdp_datagram.source_address = udp_get_ip(cliaddr);
169  msg->wdp_datagram.source_port = udp_get_port(cliaddr);
170  msg->wdp_datagram.destination_address = udp_get_ip(conn->addr);
171  msg->wdp_datagram.destination_port = udp_get_port(conn->addr);
172  msg->wdp_datagram.user_data = datagram;
173 
176  }
177 
178  octstr_destroy(cliaddr);
179  octstr_destroy(ip);
180  }
183 }
void error(int err, const char *fmt,...)
Definition: log.c:612
Counter * incoming_wdp_counter
Definition: bearerbox.c:94
void gwlist_produce(List *list, void *item)
Definition: list.c:411
int udp_get_port(Octstr *addr)
Definition: socket.c:547
List * incoming_wdp
Definition: bearerbox.c:87
#define msg_create(type)
Definition: msg.h:136
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
unsigned long counter_increase(Counter *counter)
Definition: counter.c:123
int is_allowed_ip(Octstr *allow_ip, Octstr *deny_ip, Octstr *ip)
Definition: utils.c:815
Definition: bb_udp.c:100
Definition: msg.h:79
void gwlist_remove_producer(List *list)
Definition: list.c:401
static Octstr * deny_ip
Definition: bb_udp.c:112
void warning(int err, const char *fmt,...)
Definition: log.c:624
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
Octstr * addr
Definition: bb_udp.c:102
List * flow_threads
Definition: bearerbox.c:116
static Octstr * allow_ip
Definition: bb_udp.c:111
Definition: octstr.c:118
void * gwlist_consume(List *list)
Definition: list.c:427
int read_available(int fd, long wait_usec)
Definition: socket.c:406
void debug(const char *place, int err, const char *fmt,...)
Definition: log.c:690
volatile sig_atomic_t bb_status
Definition: bearerbox.c:132
void gwthread_wakeup(long thread)
List * isolated
Definition: bearerbox.c:127
#define MAIN_THREAD_ID
Definition: gwthread.h:77
void gwlist_add_producer(List *list)
Definition: list.c:383
int fd
Definition: bb_udp.c:101
static XMLRPCDocument * msg
Definition: test_xmlrpc.c:86
int udp_recvfrom(int s, Octstr **datagram, Octstr **addr)
Definition: socket.c:582
Octstr * udp_get_ip(Octstr *addr)
Definition: socket.c:557
static void udp_sender ( void *  arg)
static

Definition at line 205 of file bb_udp.c.

References BB_DEAD, bb_status, counter_increase(), debug(), _udpc::fd, gwlist_add_producer(), gwlist_consume(), gwlist_remove_producer(), gwthread_join(), msg, msg_destroy(), _udpc::outgoing_list, _udpc::receiver, send_udp(), and udpc_destroy().

Referenced by add_service().

206 {
207  Msg *msg;
208  Udpc *conn = arg;
209 
211  while(bb_status != BB_DEAD) {
212 
213  gwlist_consume(suspended); /* block here if suspended */
214 
215  if ((msg = gwlist_consume(conn->outgoing_list)) == NULL)
216  break;
217 
218  debug("bb.udp", 0, "udp: sending message");
219 
220  if (send_udp(conn->fd, msg) == -1)
221  /* ok, we failed... tough
222  * XXX log the message or something like that... but this
223  * is not as fatal as it is with SMS-messages...
224  */ {
225  msg_destroy(msg);
226  continue;
227  }
229  msg_destroy(msg);
230  }
231  gwthread_join(conn->receiver);
232 
233  udpc_destroy(conn);
235 }
static int send_udp(int fd, Msg *msg)
Definition: bb_udp.c:190
void gwthread_join(long thread)
static void udpc_destroy(Udpc *udpc)
Definition: bb_udp.c:277
unsigned long counter_increase(Counter *counter)
Definition: counter.c:123
Counter * outgoing_wdp_counter
Definition: bearerbox.c:95
Definition: bb_udp.c:100
Definition: msg.h:79
void gwlist_remove_producer(List *list)
Definition: list.c:401
List * outgoing_list
Definition: bb_udp.c:103
void msg_destroy(Msg *msg)
Definition: msg.c:132
List * flow_threads
Definition: bearerbox.c:116
long receiver
Definition: bb_udp.c:104
void * gwlist_consume(List *list)
Definition: list.c:427
void debug(const char *place, int err, const char *fmt,...)
Definition: log.c:690
volatile sig_atomic_t bb_status
Definition: bearerbox.c:132
List * suspended
Definition: bearerbox.c:122
void gwlist_add_producer(List *list)
Definition: list.c:383
int fd
Definition: bb_udp.c:101
static XMLRPCDocument * msg
Definition: test_xmlrpc.c:86
int udp_shutdown ( void  )

Definition at line 424 of file bb_udp.c.

References debug(), gwlist_remove_producer(), and udp_running.

Referenced by bb_shutdown().

425 {
426  if (!udp_running) return -1;
427 
428  debug("bb.thread", 0, "udp_shutdown: Starting avalanche");
430  return 0;
431 }
List * incoming_wdp
Definition: bearerbox.c:87
void gwlist_remove_producer(List *list)
Definition: list.c:401
void debug(const char *place, int err, const char *fmt,...)
Definition: log.c:690
static volatile sig_atomic_t udp_running
Definition: bb_udp.c:96
int udp_start ( Cfg cfg)

Definition at line 323 of file bb_udp.c.

References add_service(), cfg_get, cfg_get_single_group(), debug(), error(), gwlist_add_producer(), gwlist_create, gwlist_destroy(), gwlist_extract_first(), gwlist_len(), info(), octstr_destroy(), octstr_get_cstr, octstr_imm(), octstr_split(), and udp_running.

Referenced by start_udp().

324 {
325  CfgGroup *grp;
326  Octstr *iface;
327  List *ifs;
328  int allow_wtls;
329 
330  if (udp_running) return -1;
331 
332  debug("bb.udp", 0, "starting UDP sender/receiver module");
333 
334  grp = cfg_get_single_group(cfg, octstr_imm("core"));
335  iface = cfg_get(grp, octstr_imm("wdp-interface-name"));
336  if (iface == NULL) {
337  error(0, "Missing wdp-interface-name variable, cannot start UDP");
338  return -1;
339  }
340 
341  allow_ip = cfg_get(grp, octstr_imm("udp-allow-ip"));
342  deny_ip = cfg_get(grp, octstr_imm("udp-deny-ip"));
343 
344  /* we'll activate WTLS as soon as we have a 'wtls' config group */
345  grp = cfg_get_single_group(cfg, octstr_imm("wtls"));
346  allow_wtls = grp != NULL ? 1 : 0;
347 
348  udpc_list = gwlist_create(); /* have a list of running systems */
349 
350  ifs = octstr_split(iface, octstr_imm(";"));
351  octstr_destroy(iface);
352  while (gwlist_len(ifs) > 0) {
353  iface = gwlist_extract_first(ifs);
354  info(0, "Adding interface %s", octstr_get_cstr(iface));
355  add_service(9200, octstr_get_cstr(iface)); /* wsp */
356  add_service(9201, octstr_get_cstr(iface)); /* wsp/wtp */
357 
358 #ifdef HAVE_WTLS_OPENSSL
359  if (allow_wtls) {
360  add_service(9202, octstr_get_cstr(iface)); /* wsp/wtls */
361  add_service(9203, octstr_get_cstr(iface)); /* wsp/wtp/wtls */
362  }
363 #else
364  if (allow_wtls)
365  error(0, "These is a 'wtls' group in configuration, but no WTLS support compiled in!");
366 #endif
367  /* add_service(9204, octstr_get_cstr(interface_name)); * vcard */
368  /* add_service(9205, octstr_get_cstr(interface_name)); * vcal */
369  /* add_service(9206, octstr_get_cstr(interface_name)); * vcard/wtls */
370  /* add_service(9207, octstr_get_cstr(interface_name)); * vcal/wtls */
371  octstr_destroy(iface);
372  }
373  gwlist_destroy(ifs, NULL);
374 
376  udp_running = 1;
377  return 0;
378 }
void error(int err, const char *fmt,...)
Definition: log.c:612
void info(int err, const char *fmt,...)
Definition: log.c:636
long gwlist_len(List *list)
Definition: list.c:166
List * incoming_wdp
Definition: bearerbox.c:87
#define cfg_get(grp, varname)
Definition: cfg.h:86
static List * udpc_list
Definition: bb_udp.c:97
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
Octstr * octstr_imm(const char *cstr)
Definition: octstr.c:281
void * gwlist_extract_first(List *list)
Definition: list.c:305
static Octstr * deny_ip
Definition: bb_udp.c:112
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
static int add_service(int port, char *interface_name)
Definition: bb_udp.c:292
static Octstr * allow_ip
Definition: bb_udp.c:111
Definition: octstr.c:118
void debug(const char *place, int err, const char *fmt,...)
Definition: log.c:690
Definition: cfg.c:73
static volatile sig_atomic_t udp_running
Definition: bb_udp.c:96
#define gwlist_create()
Definition: list.h:136
CfgGroup * cfg_get_single_group(Cfg *cfg, Octstr *name)
Definition: cfg.c:636
void gwlist_add_producer(List *list)
Definition: list.c:383
List * octstr_split(const Octstr *os, const Octstr *sep)
Definition: octstr.c:1638
Definition: list.c:102
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145
static Udpc* udpc_create ( int  port,
char *  interface_name 
)
static

Definition at line 242 of file bb_udp.c.

References _udpc::addr, debug(), error(), _udpc::fd, gwlist_create, octstr_create, octstr_destroy(), octstr_get_cstr, _udpc::outgoing_list, udp_bind(), udp_create_address(), udp_get_ip(), and udp_get_port().

Referenced by add_service().

243 {
244  Udpc *udpc;
245  Octstr *os;
246  int fl;
247 
248  udpc = gw_malloc(sizeof(Udpc));
249  udpc->fd = udp_bind(port, interface_name);
250 
252  udpc->addr = udp_create_address(os, port);
253  octstr_destroy(os);
254  if (udpc->addr == NULL) {
255  error(0, "updc_create: could not resolve interface <%s>",
257  close(udpc->fd);
258  gw_free(udpc);
259  return NULL;
260  }
261 
262  fl = fcntl(udpc->fd, F_GETFL);
263  fcntl(udpc->fd, F_SETFL, fl | O_NONBLOCK);
264 
265  os = udp_get_ip(udpc->addr);
266  debug("bb.udp", 0, "udpc_create: Bound to UDP <%s:%d>",
267  octstr_get_cstr(os), udp_get_port(udpc->addr));
268 
269  octstr_destroy(os);
270 
271  udpc->outgoing_list = gwlist_create();
272 
273  return udpc;
274 }
void error(int err, const char *fmt,...)
Definition: log.c:612
Definition: http.c:1998
int udp_get_port(Octstr *addr)
Definition: socket.c:547
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
Definition: bb_udp.c:100
int udp_bind(int port, const char *source_addr)
Definition: socket.c:478
List * outgoing_list
Definition: bb_udp.c:103
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
#define octstr_create(cstr)
Definition: octstr.h:125
Octstr * addr
Definition: bb_udp.c:102
Definition: octstr.c:118
void debug(const char *place, int err, const char *fmt,...)
Definition: log.c:690
#define gwlist_create()
Definition: list.h:136
static Octstr * interface_name
Definition: wapproxy.c:111
int fd
Definition: bb_udp.c:101
Octstr * udp_create_address(Octstr *host_or_ip, int port)
Definition: socket.c:517
Octstr * udp_get_ip(Octstr *addr)
Definition: socket.c:557
static void udpc_destroy ( Udpc udpc)
static

Definition at line 277 of file bb_udp.c.

References _udpc::addr, _udpc::fd, gw_assert(), gwlist_destroy(), gwlist_len(), octstr_destroy(), and _udpc::outgoing_list.

Referenced by add_service(), and udp_sender().

278 {
279  if (udpc == NULL)
280  return;
281 
282  if (udpc->fd >= 0)
283  close(udpc->fd);
284  octstr_destroy(udpc->addr);
285  gw_assert(gwlist_len(udpc->outgoing_list) == 0);
286  gwlist_destroy(udpc->outgoing_list, NULL);
287 
288  gw_free(udpc);
289 }
long gwlist_len(List *list)
Definition: list.c:166
List * outgoing_list
Definition: bb_udp.c:103
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
Octstr * addr
Definition: bb_udp.c:102
gw_assert(wtls_machine->packet_to_send!=NULL)
int fd
Definition: bb_udp.c:101
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145

Variable Documentation

Octstr* allow_ip
static
Octstr* deny_ip
static

Definition at line 112 of file bb_udp.c.

Referenced by authorise_username(), smsc_cgw_create(), smsc_emi2_create(), and smsc_fake_create().

List* flow_threads

Definition at line 116 of file bearerbox.c.

List* incoming_wdp

Definition at line 87 of file bearerbox.c.

Counter* incoming_wdp_counter

Definition at line 94 of file bearerbox.c.

List* isolated

Definition at line 127 of file bearerbox.c.

Counter* outgoing_wdp_counter

Definition at line 95 of file bearerbox.c.

List* suspended

Definition at line 122 of file bearerbox.c.

volatile sig_atomic_t udp_running
static

Definition at line 96 of file bb_udp.c.

Referenced by udp_addwdp(), udp_die(), udp_outgoing_queue(), udp_shutdown(), and udp_start().

List* udpc_list
static

Definition at line 97 of file bb_udp.c.

See file LICENSE for details about the license agreement for using, modifying, copying or deriving work from this software.