summaryrefslogtreecommitdiff
path: root/nest/iface.h
blob: bee9caf64446f19b7c8b7a89306258164bf710c1 (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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
 *	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 ifa {				/* Interface address */
  node n;
  struct iface *iface;			/* Interface this address belongs to */
  ip_addr ip;				/* IP address of this host */
  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 */
  unsigned scope;			/* Interface address scope */
  unsigned flags;			/* Analogous to iface->flags */
};

struct iface {
  node n;
  char name[16];
  unsigned flags;
  unsigned mtu;
  unsigned index;			/* OS-dependent interface index */
  list addrs;				/* Addresses assigned to this interface */
  struct ifa *addr;			/* Primary address */
  struct neighbor *neigh;		/* List of neighbors on this interface */
};

#define IF_UP 1				/* IF_LINK_UP and IP address known */
#define IF_MULTIACCESS 2
#define IF_UNNUMBERED 4
#define IF_BROADCAST 8
#define IF_MULTICAST 0x10
#define IF_TUNNEL 0x20			/* FIXME: Remove? */
#define IF_ADMIN_DOWN 0x40
#define IF_LOOPBACK 0x80
#define IF_IGNORE 0x100			/* Not to be used by routing protocols (loopbacks etc.) */
#define IF_LINK_UP 0x200

#define IA_PRIMARY 0x10000		/* This address is primary */
#define IA_SECONDARY 0x20000		/* This address has been reported as secondary by the kernel */
#define IA_FLAGS 0xff0000

#define IF_JUST_CREATED 0x10000000	/* Send creation event as soon as possible */
#define IF_TMP_DOWN 0x20000000		/* Temporary shutdown due to interface reconfiguration */
#define IF_UPDATED 0x40000000		/* Touched in last scan */

/* Interface change events */

#define IF_CHANGE_UP 1
#define IF_CHANGE_DOWN 2
#define IF_CHANGE_MTU 4
#define IF_CHANGE_CREATE 8		/* Seen this interface for the first time */
#define IF_CHANGE_TOO_MUCH 0x40000000	/* Used internally */

void if_init(void);
void if_dump(struct iface *);
void if_dump_all(void);
void ifa_dump(struct ifa *);
void if_show(void);
void if_show_summary(void);
struct iface *if_update(struct iface *);
struct ifa *ifa_update(struct ifa *);
void ifa_delete(struct ifa *);
void if_start_update(void);
void if_end_update(void);
void if_end_partial_update(struct iface *);
void if_feed_baby(struct proto *);
struct iface *if_find_by_index(unsigned);
struct iface *if_find_by_name(char *);

/*
 *	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 */
  ip_addr prefix;			/* Interface prefix */
  int pxlen;

  /* Protocol-specific data follow after this structure */
};

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

#endif