File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird / nest / iface.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Aug 22 12:33:54 2017 UTC (6 years, 10 months ago) by misho
Branches: bird, MAIN
CVS tags: v1_6_3p0, v1_6_3, HEAD
bird 1.6.3

    1: /*
    2:  *	BIRD Internet Routing Daemon -- Network Interfaces
    3:  *
    4:  *	(c) 1998--2000 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_IFACE_H_
   10: #define _BIRD_IFACE_H_
   11: 
   12: #include "lib/lists.h"
   13: 
   14: extern list iface_list;
   15: 
   16: struct proto;
   17: struct pool;
   18: 
   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: 
   31: struct iface {
   32:   node n;
   33:   char name[16];
   34:   unsigned flags;
   35:   unsigned mtu;
   36:   unsigned index;			/* OS-dependent interface index */
   37:   list addrs;				/* Addresses assigned to this interface */
   38:   struct ifa *addr;			/* Primary address */
   39:   list neighbors;			/* All neighbors on this interface */
   40: };
   41: 
   42: #define IF_UP 1				/* IF_ADMIN_UP and IP address known */
   43: #define IF_MULTIACCESS 2
   44: #define IF_BROADCAST 4
   45: #define IF_MULTICAST 8
   46: #define IF_SHUTDOWN 0x10		/* Interface disappeared */
   47: #define IF_LOOPBACK 0x20
   48: #define IF_IGNORE 0x40			/* Not to be used by routing protocols (loopbacks etc.) */
   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) */
   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 */
   54: #define IA_PEER 0x40000			/* A peer/ptp address */
   55: #define IA_HOST 0x80000			/* A host/loopback address */
   56: #define IA_FLAGS 0xff0000
   57: 
   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:  *
   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.
   68:  */
   69: 
   70: 
   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 */
   73: #define IF_UPDATED 0x40000000		/* Touched in last scan */
   74: 
   75: /* Interface change events */
   76: 
   77: #define IF_CHANGE_UP 1
   78: #define IF_CHANGE_DOWN 2
   79: #define IF_CHANGE_MTU 4
   80: #define IF_CHANGE_CREATE 8		/* Seen this interface for the first time */
   81: #define IF_CHANGE_LINK 0x10
   82: #define IF_CHANGE_TOO_MUCH 0x40000000	/* Used internally */
   83: 
   84: void if_init(void);
   85: void if_dump(struct iface *);
   86: void if_dump_all(void);
   87: void ifa_dump(struct ifa *);
   88: void if_show(void);
   89: void if_show_summary(void);
   90: struct iface *if_update(struct iface *);
   91: void if_delete(struct iface *old);
   92: struct ifa *ifa_update(struct ifa *);
   93: void ifa_delete(struct ifa *);
   94: void if_start_update(void);
   95: void if_end_partial_update(struct iface *);
   96: void if_end_update(void);
   97: void if_flush_ifaces(struct proto *p);
   98: void if_feed_baby(struct proto *);
   99: struct iface *if_find_by_index(unsigned);
  100: struct iface *if_find_by_name(char *);
  101: struct iface *if_get_by_name(char *);
  102: void ifa_recalc_all_primary_addresses(void);
  103: 
  104: 
  105: /* The Neighbor Cache */
  106: 
  107: typedef struct neighbor {
  108:   node n;				/* Node in global neighbor list */
  109:   node if_n;				/* Node in per-interface neighbor list */
  110:   ip_addr addr;				/* Address of the neighbor */
  111:   struct ifa *ifa;			/* Ifa on related iface */
  112:   struct iface *iface;			/* Interface it's connected to */
  113:   struct proto *proto;			/* Protocol this belongs to */
  114:   void *data;				/* Protocol-specific data */
  115:   unsigned aux;				/* Protocol-specific data */
  116:   unsigned flags;
  117:   int scope;				/* Address scope, -1 for unreachable sticky neighbors,
  118: 					   SCOPE_HOST when it's our own address */
  119: } neighbor;
  120: 
  121: #define NEF_STICKY 1
  122: #define NEF_ONLINK 2
  123: #define NEF_BIND 4			/* Used internally for neighbors bound to an iface */
  124: 
  125: neighbor *neigh_find(struct proto *, ip_addr *, unsigned flags);
  126: neighbor *neigh_find2(struct proto *p, ip_addr *a, struct iface *ifa, unsigned flags);
  127: 
  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: 
  134: void neigh_dump(neighbor *);
  135: void neigh_dump_all(void);
  136: void neigh_prune(void);
  137: void neigh_if_up(struct iface *);
  138: void neigh_if_down(struct iface *);
  139: void neigh_if_link(struct iface *);
  140: void neigh_ifa_update(struct ifa *);
  141: void neigh_init(struct pool *);
  142: 
  143: /*
  144:  *	Interface Pattern Lists
  145:  */
  146: 
  147: struct iface_patt_node {
  148:   node n;
  149:   int positive;
  150:   byte *pattern;
  151:   ip_addr prefix;
  152:   int pxlen;
  153: };
  154: 
  155: struct iface_patt {
  156:   node n;
  157:   list ipn_list;			/* A list of struct iface_patt_node */
  158: 
  159:   /* Protocol-specific data follow after this structure */
  160: };
  161: 
  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);
  164: int iface_patts_equal(list *, list *, int (*)(struct iface_patt *, struct iface_patt *));
  165: 
  166: 
  167: u32 if_choose_router_id(struct iface_patt *mask, u32 old_id);
  168: 
  169: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>