]>
Commit | Line | Data |
---|---|---|
58ef912c MM |
1 | /* |
2 | * BIRD Internet Routing Daemon -- Network Interfaces | |
3 | * | |
cf318e3c | 4 | * (c) 1998--2000 Martin Mares <mj@ucw.cz> |
58ef912c MM |
5 | * |
6 | * Can be freely distributed and used under the terms of the GNU GPL. | |
7 | */ | |
8 | ||
9 | #ifndef _BIRD_IFACE_H_ | |
10 | #define _BIRD_IFACE_H_ | |
11 | ||
1feea03e | 12 | #include "lib/lists.h" |
c40e05a0 | 13 | |
8a48ecb8 MM |
14 | extern list iface_list; |
15 | ||
47b79306 | 16 | struct proto; |
85053fce | 17 | struct pool; |
47b79306 | 18 | |
9a158361 MM |
19 | struct ifa { /* Interface address */ |
20 | node n; | |
21 | struct iface *iface; /* Interface this address belongs to */ | |
22 | ip_addr ip; /* IP address of this host */ | |
23 | ip_addr prefix; /* Network prefix */ | |
24 | unsigned pxlen; /* Prefix length */ | |
25 | ip_addr brd; /* Broadcast address */ | |
26 | ip_addr opposite; /* Opposite end of a point-to-point link */ | |
27 | unsigned scope; /* Interface address scope */ | |
28 | unsigned flags; /* Analogous to iface->flags */ | |
29 | }; | |
30 | ||
c40e05a0 MM |
31 | struct iface { |
32 | node n; | |
8a48ecb8 | 33 | char name[16]; |
c40e05a0 | 34 | unsigned flags; |
a8b60382 | 35 | unsigned mtu; |
b53499cd | 36 | unsigned index; /* OS-dependent interface index */ |
9a158361 MM |
37 | list addrs; /* Addresses assigned to this interface */ |
38 | struct ifa *addr; /* Primary address */ | |
f5ad9f87 | 39 | list neighbors; /* All neighbors on this interface */ |
c40e05a0 MM |
40 | }; |
41 | ||
f25cb0ef | 42 | #define IF_UP 1 /* IF_ADMIN_UP and IP address known */ |
c40e05a0 | 43 | #define IF_MULTIACCESS 2 |
6a636392 MM |
44 | #define IF_BROADCAST 4 |
45 | #define IF_MULTICAST 8 | |
f25cb0ef | 46 | #define IF_SHUTDOWN 0x10 /* Interface disappeared */ |
6a636392 MM |
47 | #define IF_LOOPBACK 0x20 |
48 | #define IF_IGNORE 0x40 /* Not to be used by routing protocols (loopbacks etc.) */ | |
01427d3f OZ |
49 | #define IF_ADMIN_UP 0x80 /* Administrative up (e.g. IFF_UP in Linux) */ |
50 | #define IF_LINK_UP 0x100 /* Link available (e.g. IFF_LOWER_UP in Linux) */ | |
9a158361 MM |
51 | |
52 | #define IA_PRIMARY 0x10000 /* This address is primary */ | |
53 | #define IA_SECONDARY 0x20000 /* This address has been reported as secondary by the kernel */ | |
52a43ae3 OZ |
54 | #define IA_PEER 0x40000 /* A peer/ptp address */ |
55 | #define IA_HOST 0x80000 /* A host/loopback address */ | |
9a158361 MM |
56 | #define IA_FLAGS 0xff0000 |
57 | ||
52a43ae3 OZ |
58 | /* |
59 | * There are three kinds of addresses in BIRD: | |
60 | * - Standard (prefix-based) addresses, these may define ifa.opposite (for /30 or /31). | |
61 | * - Peer/ptp addresses, without common prefix for ifa.ip and ifa.opposite. | |
62 | * ifa.opposite is defined and ifa.prefix/pxlen == ifa.opposite/32 (for simplicity). | |
63 | * - Host addresses, with ifa.prefix/pxlen == ifa.ip/32 (or /128). | |
64 | * May be considered a special case of standard addresses. | |
65 | * | |
489c308a OZ |
66 | * Peer addresses (AFAIK) do not exist in IPv6. Linux also supports generalized peer |
67 | * addresses (with pxlen < 32 and ifa.ip outside prefix), we do not support that. | |
52a43ae3 OZ |
68 | */ |
69 | ||
70 | ||
9a158361 MM |
71 | #define IF_JUST_CREATED 0x10000000 /* Send creation event as soon as possible */ |
72 | #define IF_TMP_DOWN 0x20000000 /* Temporary shutdown due to interface reconfiguration */ | |
bcbd8cc3 | 73 | #define IF_UPDATED 0x40000000 /* Touched in last scan */ |
c40e05a0 | 74 | |
8a48ecb8 MM |
75 | /* Interface change events */ |
76 | ||
77 | #define IF_CHANGE_UP 1 | |
78 | #define IF_CHANGE_DOWN 2 | |
9a158361 MM |
79 | #define IF_CHANGE_MTU 4 |
80 | #define IF_CHANGE_CREATE 8 /* Seen this interface for the first time */ | |
f25cb0ef | 81 | #define IF_CHANGE_LINK 0x10 |
9a158361 | 82 | #define IF_CHANGE_TOO_MUCH 0x40000000 /* Used internally */ |
8a48ecb8 MM |
83 | |
84 | void if_init(void); | |
85 | void if_dump(struct iface *); | |
86 | void if_dump_all(void); | |
9a158361 | 87 | void ifa_dump(struct ifa *); |
ae97b946 MM |
88 | void if_show(void); |
89 | void if_show_summary(void); | |
9a158361 | 90 | struct iface *if_update(struct iface *); |
732a0a25 | 91 | void if_delete(struct iface *old); |
9a158361 MM |
92 | struct ifa *ifa_update(struct ifa *); |
93 | void ifa_delete(struct ifa *); | |
e35ef181 | 94 | void if_start_update(void); |
9a158361 | 95 | void if_end_partial_update(struct iface *); |
53434e44 OZ |
96 | void if_end_update(void); |
97 | void if_flush_ifaces(struct proto *p); | |
47b79306 | 98 | void if_feed_baby(struct proto *); |
e35ef181 | 99 | struct iface *if_find_by_index(unsigned); |
9a158361 | 100 | struct iface *if_find_by_name(char *); |
69a8259c | 101 | struct iface *if_get_by_name(char *); |
874b8685 | 102 | void ifa_recalc_all_primary_addresses(void); |
8a48ecb8 | 103 | |
79b4e12e | 104 | |
cf318e3c | 105 | /* The Neighbor Cache */ |
4cc78c50 MM |
106 | |
107 | typedef struct neighbor { | |
108 | node n; /* Node in global neighbor list */ | |
f5ad9f87 | 109 | node if_n; /* Node in per-interface neighbor list */ |
4cc78c50 | 110 | ip_addr addr; /* Address of the neighbor */ |
2d0b7e24 | 111 | struct ifa *ifa; /* Ifa on related iface */ |
2a900b1b | 112 | struct iface *iface; /* Interface it's connected to */ |
4cc78c50 MM |
113 | struct proto *proto; /* Protocol this belongs to */ |
114 | void *data; /* Protocol-specific data */ | |
5954dcfa | 115 | unsigned aux; /* Protocol-specific data */ |
4cc78c50 | 116 | unsigned flags; |
69a8259c OZ |
117 | int scope; /* Address scope, -1 for unreachable sticky neighbors, |
118 | SCOPE_HOST when it's our own address */ | |
4cc78c50 MM |
119 | } neighbor; |
120 | ||
121 | #define NEF_STICKY 1 | |
ff2857b0 | 122 | #define NEF_ONLINK 2 |
69a8259c | 123 | #define NEF_BIND 4 /* Used internally for neighbors bound to an iface */ |
4cc78c50 | 124 | |
4cc78c50 | 125 | neighbor *neigh_find(struct proto *, ip_addr *, unsigned flags); |
be862406 | 126 | neighbor *neigh_find2(struct proto *p, ip_addr *a, struct iface *ifa, unsigned flags); |
4cc78c50 | 127 | |
200accf3 MM |
128 | static inline int neigh_connected_to(struct proto *p, ip_addr *a, struct iface *i) |
129 | { | |
130 | neighbor *n = neigh_find(p, a, 0); | |
131 | return n && n->iface == i; | |
132 | } | |
133 | ||
4cc78c50 MM |
134 | void neigh_dump(neighbor *); |
135 | void neigh_dump_all(void); | |
783f8b68 | 136 | void neigh_prune(void); |
85053fce MM |
137 | void neigh_if_up(struct iface *); |
138 | void neigh_if_down(struct iface *); | |
fe181e7c | 139 | void neigh_if_link(struct iface *); |
cf7f0645 | 140 | void neigh_ifa_update(struct ifa *); |
85053fce | 141 | void neigh_init(struct pool *); |
4cc78c50 | 142 | |
ed45f2e1 MM |
143 | /* |
144 | * Interface Pattern Lists | |
145 | */ | |
146 | ||
20e94fb8 | 147 | struct iface_patt_node { |
ed45f2e1 | 148 | node n; |
20e94fb8 OZ |
149 | int positive; |
150 | byte *pattern; | |
151 | ip_addr prefix; | |
8edf2361 | 152 | int pxlen; |
20e94fb8 OZ |
153 | }; |
154 | ||
155 | struct iface_patt { | |
156 | node n; | |
157 | list ipn_list; /* A list of struct iface_patt_node */ | |
ed45f2e1 | 158 | |
8edf2361 | 159 | /* Protocol-specific data follow after this structure */ |
ed45f2e1 MM |
160 | }; |
161 | ||
0aad2b92 OZ |
162 | int iface_patt_match(struct iface_patt *ifp, struct iface *i, struct ifa *a); |
163 | struct iface_patt *iface_patt_find(list *l, struct iface *i, struct ifa *a); | |
ed45f2e1 MM |
164 | int iface_patts_equal(list *, list *, int (*)(struct iface_patt *, struct iface_patt *)); |
165 | ||
79b4e12e OZ |
166 | |
167 | u32 if_choose_router_id(struct iface_patt *mask, u32 old_id); | |
168 | ||
58ef912c | 169 | #endif |