Statistics
| Branch: | Revision:

iof-bird-daemon / lib / socket.h @ 48e5f32d

History | View | Annotate | Download (5.1 KB)

1 58ef912c Martin Mares
/*
2
 *        BIRD Socket Interface
3
 *
4 38a608c5 Martin Mares
 *        (c) 1998--2004 Martin Mares <mj@ucw.cz>
5 58ef912c Martin Mares
 *
6
 *        Can be freely distributed and used under the terms of the GNU GPL.
7
 */
8
9
#ifndef _BIRD_SOCKET_H_
10
#define _BIRD_SOCKET_H_
11
12 a2ea1bac Ondrej Zajicek
#include <errno.h>
13
14 1feea03e Martin Mares
#include "lib/resource.h"
15 58ef912c Martin Mares
16 480effed Martin Mares
typedef struct birdsock {
17
  resource r;
18 38a608c5 Martin Mares
  pool *pool;                                /* Pool where incoming connections should be allocated (for SK_xxx_PASSIVE) */
19 480effed Martin Mares
  int type;                                /* Socket type */
20
  void *data;                                /* User data */
21
  ip_addr saddr, daddr;                        /* IPA_NONE = unspecified */
22
  unsigned sport, dport;                /* 0 = unspecified (for IP: protocol type) */
23 ef4a50be Ondrej Zajicek
  int tos;                                /* TOS / traffic class, -1 = default */
24
  int priority;                                /* Local socket priority, -1 = default */
25 480effed Martin Mares
  int ttl;                                /* Time To Live, -1 = default */
26 789772ed Ondrej Zajicek
  u32 flags;
27 d804db0d Martin Mares
  struct iface *iface;                        /* Interface; specify this for broad/multicast sockets */
28 480effed Martin Mares
29
  byte *rbuf, *rpos;                        /* NULL=allocate automatically */
30
  unsigned rbsize;
31 d804db0d Martin Mares
  int (*rx_hook)(struct birdsock *, int size); /* NULL=receiving turned off, returns 1 to clear rx buffer */
32 480effed Martin Mares
33
  byte *tbuf, *tpos;                        /* NULL=allocate automatically */
34
  byte *ttx;                                /* Internal */
35
  unsigned tbsize;
36
  void (*tx_hook)(struct birdsock *);
37
38 d804db0d Martin Mares
  void (*err_hook)(struct birdsock *, int); /* errno or zero if EOF */
39 480effed Martin Mares
40 353729f5 Ondrej Zajicek
  /* Information about received datagrams (UDP, RAW), valid in rx_hook */
41
  ip_addr faddr, laddr;                        /* src (From) and dst (Local) address of the datagram */
42
  unsigned fport;                        /* src port of the datagram */
43
  unsigned lifindex;                        /* local interface that received the datagram */
44
  /* laddr and lifindex are valid only if SKF_LADDR_RX flag is set to request it */
45 d804db0d Martin Mares
46
  int fd;                                /* System-dependent data */
47 bf139664 Ondrej Zajicek
  int index;                                /* Index in poll buffer */
48 d804db0d Martin Mares
  node n;
49 38a608c5 Martin Mares
  void *rbuf_alloc, *tbuf_alloc;
50 d51aa281 Ondrej Zajicek
  char *password;                                /* Password for MD5 authentication */
51 d804db0d Martin Mares
} sock;
52
53 c4b76d7b Ondrej Zajicek
sock *sock_new(pool *);                        /* Allocate new socket */
54
#define sk_new(X) sock_new(X)                /* Wrapper to avoid name collision with OpenSSL */
55
56 d804db0d Martin Mares
int sk_open(sock *);                        /* Open socket */
57
int sk_send(sock *, unsigned len);        /* Send data, <0=err, >0=ok, 0=sleep */
58
int sk_send_to(sock *, unsigned len, ip_addr to, unsigned port); /* sk_send to given destination */
59 e7ef86a5 Ondrej Filip
void sk_reallocate(sock *);                /* Free and allocate tbuf & rbuf */
60 48e5f32d Ondrej Zajicek
void sk_set_rbsize(sock *s, uint val);        /* Resize RX buffer */
61
void sk_set_tbsize(sock *s, uint val);        /* Resize TX buffer, keeping content */
62
void sk_set_tbuf(sock *s, void *tbuf);        /* Switch TX buffer, NULL-> return to internal */
63 d804db0d Martin Mares
void sk_dump_all(void);
64 b1b19433 Ondrej Zajicek
int sk_set_ttl(sock *s, int ttl);        /* Set transmit TTL for given socket */
65
int sk_set_min_ttl(sock *s, int ttl);        /* Set minimal accepted TTL for given socket */
66 f9c799a0 Ondrej Zajicek
67
/* Add or remove security associations for given passive socket */
68 eb1451a3 Ondrej Zajicek
int sk_set_md5_auth(sock *s, ip_addr a, struct iface *ifa, char *passwd);
69 ea89da38 Ondrej Zajicek
int sk_rx_ready(sock *s);
70 f9c799a0 Ondrej Zajicek
71
/* Prepare UDP or IP socket to multicasting. s->iface and s->ttl must be set */
72
int sk_setup_multicast(sock *s);        
73
int sk_join_group(sock *s, ip_addr maddr);
74
int sk_leave_group(sock *s, ip_addr maddr);
75
76 4ac7c834 Ondrej Zajicek
#ifdef IPV6
77
int sk_set_ipv6_checksum(sock *s, int offset);
78 93e868c7 Ondrej Zajicek
int sk_set_icmp_filter(sock *s, int p1, int p2);
79 4ac7c834 Ondrej Zajicek
#endif
80
81 e81b440f Ondrej Zajicek
int sk_set_broadcast(sock *s, int enable);
82
83 139ca21d Martin Mares
static inline int
84
sk_send_buffer_empty(sock *sk)
85
{
86
        return sk->tbuf == sk->tpos;
87
}
88
89 ef4a50be Ondrej Zajicek
extern int sk_priority_control;        /* Suggested priority for control traffic, should be sysdep define */
90 789772ed Ondrej Zajicek
91
/* Socket flags */
92
93 353729f5 Ondrej Zajicek
#define SKF_V6ONLY        1        /* Use IPV6_V6ONLY socket option */
94
#define SKF_LADDR_RX        2        /* Report local address for RX packets */
95 48e5f32d Ondrej Zajicek
#define SKF_TTL_RX        4        /* Report TTL / Hop Limit for RX packets */
96
#define SKF_BIND        8        /* Bind datagram socket to given source address */
97 789772ed Ondrej Zajicek
98 bf139664 Ondrej Zajicek
#define SKF_THREAD        0x100        /* Socked used in thread, Do not add to main loop */
99 48e5f32d Ondrej Zajicek
#define SKF_TRUNCATED        0x200        /* Received packet was truncated, set by IO layer */
100
#define SKF_HDRINCL        0x400        /* Used internally */
101
#define SKF_PKTINFO        0x800        /* Used internally */
102 789772ed Ondrej Zajicek
103 480effed Martin Mares
/*
104 d804db0d Martin Mares
 *        Socket types                     SA SP DA DP IF  TTL SendTo        (?=may, -=must not, *=must)
105 480effed Martin Mares
 */
106
107 d804db0d Martin Mares
#define SK_TCP_PASSIVE        0           /* ?  *  -  -  -  ?   -        */
108
#define SK_TCP_ACTIVE        1          /* ?  ?  *  *  -  ?   -        */
109
#define SK_TCP                2
110 0741e687 Ondrej Zajicek
#define SK_UDP                3          /* ?  ?  ?  ?  ?  ?   ?        */
111
#define SK_IP                5          /* ?  -  ?  *  ?  ?   ?        */
112 b4b3b39e Martin Mares
#define SK_MAGIC        7           /* Internal use by sysdep code */
113 b93abffa Martin Mares
#define SK_UNIX_PASSIVE        8
114
#define SK_UNIX                9
115 58ef912c Martin Mares
116 5a99ade4 Martin Mares
/*
117 0741e687 Ondrej Zajicek
 *  For SK_UDP or SK_IP sockets setting DA/DP allows to use sk_send(),
118
 *  otherwise sk_send_to() must be used.
119
 *
120
 *  For SK_IP sockets setting DP specifies protocol number, which is used
121
 *  for both receiving and sending.
122
 *
123
 *  For multicast on SK_UDP or SK_IP sockets set IF and TTL,
124
 *  call sk_setup_multicast() to enable multicast on that socket,
125
 *  and then use sk_join_group() and sk_leave_group() to manage
126
 *  a set of received multicast groups.
127 48e5f32d Ondrej Zajicek
 *
128
 *  For datagram (SK_UDP, SK_IP) sockets, there are two ways to handle
129
 *  source address. The socket could be bound to it using bind()
130
 *  syscall, but that also forbids the reception of multicast packets,
131
 *  or the address could be set on per-packet basis using platform
132
 *  dependent options (but these are not available in some corner
133
 *  cases). The first way is used when SKF_BIND is specified, the
134
 *  second way is used otherwise.
135 5a99ade4 Martin Mares
 */
136
137 58ef912c Martin Mares
#endif