File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird2 / sysdep / unix / krt.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Oct 21 16:03:56 2019 UTC (5 years, 5 months ago) by misho
Branches: bird2, MAIN
CVS tags: v2_0_7p0, HEAD
bird2 ver 2.0.7

    1: /*
    2:  *	BIRD -- UNIX Kernel Route Syncer
    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_KRT_H_
   10: #define _BIRD_KRT_H_
   11: 
   12: struct config;
   13: struct krt_config;
   14: struct krt_proto;
   15: struct kif_config;
   16: struct kif_proto;
   17: 
   18: #include "nest/iface.h"
   19: #include "sysdep/config.h"
   20: #include CONFIG_INCLUDE_KRTSYS_H
   21: 
   22: /* Flags stored in net->n.flags, rest are in nest/route.h */
   23: 
   24: #define KRF_VERDICT_MASK 0x0f
   25: #define KRF_CREATE 0			/* Not seen in kernel table */
   26: #define KRF_SEEN 1			/* Seen in kernel table during last scan */
   27: #define KRF_UPDATE 2			/* Need to update this entry */
   28: #define KRF_DELETE 3			/* Should be deleted */
   29: #define KRF_IGNORE 4			/* To be ignored */
   30: 
   31: #define KRT_DEFAULT_ECMP_LIMIT	16
   32: 
   33: #define EA_KRT_SOURCE	EA_CODE(PROTOCOL_KERNEL, 0)
   34: #define EA_KRT_METRIC	EA_CODE(PROTOCOL_KERNEL, 1)
   35: 
   36: /* Whenever we recognize our own routes, we allow learing of foreign routes */
   37: 
   38: #ifdef CONFIG_SELF_CONSCIOUS
   39: #define KRT_ALLOW_LEARN
   40: #endif
   41: 
   42: /* krt.c */
   43: 
   44: extern struct protocol proto_unix_kernel;
   45: 
   46: struct krt_config {
   47:   struct proto_config c;
   48:   struct krt_params sys;	/* Sysdep params */
   49:   btime scan_time;		/* How often we re-scan routes */
   50:   int persist;			/* Keep routes when we exit */
   51:   int learn;			/* Learn routes from other sources */
   52:   int graceful_restart;		/* Regard graceful restart recovery */
   53:   int merge_paths;		/* Exported routes are merged for ECMP */
   54: };
   55: 
   56: struct krt_proto {
   57:   struct proto p;
   58:   struct krt_state sys;		/* Sysdep state */
   59: 
   60: #ifdef KRT_ALLOW_LEARN
   61:   struct rtable krt_table;	/* Internal table of inherited routes */
   62: #endif
   63: 
   64: #ifndef CONFIG_ALL_TABLES_AT_ONCE
   65:   timer *scan_timer;
   66: #endif
   67: 
   68:   node krt_node;		/* Node in krt_proto_list */
   69:   byte af;			/* Kernel address family (AF_*) */
   70:   byte ready;			/* Initial feed has been finished */
   71:   byte initialized;		/* First scan has been finished */
   72:   byte reload;			/* Next scan is doing reload */
   73: };
   74: 
   75: extern pool *krt_pool;
   76: 
   77: #define KRT_CF ((struct krt_config *)p->p.cf)
   78: 
   79: #define KRT_TRACE(pr, fl, msg, args...) do {	\
   80:   DBG("KRT: " msg "\n" , ## args);		\
   81:   if (pr->p.debug & fl)				\
   82:     { log(L_TRACE "%s: " msg, pr->p.name , ## args); } } while(0)
   83: 
   84: struct proto_config * kif_init_config(int class);
   85: void kif_request_scan(void);
   86: void krt_got_route(struct krt_proto *p, struct rte *e);
   87: void krt_got_route_async(struct krt_proto *p, struct rte *e, int new);
   88: 
   89: /* Values for rte->u.krt_sync.src */
   90: #define KRT_SRC_UNKNOWN	-1	/* Nobody knows */
   91: #define KRT_SRC_BIRD	 0	/* Our route (not passed in async mode) */
   92: #define KRT_SRC_REDIRECT 1	/* Redirect route, delete it */
   93: #define KRT_SRC_ALIEN	 2	/* Route installed by someone else */
   94: #define KRT_SRC_KERNEL	 3	/* Kernel routes, are ignored by krt syncer */
   95: 
   96: extern struct protocol proto_unix_iface;
   97: 
   98: struct kif_config {
   99:   struct proto_config c;
  100:   struct kif_params sys;	/* Sysdep params */
  101: 
  102:   list iface_list;		/* List of iface configs (struct kif_iface_config) */
  103:   btime scan_time;		/* How often we re-scan interfaces */
  104: };
  105: 
  106: struct kif_iface_config {
  107:   struct iface_patt i;
  108: 
  109:   ip_addr pref_v4;
  110:   ip_addr pref_v6;
  111:   ip_addr pref_ll;
  112: };
  113: 
  114: struct kif_proto {
  115:   struct proto p;
  116:   struct kif_state sys;		/* Sysdep state */
  117: };
  118: 
  119: extern struct kif_proto *kif_proto;
  120: 
  121: #define KIF_CF ((struct kif_config *)p->p.cf)
  122: 
  123: struct kif_iface_config * kif_get_iface_config(struct iface *iface);
  124: struct proto_config * krt_init_config(int class);
  125: 
  126: 
  127: /* krt sysdep */
  128: 
  129: void krt_sys_io_init(void);
  130: void krt_sys_init(struct krt_proto *);
  131: int krt_sys_start(struct krt_proto *);
  132: void krt_sys_shutdown(struct krt_proto *);
  133: int krt_sys_reconfigure(struct krt_proto *p UNUSED, struct krt_config *n, struct krt_config *o);
  134: 
  135: void krt_sys_preconfig(struct config *);
  136: void krt_sys_postconfig(struct krt_config *);
  137: void krt_sys_init_config(struct krt_config *);
  138: void krt_sys_copy_config(struct krt_config *, struct krt_config *);
  139: 
  140: int  krt_capable(rte *e);
  141: void krt_do_scan(struct krt_proto *);
  142: void krt_replace_rte(struct krt_proto *p, net *n, rte *new, rte *old);
  143: int krt_sys_get_attr(eattr *a, byte *buf, int buflen);
  144: 
  145: 
  146: /* kif sysdep */
  147: 
  148: void kif_sys_init(struct kif_proto *);
  149: void kif_sys_start(struct kif_proto *);
  150: void kif_sys_shutdown(struct kif_proto *);
  151: int kif_sys_reconfigure(struct kif_proto *, struct kif_config *, struct kif_config *);
  152: 
  153: void kif_sys_init_config(struct kif_config *);
  154: void kif_sys_copy_config(struct kif_config *, struct kif_config *);
  155: 
  156: void kif_do_scan(struct kif_proto *);
  157: 
  158: int kif_update_sysdep_addr(struct iface *i);
  159: 
  160: #endif

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