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