Statistics
| Branch: | Revision:

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

History | View | Annotate | Download (5.1 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

    
14
#include "lib/resource.h"
15

    
16
typedef struct birdsock {
17
  resource r;
18
  pool *pool;                                /* Pool where incoming connections should be allocated (for SK_xxx_PASSIVE) */
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) */
23
  int tos;                                /* TOS / traffic class, -1 = default */
24
  int priority;                                /* Local socket priority, -1 = default */
25
  int ttl;                                /* Time To Live, -1 = default */
26
  u32 flags;
27
  struct iface *iface;                        /* Interface; specify this for broad/multicast sockets */
28

    
29
  byte *rbuf, *rpos;                        /* NULL=allocate automatically */
30
  unsigned rbsize;
31
  int (*rx_hook)(struct birdsock *, int size); /* NULL=receiving turned off, returns 1 to clear rx buffer */
32

    
33
  byte *tbuf, *tpos;                        /* NULL=allocate automatically */
34
  byte *ttx;                                /* Internal */
35
  unsigned tbsize;
36
  void (*tx_hook)(struct birdsock *);
37

    
38
  void (*err_hook)(struct birdsock *, int); /* errno or zero if EOF */
39

    
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 */
45

    
46
  int fd;                                /* System-dependent data */
47
  int index;                                /* Index in poll buffer */
48
  node n;
49
  void *rbuf_alloc, *tbuf_alloc;
50
  char *password;                                /* Password for MD5 authentication */
51
} sock;
52

    
53
sock *sock_new(pool *);                        /* Allocate new socket */
54
#define sk_new(X) sock_new(X)                /* Wrapper to avoid name collision with OpenSSL */
55

    
56
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
void sk_reallocate(sock *);                /* Free and allocate tbuf & rbuf */
60
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
void sk_dump_all(void);
64
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

    
67
/* Add or remove security associations for given passive socket */
68
int sk_set_md5_auth(sock *s, ip_addr a, struct iface *ifa, char *passwd);
69
int sk_rx_ready(sock *s);
70

    
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
#ifdef IPV6
77
int sk_set_ipv6_checksum(sock *s, int offset);
78
int sk_set_icmp_filter(sock *s, int p1, int p2);
79
#endif
80

    
81
int sk_set_broadcast(sock *s, int enable);
82

    
83
static inline int
84
sk_send_buffer_empty(sock *sk)
85
{
86
        return sk->tbuf == sk->tpos;
87
}
88

    
89
extern int sk_priority_control;        /* Suggested priority for control traffic, should be sysdep define */
90

    
91
/* Socket flags */
92

    
93
#define SKF_V6ONLY        1        /* Use IPV6_V6ONLY socket option */
94
#define SKF_LADDR_RX        2        /* Report local address for RX packets */
95
#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

    
98
#define SKF_THREAD        0x100        /* Socked used in thread, Do not add to main loop */
99
#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

    
103
/*
104
 *        Socket types                     SA SP DA DP IF  TTL SendTo        (?=may, -=must not, *=must)
105
 */
106

    
107
#define SK_TCP_PASSIVE        0           /* ?  *  -  -  -  ?   -        */
108
#define SK_TCP_ACTIVE        1          /* ?  ?  *  *  -  ?   -        */
109
#define SK_TCP                2
110
#define SK_UDP                3          /* ?  ?  ?  ?  ?  ?   ?        */
111
#define SK_IP                5          /* ?  -  ?  *  ?  ?   ?        */
112
#define SK_MAGIC        7           /* Internal use by sysdep code */
113
#define SK_UNIX_PASSIVE        8
114
#define SK_UNIX                9
115

    
116
/*
117
 *  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
 *
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
 */
136

    
137
#endif