]>
Commit | Line | Data |
---|---|---|
58ef912c MM |
1 | /* |
2 | * BIRD Socket Interface | |
3 | * | |
38a608c5 | 4 | * (c) 1998--2004 Martin Mares <mj@ucw.cz> |
58ef912c MM |
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 | ||
a2ea1bac OZ |
12 | #include <errno.h> |
13 | ||
1feea03e | 14 | #include "lib/resource.h" |
58ef912c | 15 | |
480effed MM |
16 | typedef struct birdsock { |
17 | resource r; | |
38a608c5 | 18 | pool *pool; /* Pool where incoming connections should be allocated (for SK_xxx_PASSIVE) */ |
480effed MM |
19 | 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) */ | |
ef4a50be OZ |
23 | int tos; /* TOS / traffic class, -1 = default */ |
24 | int priority; /* Local socket priority, -1 = default */ | |
480effed | 25 | int ttl; /* Time To Live, -1 = default */ |
789772ed | 26 | u32 flags; |
d804db0d | 27 | struct iface *iface; /* Interface; specify this for broad/multicast sockets */ |
480effed MM |
28 | |
29 | byte *rbuf, *rpos; /* NULL=allocate automatically */ | |
30 | unsigned rbsize; | |
d804db0d | 31 | int (*rx_hook)(struct birdsock *, int size); /* NULL=receiving turned off, returns 1 to clear rx buffer */ |
480effed MM |
32 | |
33 | byte *tbuf, *tpos; /* NULL=allocate automatically */ | |
34 | byte *ttx; /* Internal */ | |
35 | unsigned tbsize; | |
36 | void (*tx_hook)(struct birdsock *); | |
37 | ||
d804db0d | 38 | void (*err_hook)(struct birdsock *, int); /* errno or zero if EOF */ |
480effed | 39 | |
353729f5 OZ |
40 | /* 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 */ | |
d804db0d MM |
45 | |
46 | int fd; /* System-dependent data */ | |
47 | node n; | |
38a608c5 | 48 | void *rbuf_alloc, *tbuf_alloc; |
d51aa281 | 49 | char *password; /* Password for MD5 authentication */ |
d804db0d MM |
50 | } sock; |
51 | ||
c4b76d7b OZ |
52 | sock *sock_new(pool *); /* Allocate new socket */ |
53 | #define sk_new(X) sock_new(X) /* Wrapper to avoid name collision with OpenSSL */ | |
54 | ||
d804db0d MM |
55 | int sk_open(sock *); /* Open socket */ |
56 | int sk_send(sock *, unsigned len); /* Send data, <0=err, >0=ok, 0=sleep */ | |
57 | int sk_send_to(sock *, unsigned len, ip_addr to, unsigned port); /* sk_send to given destination */ | |
e7ef86a5 | 58 | void sk_reallocate(sock *); /* Free and allocate tbuf & rbuf */ |
d804db0d | 59 | void sk_dump_all(void); |
b1b19433 OZ |
60 | int sk_set_ttl(sock *s, int ttl); /* Set transmit TTL for given socket */ |
61 | int sk_set_min_ttl(sock *s, int ttl); /* Set minimal accepted TTL for given socket */ | |
f9c799a0 OZ |
62 | |
63 | /* Add or remove security associations for given passive socket */ | |
eb1451a3 | 64 | int sk_set_md5_auth(sock *s, ip_addr a, struct iface *ifa, char *passwd); |
ea89da38 | 65 | int sk_rx_ready(sock *s); |
f9c799a0 OZ |
66 | |
67 | /* Prepare UDP or IP socket to multicasting. s->iface and s->ttl must be set */ | |
68 | int sk_setup_multicast(sock *s); | |
69 | int sk_join_group(sock *s, ip_addr maddr); | |
70 | int sk_leave_group(sock *s, ip_addr maddr); | |
71 | ||
4ac7c834 OZ |
72 | #ifdef IPV6 |
73 | int sk_set_ipv6_checksum(sock *s, int offset); | |
93e868c7 | 74 | int sk_set_icmp_filter(sock *s, int p1, int p2); |
4ac7c834 OZ |
75 | #endif |
76 | ||
e81b440f OZ |
77 | int sk_set_broadcast(sock *s, int enable); |
78 | ||
139ca21d MM |
79 | static inline int |
80 | sk_send_buffer_empty(sock *sk) | |
81 | { | |
82 | return sk->tbuf == sk->tpos; | |
83 | } | |
84 | ||
ef4a50be | 85 | extern int sk_priority_control; /* Suggested priority for control traffic, should be sysdep define */ |
789772ed OZ |
86 | |
87 | /* Socket flags */ | |
88 | ||
353729f5 OZ |
89 | #define SKF_V6ONLY 1 /* Use IPV6_V6ONLY socket option */ |
90 | #define SKF_LADDR_RX 2 /* Report local address for RX packets */ | |
91 | #define SKF_LADDR_TX 4 /* Allow to specify local address for TX packets */ | |
70e212f9 | 92 | #define SKF_TTL_RX 8 /* Report TTL / Hop Limit for RX packets */ |
789772ed OZ |
93 | |
94 | ||
480effed | 95 | /* |
d804db0d | 96 | * Socket types SA SP DA DP IF TTL SendTo (?=may, -=must not, *=must) |
480effed MM |
97 | */ |
98 | ||
d804db0d MM |
99 | #define SK_TCP_PASSIVE 0 /* ? * - - - ? - */ |
100 | #define SK_TCP_ACTIVE 1 /* ? ? * * - ? - */ | |
101 | #define SK_TCP 2 | |
0741e687 OZ |
102 | #define SK_UDP 3 /* ? ? ? ? ? ? ? */ |
103 | #define SK_IP 5 /* ? - ? * ? ? ? */ | |
b4b3b39e | 104 | #define SK_MAGIC 7 /* Internal use by sysdep code */ |
b93abffa MM |
105 | #define SK_UNIX_PASSIVE 8 |
106 | #define SK_UNIX 9 | |
58ef912c | 107 | |
5a99ade4 | 108 | /* |
0741e687 OZ |
109 | * For SK_UDP or SK_IP sockets setting DA/DP allows to use sk_send(), |
110 | * otherwise sk_send_to() must be used. | |
111 | * | |
112 | * For SK_IP sockets setting DP specifies protocol number, which is used | |
113 | * for both receiving and sending. | |
114 | * | |
115 | * For multicast on SK_UDP or SK_IP sockets set IF and TTL, | |
116 | * call sk_setup_multicast() to enable multicast on that socket, | |
117 | * and then use sk_join_group() and sk_leave_group() to manage | |
118 | * a set of received multicast groups. | |
5a99ade4 MM |
119 | */ |
120 | ||
58ef912c | 121 | #endif |