Statistics
| Branch: | Revision:

iof-bird-daemon / lib / socket.h @ a2ea1bac

History | View | Annotate | Download (3.25 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 and priority, -1 = default */
24
  int ttl;                                /* Time To Live, -1 = default */
25
  u32 flags;
26
  struct iface *iface;                        /* Interface; specify this for broad/multicast sockets */
27

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

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

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

    
39
  ip_addr faddr;                        /* For packet protocols: source of current packet */
40
  unsigned fport;
41

    
42
  int fd;                                /* System-dependent data */
43
  node n;
44
  void *rbuf_alloc, *tbuf_alloc;
45
  char *password;                                /* Password for MD5 authentication */
46
} sock;
47

    
48
sock *sk_new(pool *);                        /* Allocate new socket */
49
int sk_open(sock *);                        /* Open socket */
50
int sk_send(sock *, unsigned len);        /* Send data, <0=err, >0=ok, 0=sleep */
51
int sk_send_to(sock *, unsigned len, ip_addr to, unsigned port); /* sk_send to given destination */
52
void sk_reallocate(sock *);                /* Free and allocate tbuf & rbuf */
53
void sk_dump_all(void);
54
int sk_set_ttl(sock *s, int ttl);        /* Set TTL for given socket */
55

    
56
/* Add or remove security associations for given passive socket */
57
int sk_set_md5_auth(sock *s, ip_addr a, char *passwd);
58
int sk_rx_ready(sock *s);
59

    
60
/* Prepare UDP or IP socket to multicasting. s->iface and s->ttl must be set */
61
int sk_setup_multicast(sock *s);        
62
int sk_join_group(sock *s, ip_addr maddr);
63
int sk_leave_group(sock *s, ip_addr maddr);
64

    
65
#ifdef IPV6
66
int sk_set_ipv6_checksum(sock *s, int offset);
67
#endif
68

    
69
static inline int
70
sk_send_buffer_empty(sock *sk)
71
{
72
        return sk->tbuf == sk->tpos;
73
}
74

    
75

    
76
/* Socket flags */
77

    
78
#define SKF_V6ONLY        1        /* Use  IPV6_V6ONLY socket option */
79

    
80

    
81
/*
82
 *        Socket types                     SA SP DA DP IF  TTL SendTo        (?=may, -=must not, *=must)
83
 */
84

    
85
#define SK_TCP_PASSIVE        0           /* ?  *  -  -  -  ?   -        */
86
#define SK_TCP_ACTIVE        1          /* ?  ?  *  *  -  ?   -        */
87
#define SK_TCP                2
88
#define SK_UDP                3          /* ?  ?  ?  ?  ?  ?   ?        */
89
#define SK_IP                5          /* ?  -  ?  *  ?  ?   ?        */
90
#define SK_MAGIC        7           /* Internal use by sysdep code */
91
#define SK_UNIX_PASSIVE        8
92
#define SK_UNIX                9
93

    
94
/*
95
 *  For SK_UDP or SK_IP sockets setting DA/DP allows to use sk_send(),
96
 *  otherwise sk_send_to() must be used.
97
 *
98
 *  For SK_IP sockets setting DP specifies protocol number, which is used
99
 *  for both receiving and sending.
100
 *
101
 *  For multicast on SK_UDP or SK_IP sockets set IF and TTL,
102
 *  call sk_setup_multicast() to enable multicast on that socket,
103
 *  and then use sk_join_group() and sk_leave_group() to manage
104
 *  a set of received multicast groups.
105
 */
106

    
107
#endif