Annotation of embedaddon/bird2/proto/radv/radv.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  *     BIRD -- Router Advertisement
        !             3:  *
        !             4:  *     (c) 2011--2019 Ondrej Zajicek <santiago@crfreenet.org>
        !             5:  *     (c) 2011--2019 CZ.NIC z.s.p.o.
        !             6:  *
        !             7:  *     Can be freely distributed and used under the terms of the GNU GPL.
        !             8:  */
        !             9: 
        !            10: #ifndef _BIRD_RADV_H_
        !            11: #define _BIRD_RADV_H_
        !            12: 
        !            13: #include "nest/bird.h"
        !            14: 
        !            15: #include "lib/ip.h"
        !            16: #include "lib/lists.h"
        !            17: #include "lib/socket.h"
        !            18: #include "lib/timer.h"
        !            19: #include "lib/resource.h"
        !            20: #include "nest/protocol.h"
        !            21: #include "nest/iface.h"
        !            22: #include "nest/route.h"
        !            23: #include "nest/cli.h"
        !            24: #include "nest/locks.h"
        !            25: #include "conf/conf.h"
        !            26: #include "lib/string.h"
        !            27: 
        !            28: 
        !            29: #define ICMPV6_PROTO 58
        !            30: 
        !            31: #define ICMPV6_RS 133
        !            32: #define ICMPV6_RA 134
        !            33: 
        !            34: #define MAX_INITIAL_RTR_ADVERTISEMENTS 3
        !            35: #define MAX_INITIAL_RTR_ADVERT_INTERVAL (16 S_)
        !            36: 
        !            37: #define DEFAULT_MAX_RA_INT 600
        !            38: #define DEFAULT_MIN_DELAY 3
        !            39: #define DEFAULT_CURRENT_HOP_LIMIT 64
        !            40: 
        !            41: #define DEFAULT_VALID_LIFETIME 86400
        !            42: #define DEFAULT_PREFERRED_LIFETIME 14400
        !            43: 
        !            44: #define DEFAULT_DNS_LIFETIME_MULT 3
        !            45: 
        !            46: 
        !            47: struct radv_config
        !            48: {
        !            49:   struct proto_config c;
        !            50:   list patt_list;              /* List of iface configs (struct radv_iface_config) */
        !            51:   list pref_list;              /* Global list of prefix configs (struct radv_prefix_config) */
        !            52:   list rdnss_list;             /* Global list of RDNSS configs (struct radv_rdnss_config) */
        !            53:   list dnssl_list;             /* Global list of DNSSL configs (struct radv_dnssl_config) */
        !            54: 
        !            55:   net_addr trigger;            /* Prefix of a trigger route, if defined */
        !            56:   u8 propagate_routes;         /* Do we propagate more specific routes (RFC 4191)? */
        !            57:   u32 max_linger_time;         /* Maximum of interface route_linger_time */
        !            58: };
        !            59: 
        !            60: struct radv_iface_config
        !            61: {
        !            62:   struct iface_patt i;
        !            63:   list pref_list;              /* Local list of prefix configs (struct radv_prefix_config) */
        !            64:   list rdnss_list;             /* Local list of RDNSS configs (struct radv_rdnss_config) */
        !            65:   list dnssl_list;             /* Local list of DNSSL configs (struct radv_dnssl_config) */
        !            66: 
        !            67:   u32 min_ra_int;              /* Standard options from RFC 4861 */
        !            68:   u32 max_ra_int;
        !            69:   u32 min_delay;
        !            70: 
        !            71:   u8 solicited_ra_unicast;     /* Send solicited RAs as unicast */
        !            72: 
        !            73:   u32 prefix_linger_time;      /* How long we advertise dead prefixes with lifetime 0 */
        !            74:   u32 route_linger_time;       /* How long we advertise dead routes with lifetime 0 */
        !            75: 
        !            76:   u8 rdnss_local;              /* Global list is not used for RDNSS */
        !            77:   u8 dnssl_local;              /* Global list is not used for DNSSL */
        !            78: 
        !            79:   u8 managed;                  /* Standard options from RFC 4861 */
        !            80:   u8 other_config;
        !            81:   u32 link_mtu;
        !            82:   u32 reachable_time;
        !            83:   u32 retrans_timer;
        !            84:   u32 current_hop_limit;
        !            85:   u32 default_lifetime;
        !            86:   u32 route_lifetime;          /* Lifetime for the RFC 4191 routes */
        !            87:   u8 default_lifetime_sensitive; /* Whether default_lifetime depends on trigger */
        !            88:   u8 route_lifetime_sensitive; /* Whether route_lifetime depends on trigger */
        !            89:   u8 default_preference;       /* Default Router Preference (RFC 4191) */
        !            90:   u8 route_preference;         /* Specific Route Preference (RFC 4191) */
        !            91: };
        !            92: 
        !            93: struct radv_prefix_config
        !            94: {
        !            95:   node n;
        !            96:   net_addr_ip6 prefix;
        !            97: 
        !            98:   u8 skip;                     /* Do not include this prefix to RA */
        !            99:   u8 onlink;                   /* Standard options from RFC 4861 */
        !           100:   u8 autonomous;
        !           101:   u32 valid_lifetime;
        !           102:   u32 preferred_lifetime;
        !           103:   u8 valid_lifetime_sensitive;  /* Whether valid_lifetime depends on trigger */
        !           104:   u8 preferred_lifetime_sensitive; /* Whether preferred_lifetime depends on trigger */
        !           105: };
        !           106: 
        !           107: struct radv_rdnss_config
        !           108: {
        !           109:   node n;
        !           110:   u32 lifetime;                        /* Valid if lifetime_mult is 0 */
        !           111:   u16 lifetime_mult;           /* Lifetime specified as multiple of max_ra_int */
        !           112:   ip6_addr server;             /* IP address of recursive DNS server */
        !           113: };
        !           114: 
        !           115: struct radv_dnssl_config
        !           116: {
        !           117:   node n;
        !           118:   u32 lifetime;                        /* Valid if lifetime_mult is 0 */
        !           119:   u16 lifetime_mult;           /* Lifetime specified as multiple of max_ra_int */
        !           120:   u8 dlen_first;               /* Length of first label in domain */
        !           121:   u8 dlen_all;                 /* Both dlen_ filled in radv_process_domain() */
        !           122:   char *domain;                        /* Domain for DNS search list, in processed form */
        !           123: };
        !           124: 
        !           125: /*
        !           126:  * One more specific route as per RFC 4191.
        !           127:  *
        !           128:  * Note that it does *not* contain the next hop field. The next hop is always
        !           129:  * the router sending the advertisment and the more specific route only allows
        !           130:  * overriding the preference of the route.
        !           131:  */
        !           132: struct radv_route
        !           133: {
        !           134:   u32 lifetime;                        /* Lifetime from an attribute */
        !           135:   u8 lifetime_set;             /* Whether lifetime is defined */
        !           136:   u8 preference;               /* Preference of the route, RA_PREF_* */
        !           137:   u8 preference_set;           /* Whether preference is defined */
        !           138:   u8 valid;                    /* Whethe route is valid or withdrawn */
        !           139:   btime changed;               /* Last time when the route changed */
        !           140: 
        !           141:   struct fib_node n;
        !           142: };
        !           143: 
        !           144: struct radv_proto
        !           145: {
        !           146:   struct proto p;
        !           147:   list iface_list;             /* List of active ifaces */
        !           148:   u8 valid;                    /* Router is valid for forwarding, used for shutdown */
        !           149:   u8 active;                   /* Whether radv is active w.r.t. triggers */
        !           150:   u8 fib_up;                   /* FIB table (routes) is initialized */
        !           151:   struct fib routes;           /* FIB table of specific routes (struct radv_route) */
        !           152:   btime prune_time;            /* Next time of route table pruning */
        !           153: };
        !           154: 
        !           155: struct radv_prefix             /* One prefix we advertise */
        !           156: {
        !           157:   node n;
        !           158:   net_addr_ip6 prefix;
        !           159: 
        !           160:   u8 valid;                    /* Is the prefix valid? If not, we advertise it
        !           161:                                   with 0 lifetime, so clients stop using it */
        !           162:   u8 mark;                     /* A temporary mark for processing */
        !           163:   btime changed;               /* Last time when the prefix changed */
        !           164:   struct radv_prefix_config *cf; /* The config tied to this prefix */
        !           165: };
        !           166: 
        !           167: struct radv_iface
        !           168: {
        !           169:   node n;
        !           170:   struct radv_proto *ra;
        !           171:   struct radv_iface_config *cf;        /* Related config, must be updated in reconfigure */
        !           172:   struct iface *iface;
        !           173:   struct ifa *addr;            /* Link-local address of iface */
        !           174:   struct pool *pool;           /* A pool for interface-specific things */
        !           175:   list prefixes;               /* The prefixes we advertise (struct radv_prefix) */
        !           176:   btime prune_time;            /* Next time of prefix list pruning */
        !           177:   btime valid_time;            /* Cached packet is valid until first linger timeout */
        !           178: 
        !           179:   timer *timer;
        !           180:   struct object_lock *lock;
        !           181:   sock *sk;
        !           182: 
        !           183:   btime last;                  /* Time of last sending of RA */
        !           184:   u16 plen;                    /* Length of prepared RA in tbuf, or 0 if not valid */
        !           185:   byte initial;                        /* How many RAs are still to be sent as initial */
        !           186: };
        !           187: 
        !           188: #define RA_EV_INIT 1           /* Switch to initial mode */
        !           189: #define RA_EV_CHANGE 2         /* Change of options or prefixes */
        !           190: #define RA_EV_RS 3             /* Received RS */
        !           191: 
        !           192: /* Default Router Preferences (RFC 4191) */
        !           193: #define RA_PREF_LOW    0x18
        !           194: #define RA_PREF_MEDIUM 0x00
        !           195: #define RA_PREF_HIGH   0x08
        !           196: #define RA_PREF_MASK   0x18
        !           197: 
        !           198: /* Attributes */
        !           199: #define EA_RA_PREFERENCE       EA_CODE(PROTOCOL_RADV, 0)
        !           200: #define EA_RA_LIFETIME         EA_CODE(PROTOCOL_RADV, 1)
        !           201: 
        !           202: #ifdef LOCAL_DEBUG
        !           203: #define RADV_FORCE_DEBUG 1
        !           204: #else
        !           205: #define RADV_FORCE_DEBUG 0
        !           206: #endif
        !           207: #define RADV_TRACE(flags, msg, args...) do { if ((p->p.debug & flags) || RADV_FORCE_DEBUG) \
        !           208:        log(L_TRACE "%s: " msg, p->p.name , ## args ); } while(0)
        !           209: 
        !           210: 
        !           211: /* Invalidate cached RA packet */
        !           212: static inline void radv_invalidate(struct radv_iface *ifa)
        !           213: { ifa->plen = 0; }
        !           214: 
        !           215: /* radv.c */
        !           216: void radv_iface_notify(struct radv_iface *ifa, int event);
        !           217: 
        !           218: /* packets.c */
        !           219: int radv_process_domain(struct radv_dnssl_config *cf);
        !           220: void radv_send_ra(struct radv_iface *ifa, ip_addr to);
        !           221: int radv_sk_open(struct radv_iface *ifa);
        !           222: 
        !           223: 
        !           224: 
        !           225: #endif /* _BIRD_RADV_H_ */

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