Statistics
| Branch: | Revision:

iof-bird / bird-2.0.1 / lib / socket.h @ 6b3f1a54

History | View | Annotate | Download (6.97 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
#ifdef HAVE_LIBSSH
16
#define LIBSSH_LEGACY_0_4
17
#include <libssh/libssh.h>
18
#endif
19

    
20
#ifdef HAVE_LIBSSH
21
struct ssh_sock {
22
    const char *username;                /* (Required) SSH user name */
23
    const char *server_hostkey_path;        /* (Optional) Filepath to the SSH public key of remote side, can be knownhost file */
24
    const char *client_privkey_path;        /* (Optional) Filepath to the SSH private key of BIRD */
25
    const char *subsystem;                /* (Optional) Name of SSH subsytem */
26
    ssh_session session;                /* Internal */
27
    ssh_channel channel;                /* Internal */
28
    int state;                                /* Internal */
29
#define SK_SSH_CONNECT                0        /* Start state */
30
#define SK_SSH_SERVER_KNOWN        1        /* Internal */
31
#define SK_SSH_USERAUTH                2        /* Internal */
32
#define SK_SSH_CHANNEL                3        /* Internal */
33
#define SK_SSH_SESSION                4        /* Internal */
34
#define SK_SSH_SUBSYSTEM         5        /* Internal */
35
#define SK_SSH_ESTABLISHED        6        /* Final state */
36
};
37
#endif
38

    
39
typedef struct birdsock {
40
  resource r;
41
  pool *pool;                                /* Pool where incoming connections should be allocated (for SK_xxx_PASSIVE) */
42
  int type;                                /* Socket type */
43
  int subtype;                                /* Socket subtype */
44
  void *data;                                /* User data */
45
  ip_addr saddr, daddr;                        /* IPA_NONE = unspecified */
46
  const char *host;                        /* Alternative to daddr, NULL = unspecified */
47
  uint sport, dport;                        /* 0 = unspecified (for IP: protocol type) */
48
  int tos;                                /* TOS / traffic class, -1 = default */
49
  int priority;                                /* Local socket priority, -1 = default */
50
  int ttl;                                /* Time To Live, -1 = default */
51
  u32 flags;
52
  struct iface *iface;                        /* Interface; specify this for broad/multicast sockets */
53
  struct iface *vrf;                        /* Related VRF instance, NULL if global */
54

    
55
  byte *rbuf, *rpos;                        /* NULL=allocate automatically */
56
  uint fast_rx;                                /* RX has higher priority in event loop */
57
  uint rbsize;
58
  int (*rx_hook)(struct birdsock *, uint size); /* NULL=receiving turned off, returns 1 to clear rx buffer */
59

    
60
  byte *tbuf, *tpos;                        /* NULL=allocate automatically */
61
  byte *ttx;                                /* Internal */
62
  uint tbsize;
63
  void (*tx_hook)(struct birdsock *);
64

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

    
67
  /* Information about received datagrams (UDP, RAW), valid in rx_hook */
68
  ip_addr faddr, laddr;                        /* src (From) and dst (Local) address of the datagram */
69
  uint fport;                                /* src port of the datagram */
70
  uint lifindex;                        /* local interface that received the datagram */
71
  /* laddr and lifindex are valid only if SKF_LADDR_RX flag is set to request it */
72

    
73
  int af;                                /* System-dependend adress family (e.g. AF_INET) */
74
  int fd;                                /* System-dependent data */
75
  int index;                                /* Index in poll buffer */
76
  int rcv_ttl;                                /* TTL of last received datagram */
77
  node n;
78
  void *rbuf_alloc, *tbuf_alloc;
79
  char *password;                        /* Password for MD5 authentication */
80
  const char *err;                        /* Error message */
81
  struct ssh_sock *ssh;                        /* Used in SK_SSH */
82
} sock;
83

    
84
sock *sock_new(pool *);                        /* Allocate new socket */
85
#define sk_new(X) sock_new(X)                /* Wrapper to avoid name collision with OpenSSL */
86

    
87
int sk_open(sock *);                        /* Open socket */
88
int sk_rx_ready(sock *s);
89
int sk_send(sock *, uint len);                /* Send data, <0=err, >0=ok, 0=sleep */
90
int sk_send_to(sock *, uint len, ip_addr to, uint port); /* sk_send to given destination */
91
void sk_reallocate(sock *);                /* Free and allocate tbuf & rbuf */
92
void sk_set_rbsize(sock *s, uint val);        /* Resize RX buffer */
93
void sk_set_tbsize(sock *s, uint val);        /* Resize TX buffer, keeping content */
94
void sk_set_tbuf(sock *s, void *tbuf);        /* Switch TX buffer, NULL-> return to internal */
95
void sk_dump_all(void);
96

    
97
int sk_is_ipv4(sock *s);                /* True if socket is IPv4 */
98
int sk_is_ipv6(sock *s);                /* True if socket is IPv6 */
99

    
100
static inline int sk_send_buffer_empty(sock *sk)
101
{ return sk->tbuf == sk->tpos; }
102

    
103
int sk_setup_multicast(sock *s);        /* Prepare UDP or IP socket for multicasting */
104
int sk_join_group(sock *s, ip_addr maddr);        /* Join multicast group on sk iface */
105
int sk_leave_group(sock *s, ip_addr maddr);        /* Leave multicast group on sk iface */
106
int sk_setup_broadcast(sock *s);
107
int sk_set_ttl(sock *s, int ttl);        /* Set transmit TTL for given socket */
108
int sk_set_min_ttl(sock *s, int ttl);        /* Set minimal accepted TTL for given socket */
109
int sk_set_md5_auth(sock *s, ip_addr local, ip_addr remote, struct iface *ifa, char *passwd, int setkey);
110
int sk_set_ipv6_checksum(sock *s, int offset);
111
int sk_set_icmp6_filter(sock *s, int p1, int p2);
112
void sk_log_error(sock *s, const char *p);
113

    
114
byte * sk_rx_buffer(sock *s, int *len);        /* Temporary */
115

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

    
118

    
119
/* Socket flags */
120

    
121
#define SKF_V6ONLY        0x02        /* Use IPV6_V6ONLY socket option */
122
#define SKF_LADDR_RX        0x04        /* Report local address for RX packets */
123
#define SKF_TTL_RX        0x08        /* Report TTL / Hop Limit for RX packets */
124
#define SKF_BIND        0x10        /* Bind datagram socket to given source address */
125
#define SKF_HIGH_PORT        0x20        /* Choose port from high range if possible */
126

    
127
#define SKF_THREAD        0x100        /* Socked used in thread, Do not add to main loop */
128
#define SKF_TRUNCATED        0x200        /* Received packet was truncated, set by IO layer */
129
#define SKF_HDRINCL        0x400        /* Used internally */
130
#define SKF_PKTINFO        0x800        /* Used internally */
131

    
132
/*
133
 *        Socket types                     SA SP DA DP IF  TTL SendTo        (?=may, -=must not, *=must)
134
 */
135

    
136
#define SK_TCP_PASSIVE        0           /* ?  *  -  -  -  ?   -        */
137
#define SK_TCP_ACTIVE        1          /* ?  ?  *  *  -  ?   -        */
138
#define SK_TCP                2
139
#define SK_UDP                3          /* ?  ?  ?  ?  ?  ?   ?        */
140
#define SK_IP                5          /* ?  -  ?  *  ?  ?   ?        */
141
#define SK_MAGIC        7           /* Internal use by sysdep code */
142
#define SK_UNIX_PASSIVE        8
143
#define SK_UNIX                9
144
#define SK_SSH_ACTIVE        10         /* -  -  *  *  -  ?   -        DA = host */
145
#define SK_SSH                11
146

    
147
/*
148
 *        Socket subtypes
149
 */
150

    
151
#define SK_IPV4                1
152
#define SK_IPV6                2
153

    
154
/*
155
 * For TCP/IP sockets, Address family (IPv4 or IPv6) can be specified either
156
 * explicitly (SK_IPV4 or SK_IPV6) or implicitly (based on saddr, daddr). But
157
 * these specifications must be consistent.
158
 *
159
 * For SK_UDP or SK_IP sockets setting DA/DP allows to use sk_send(), otherwise
160
 * sk_send_to() must be used.
161
 *
162
 * For SK_IP sockets setting DP specifies protocol number, which is used for
163
 * both receiving and sending.
164
 *
165
 * For multicast on SK_UDP or SK_IP sockets set IF and TTL, call
166
 * sk_setup_multicast() to enable multicast on that socket, and then use
167
 * sk_join_group() and sk_leave_group() to manage a set of received multicast
168
 * groups.
169
 *
170
 * For datagram (SK_UDP, SK_IP) sockets, there are two ways to handle source
171
 * address. The socket could be bound to it using bind() syscall, but that also
172
 * forbids the reception of multicast packets, or the address could be set on
173
 * per-packet basis using platform dependent options (but these are not
174
 * available in some corner cases). The first way is used when SKF_BIND is
175
 * specified, the second way is used otherwise.
176
 */
177

    
178
#endif