File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird / nest / iface.h
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 19:50:23 2021 UTC (3 years, 3 months ago) by misho
Branches: bird, MAIN
CVS tags: v1_6_8p3, HEAD
bird 1.6.8

    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:   unsigned master_index;		/* Interface index of master iface */
   38:   list addrs;				/* Addresses assigned to this interface */
   39:   struct ifa *addr;			/* Primary address */
   40: #ifdef IPV6
   41:   struct ifa *llv6;			/* Selected IPv6 link-local address */
   42: #endif
   43:   struct iface *master;			/* Master iface (e.g. for VRF) */
   44:   list neighbors;			/* All neighbors on this interface */
   45: };
   46: 
   47: #define IF_UP 1				/* IF_ADMIN_UP and IP address known */
   48: #define IF_MULTIACCESS 2
   49: #define IF_BROADCAST 4
   50: #define IF_MULTICAST 8
   51: #define IF_SHUTDOWN 0x10		/* Interface disappeared */
   52: #define IF_LOOPBACK 0x20
   53: #define IF_IGNORE 0x40			/* Not to be used by routing protocols (loopbacks etc.) */
   54: #define IF_ADMIN_UP 0x80		/* Administrative up (e.g. IFF_UP in Linux) */
   55: #define IF_LINK_UP 0x100		/* Link available (e.g. IFF_LOWER_UP in Linux) */
   56: 
   57: #define IA_PRIMARY 0x10000		/* This address is primary */
   58: #define IA_SECONDARY 0x20000		/* This address has been reported as secondary by the kernel */
   59: #define IA_PEER 0x40000			/* A peer/ptp address */
   60: #define IA_HOST 0x80000			/* A host/loopback address */
   61: #define IA_FLAGS 0xff0000
   62: 
   63: /*
   64:  * There are three kinds of addresses in BIRD:
   65:  *  - Standard (prefix-based) addresses, these may define ifa.opposite (for /30 or /31).
   66:  *  - Peer/ptp addresses, without common prefix for ifa.ip and ifa.opposite.
   67:  *    ifa.opposite is defined and ifa.prefix/pxlen == ifa.opposite/32 (for simplicity).
   68:  *  - Host addresses, with ifa.prefix/pxlen == ifa.ip/32 (or /128).
   69:  *    May be considered a special case of standard addresses.
   70:  *
   71:  * Peer addresses (AFAIK) do not exist in IPv6. Linux also supports generalized peer
   72:  * addresses (with pxlen < 32 and ifa.ip outside prefix), we do not support that.
   73:  */
   74: 
   75: 
   76: #define IF_JUST_CREATED 0x10000000	/* Send creation event as soon as possible */
   77: #define IF_TMP_DOWN 0x20000000		/* Temporary shutdown due to interface reconfiguration */
   78: #define IF_UPDATED 0x40000000		/* Touched in last scan */
   79: 
   80: /* Interface change events */
   81: 
   82: #define IF_CHANGE_UP 1
   83: #define IF_CHANGE_DOWN 2
   84: #define IF_CHANGE_MTU 4
   85: #define IF_CHANGE_CREATE 8		/* Seen this interface for the first time */
   86: #define IF_CHANGE_LINK 0x10
   87: #define IF_CHANGE_TOO_MUCH 0x40000000	/* Used internally */
   88: 
   89: void if_init(void);
   90: void if_dump(struct iface *);
   91: void if_dump_all(void);
   92: void ifa_dump(struct ifa *);
   93: void if_show(void);
   94: void if_show_summary(void);
   95: struct iface *if_update(struct iface *);
   96: void if_delete(struct iface *old);
   97: struct ifa *ifa_update(struct ifa *);
   98: void ifa_delete(struct ifa *);
   99: void if_start_update(void);
  100: void if_end_partial_update(struct iface *);
  101: void if_end_update(void);
  102: void if_flush_ifaces(struct proto *p);
  103: void if_feed_baby(struct proto *);
  104: struct iface *if_find_by_index(unsigned);
  105: struct iface *if_find_by_name(char *);
  106: struct iface *if_get_by_name(char *);
  107: void ifa_recalc_all_primary_addresses(void);
  108: 
  109: static inline struct ifa *
  110: ifa_llv6(struct iface *i UNUSED4)
  111: {
  112: #ifdef IPV6
  113:   return i->llv6;
  114: #else
  115:   return NULL;
  116: #endif
  117: }
  118: 
  119: 
  120: /* The Neighbor Cache */
  121: 
  122: typedef struct neighbor {
  123:   node n;				/* Node in global neighbor list */
  124:   node if_n;				/* Node in per-interface neighbor list */
  125:   ip_addr addr;				/* Address of the neighbor */
  126:   struct ifa *ifa;			/* Ifa on related iface */
  127:   struct iface *iface;			/* Interface it's connected to */
  128:   struct proto *proto;			/* Protocol this belongs to */
  129:   void *data;				/* Protocol-specific data */
  130:   unsigned aux;				/* Protocol-specific data */
  131:   unsigned flags;
  132:   int scope;				/* Address scope, -1 for unreachable sticky neighbors,
  133: 					   SCOPE_HOST when it's our own address */
  134: } neighbor;
  135: 
  136: #define NEF_STICKY 1
  137: #define NEF_ONLINK 2
  138: #define NEF_BIND 4			/* Used internally for neighbors bound to an iface */
  139: 
  140: neighbor *neigh_find(struct proto *, ip_addr *, unsigned flags);
  141: neighbor *neigh_find2(struct proto *p, ip_addr *a, struct iface *ifa, unsigned flags);
  142: 
  143: static inline int neigh_connected_to(struct proto *p, ip_addr *a, struct iface *i)
  144: {
  145:   neighbor *n = neigh_find(p, a, 0);
  146:   return n && n->iface == i;
  147: }
  148: 
  149: void neigh_dump(neighbor *);
  150: void neigh_dump_all(void);
  151: void neigh_prune(void);
  152: void neigh_if_up(struct iface *);
  153: void neigh_if_down(struct iface *);
  154: void neigh_if_link(struct iface *);
  155: void neigh_ifa_update(struct ifa *);
  156: void neigh_init(struct pool *);
  157: 
  158: /*
  159:  *	Interface Pattern Lists
  160:  */
  161: 
  162: struct iface_patt_node {
  163:   node n;
  164:   int positive;
  165:   byte *pattern;
  166:   ip_addr prefix;
  167:   int pxlen;
  168: };
  169: 
  170: struct iface_patt {
  171:   node n;
  172:   list ipn_list;			/* A list of struct iface_patt_node */
  173: 
  174:   /* Protocol-specific data follow after this structure */
  175: };
  176: 
  177: int iface_patt_match(struct iface_patt *ifp, struct iface *i, struct ifa *a);
  178: struct iface_patt *iface_patt_find(list *l, struct iface *i, struct ifa *a);
  179: int iface_patts_equal(list *, list *, int (*)(struct iface_patt *, struct iface_patt *));
  180: 
  181: 
  182: u32 if_choose_router_id(struct iface_patt *mask, u32 old_id);
  183: 
  184: #endif

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