summaryrefslogtreecommitdiffstats
path: root/nest/iface.h
blob: 8677be0d8b5c9b92367360a7ae5872f334416adc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
 *	BIRD Internet Routing Daemon -- Network Interfaces
 *
 *	(c) 1998--1999 Martin Mares <mj@ucw.cz>
 *
 *	Can be freely distributed and used under the terms of the GNU GPL.
 */

#ifndef _BIRD_IFACE_H_
#define _BIRD_IFACE_H_

#include "lib/lists.h"

extern list iface_list;

struct proto;

struct iface {
  node n;
  char name[16];
  unsigned flags;
  unsigned mtu;
  unsigned index;			/* OS-dependent interface index */
  ip_addr ip;				/* IP address of this host (0=unset) */
  ip_addr prefix;			/* Network prefix */
  unsigned pxlen;			/* Prefix length */
  ip_addr brd;				/* Broadcast address */
  ip_addr opposite;			/* Opposite end of a point-to-point link */
  struct neighbor *neigh;		/* List of neighbors on this interface */
};

#define IF_UP 1				/* IF_LINK_UP, not IF_IGNORE and IP address known */
#define IF_MULTIACCESS 2
#define IF_UNNUMBERED 4
#define IF_BROADCAST 8
#define IF_MULTICAST 16
#define IF_TUNNEL 32
#define IF_ADMIN_DOWN 64
#define IF_LOOPBACK 128
#define IF_IGNORE 256
#define IF_LINK_UP 512
#define IF_UPDATED 0x40000000		/* Touched in last scan */

/* Interface change events */

#define IF_CHANGE_UP 1
#define IF_CHANGE_DOWN 2
#define IF_CHANGE_FLAGS 4		/* Can be converted to down/up internally */
#define IF_CHANGE_MTU 8
#define IF_CHANGE_CREATE 16		/* Seen this interface for the first time */

void if_init(void);
void if_dump(struct iface *);
void if_dump_all(void);
void if_update(struct iface *);
void if_start_update(void);
void if_end_update(void);
void if_feed_baby(struct proto *);
struct iface *if_find_by_index(unsigned);

/*
 *	Neighbor Cache. We hold (direct neighbor, protocol) pairs we've seen
 *	along with pointer to protocol-specific data.
 *
 *	The primary goal of this cache is to quickly validate all incoming
 *	packets if their have been sent by our neighbors and to notify
 *	protocols about lost neighbors when an interface goes down.
 *
 *	Anyway, it can also contain `sticky' entries for currently unreachable
 *	addresses which cause notification when the address becomes a neighbor.
 */

typedef struct neighbor {
  node n;				/* Node in global neighbor list */
  ip_addr addr;				/* Address of the neighbor */
  struct iface *iface;			/* Interface it's connected to */
  struct neighbor *sibling;		/* Next in per-device chain */
  struct proto *proto;			/* Protocol this belongs to */
  void *data;				/* Protocol-specific data */
  unsigned flags;
} neighbor;

#define NEF_STICKY 1

/*
 * Find neighbor or return NULL if it doesn't exist.
 * If you specify flags == NEF_STICKY, a sticky entry is created if the
 * address is not a neighbor, but NULL can still be returned if the address
 * given is invalid.
 */
neighbor *neigh_find(struct proto *, ip_addr *, unsigned flags);

void neigh_dump(neighbor *);
void neigh_dump_all(void);
void neigh_prune(void);

/*
 *	Interface Pattern Lists
 */

struct iface_patt {
  node n;
  byte *pattern;			/* Interface name pattern */

  /* Protocol-specific data follow, but keep them like this:
     struct rip_iface_patt {
        struct iface_patt i;
	whatever you (need);
     }
   */
};

struct iface_patt *iface_patt_match(list *, struct iface *);
int iface_patts_equal(list *, list *, int (*)(struct iface_patt *, struct iface_patt *));

#endif