summaryrefslogtreecommitdiffstats
path: root/nest/iface.h
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1998-06-01 23:41:11 +0200
committerMartin Mares <mj@ucw.cz>1998-06-01 23:41:11 +0200
commit4cc78c5082344f0d237a5cdfb05e53dfd04ffd8b (patch)
treedf81a32f522ff6fe83917ab977ade0510948285f /nest/iface.h
parent0fe3b28b68f10a32f3fe43e8221559a72be5ca28 (diff)
downloadbird-4cc78c5082344f0d237a5cdfb05e53dfd04ffd8b.tar
bird-4cc78c5082344f0d237a5cdfb05e53dfd04ffd8b.zip
- Rewrote whole interface logic. Removed support for multiple addresses per
interface since it makes much trouble everywhere. Instead, we understand secondary addresses as subinterfaces. - In case interface addresses or basic flags change, we simply convert it to a down/up sequence. - Implemented the universal neighbour cache. (Just forget what did previous includes say of neighbour caching, this one is brand new.)
Diffstat (limited to 'nest/iface.h')
-rw-r--r--nest/iface.h57
1 files changed, 42 insertions, 15 deletions
diff --git a/nest/iface.h b/nest/iface.h
index 4df9873..c359449 100644
--- a/nest/iface.h
+++ b/nest/iface.h
@@ -18,8 +18,13 @@ struct iface {
char name[16];
unsigned flags;
unsigned mtu;
- struct ifa *ifa; /* First address is primary */
unsigned index; /* OS-dependent interface index */
+ 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 */
+ struct neighbor *neigh; /* List of neighbors on this interface */
};
#define IF_UP 1
@@ -33,25 +38,12 @@ struct iface {
#define IF_IGNORE 256
#define IF_UPDATED 0x1000 /* Touched in last scan */
-/* Interface address */
-
-struct ifa {
- struct ifa *next;
- 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 */
- struct neighbor *neigh; /* List of neighbors on this interface */
-};
-
/* Interface change events */
#define IF_CHANGE_UP 1
#define IF_CHANGE_DOWN 2
-#define IF_CHANGE_FLAGS 4
+#define IF_CHANGE_FLAGS 4 /* Can be converted to down/up internally */
#define IF_CHANGE_MTU 8
-#define IF_CHANGE_ADDR 16
void if_init(void);
void if_dump(struct iface *);
@@ -59,4 +51,39 @@ void if_dump_all(void);
void if_update(struct iface *);
void if_end_update(void);
+/*
+ * 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 address 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);
+
#endif