Annotation of embedaddon/bird/proto/radv/radv.h, revision 1.1
1.1 ! misho 1: /*
! 2: * BIRD -- Router Advertisement
! 3: *
! 4: *
! 5: * Can be freely distributed and used under the terms of the GNU GPL.
! 6: */
! 7:
! 8: #ifndef _BIRD_RADV_H_
! 9: #define _BIRD_RADV_H_
! 10:
! 11: #include "nest/bird.h"
! 12:
! 13: #include "lib/ip.h"
! 14: #include "lib/lists.h"
! 15: #include "lib/socket.h"
! 16: #include "lib/timer.h"
! 17: #include "lib/resource.h"
! 18: #include "nest/protocol.h"
! 19: #include "nest/iface.h"
! 20: #include "nest/route.h"
! 21: #include "nest/cli.h"
! 22: #include "nest/locks.h"
! 23: #include "conf/conf.h"
! 24: #include "lib/string.h"
! 25:
! 26:
! 27: #define ICMPV6_PROTO 58
! 28:
! 29: #define ICMPV6_RS 133
! 30: #define ICMPV6_RA 134
! 31:
! 32: #define MAX_INITIAL_RTR_ADVERTISEMENTS 3
! 33: #define MAX_INITIAL_RTR_ADVERT_INTERVAL 16
! 34:
! 35: #define DEFAULT_MAX_RA_INT 600
! 36: #define DEFAULT_MIN_DELAY 3
! 37: #define DEFAULT_CURRENT_HOP_LIMIT 64
! 38:
! 39: #define DEFAULT_VALID_LIFETIME 86400
! 40: #define DEFAULT_PREFERRED_LIFETIME 14400
! 41:
! 42: #define DEFAULT_DNS_LIFETIME_MULT 3
! 43:
! 44:
! 45: struct radv_config
! 46: {
! 47: struct proto_config c;
! 48: list patt_list; /* List of iface configs (struct radv_iface_config) */
! 49: list pref_list; /* Global list of prefix configs (struct radv_prefix_config) */
! 50: list rdnss_list; /* Global list of RDNSS configs (struct radv_rdnss_config) */
! 51: list dnssl_list; /* Global list of DNSSL configs (struct radv_dnssl_config) */
! 52:
! 53: ip_addr trigger_prefix; /* Prefix of a trigger route, if defined */
! 54: u8 trigger_pxlen; /* Pxlen of a trigger route, if defined */
! 55: u8 trigger_valid; /* Whether a trigger route is defined */
! 56: };
! 57:
! 58: struct radv_iface_config
! 59: {
! 60: struct iface_patt i;
! 61: list pref_list; /* Local list of prefix configs (struct radv_prefix_config) */
! 62: list rdnss_list; /* Local list of RDNSS configs (struct radv_rdnss_config) */
! 63: list dnssl_list; /* Local list of DNSSL configs (struct radv_dnssl_config) */
! 64:
! 65: u32 min_ra_int; /* Standard options from RFC 4261 */
! 66: u32 max_ra_int;
! 67: u32 min_delay;
! 68:
! 69: u8 rdnss_local; /* Global list is not used for RDNSS */
! 70: u8 dnssl_local; /* Global list is not used for DNSSL */
! 71:
! 72: u8 managed; /* Standard options from RFC 4261 */
! 73: u8 other_config;
! 74: u32 link_mtu;
! 75: u32 reachable_time;
! 76: u32 retrans_timer;
! 77: u32 current_hop_limit;
! 78: u32 default_lifetime;
! 79: u8 default_lifetime_sensitive; /* Whether default_lifetime depends on trigger */
! 80: u8 default_preference; /* Default Router Preference (RFC 4191) */
! 81: };
! 82:
! 83: struct radv_prefix_config
! 84: {
! 85: node n;
! 86: ip_addr prefix;
! 87: uint pxlen;
! 88:
! 89: u8 skip; /* Do not include this prefix to RA */
! 90: u8 onlink; /* Standard options from RFC 4261 */
! 91: u8 autonomous;
! 92: u32 valid_lifetime;
! 93: u32 preferred_lifetime;
! 94: u8 valid_lifetime_sensitive; /* Whether valid_lifetime depends on trigger */
! 95: u8 preferred_lifetime_sensitive; /* Whether preferred_lifetime depends on trigger */
! 96: };
! 97:
! 98: struct radv_rdnss_config
! 99: {
! 100: node n;
! 101: u32 lifetime; /* Valid if lifetime_mult is 0 */
! 102: u16 lifetime_mult; /* Lifetime specified as multiple of max_ra_int */
! 103: ip_addr server; /* IP address of recursive DNS server */
! 104: };
! 105:
! 106: struct radv_dnssl_config
! 107: {
! 108: node n;
! 109: u32 lifetime; /* Valid if lifetime_mult is 0 */
! 110: u16 lifetime_mult; /* Lifetime specified as multiple of max_ra_int */
! 111: u8 dlen_first; /* Length of first label in domain */
! 112: u8 dlen_all; /* Both dlen_ filled in radv_process_domain() */
! 113: char *domain; /* Domain for DNS search list, in processed form */
! 114: };
! 115:
! 116:
! 117: struct proto_radv
! 118: {
! 119: struct proto p;
! 120: list iface_list; /* List of active ifaces */
! 121: u8 active; /* Whether radv is active w.r.t. triggers */
! 122: };
! 123:
! 124: struct radv_iface
! 125: {
! 126: node n;
! 127: struct proto_radv *ra;
! 128: struct radv_iface_config *cf; /* Related config, must be updated in reconfigure */
! 129: struct iface *iface;
! 130: struct ifa *addr; /* Link-local address of iface */
! 131:
! 132: timer *timer;
! 133: struct object_lock *lock;
! 134: sock *sk;
! 135:
! 136: bird_clock_t last; /* Time of last sending of RA */
! 137: u16 plen; /* Length of prepared RA in tbuf, or 0 if not valid */
! 138: byte initial; /* List of active ifaces */
! 139: };
! 140:
! 141: #define RA_EV_INIT 1 /* Switch to initial mode */
! 142: #define RA_EV_CHANGE 2 /* Change of options or prefixes */
! 143: #define RA_EV_RS 3 /* Received RS */
! 144:
! 145: /* Default Router Preferences (RFC 4191) */
! 146: #define RA_PREF_LOW 0x18
! 147: #define RA_PREF_MEDIUM 0x00
! 148: #define RA_PREF_HIGH 0x08
! 149: #define RA_PREF_MASK 0x18
! 150:
! 151:
! 152: #ifdef LOCAL_DEBUG
! 153: #define RADV_FORCE_DEBUG 1
! 154: #else
! 155: #define RADV_FORCE_DEBUG 0
! 156: #endif
! 157: #define RADV_TRACE(flags, msg, args...) do { if ((ra->p.debug & flags) || RADV_FORCE_DEBUG) \
! 158: log(L_TRACE "%s: " msg, ra->p.name , ## args ); } while(0)
! 159:
! 160:
! 161: /* radv.c */
! 162: void radv_iface_notify(struct radv_iface *ifa, int event);
! 163:
! 164: /* packets.c */
! 165: int radv_process_domain(struct radv_dnssl_config *cf);
! 166: void radv_send_ra(struct radv_iface *ifa, int shutdown);
! 167: int radv_sk_open(struct radv_iface *ifa);
! 168:
! 169:
! 170:
! 171: #endif /* _BIRD_RADV_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>