Return to krt.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird2 / sysdep / unix |
1.1 ! misho 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