Annotation of embedaddon/bird/proto/rip/rip.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  *     BIRD -- Routing Information Protocol (RIP)
        !             3:  *
        !             4:  *     (c) 1998--1999 Pavel Machek <pavel@ucw.cz>
        !             5:  *     (c) 2004--2013 Ondrej Filip <feela@network.cz>
        !             6:  *     (c) 2009--2015 Ondrej Zajicek <santiago@crfreenet.org>
        !             7:  *     (c) 2009--2015 CZ.NIC z.s.p.o.
        !             8:  *
        !             9:  *     Can be freely distributed and used under the terms of the GNU GPL.
        !            10:  */
        !            11: 
        !            12: #ifndef _BIRD_RIP_H_
        !            13: #define _BIRD_RIP_H_
        !            14: 
        !            15: #include "nest/bird.h"
        !            16: #include "nest/cli.h"
        !            17: #include "nest/iface.h"
        !            18: #include "nest/protocol.h"
        !            19: #include "nest/route.h"
        !            20: #include "nest/password.h"
        !            21: #include "nest/locks.h"
        !            22: #include "nest/bfd.h"
        !            23: #include "lib/lists.h"
        !            24: #include "lib/resource.h"
        !            25: #include "lib/socket.h"
        !            26: #include "lib/string.h"
        !            27: #include "lib/timer.h"
        !            28: 
        !            29: 
        !            30: #ifdef IPV6
        !            31: #define RIP_IS_V2 0
        !            32: #else
        !            33: #define RIP_IS_V2 1
        !            34: #endif
        !            35: 
        !            36: #define RIP_V1                 1
        !            37: #define RIP_V2                 2
        !            38: 
        !            39: #define RIP_PORT               520     /* RIP for IPv4 */
        !            40: #define RIP_NG_PORT            521     /* RIPng */
        !            41: 
        !            42: #define RIP_MAX_PKT_LENGTH     532     /* 512 + IP4_HEADER_LENGTH */
        !            43: #define RIP_AUTH_TAIL_LENGTH   4       /* Without auth_data */
        !            44: 
        !            45: #define RIP_DEFAULT_ECMP_LIMIT 16
        !            46: #define RIP_DEFAULT_INFINITY   16
        !            47: #define RIP_DEFAULT_UPDATE_TIME        30
        !            48: #define RIP_DEFAULT_TIMEOUT_TIME 180
        !            49: #define RIP_DEFAULT_GARBAGE_TIME 120
        !            50: 
        !            51: 
        !            52: struct rip_config
        !            53: {
        !            54:   struct proto_config c;
        !            55:   list patt_list;                      /* List of iface configs (struct rip_iface_config) */
        !            56: 
        !            57:   u8 rip2;                             /* RIPv2 (IPv4) or RIPng (IPv6) */
        !            58:   u8 ecmp;                             /* Maximum number of nexthops in ECMP route, or 0 */
        !            59:   u8 infinity;                         /* Maximum metric value, representing infinity */
        !            60: 
        !            61:   u32 min_timeout_time;                        /* Minimum of interface timeout_time */
        !            62:   u32 max_garbage_time;                        /* Maximum of interface garbage_time */
        !            63: };
        !            64: 
        !            65: struct rip_iface_config
        !            66: {
        !            67:   struct iface_patt i;
        !            68:   ip_addr address;                     /* Configured dst address */
        !            69:   u16 port;                            /* Src+dst port */
        !            70:   u8 metric;                           /* Incoming metric */
        !            71:   u8 mode;                             /* Interface mode (RIP_IM_*) */
        !            72:   u8 passive;                          /* Passive iface - no packets are sent */
        !            73:   u8 version;                          /* RIP version used for outgoing packets */
        !            74:   u8 version_only;     /* FIXXX */
        !            75:   u8 split_horizon;                    /* Split horizon is used in route updates */
        !            76:   u8 poison_reverse;                   /* Poisoned reverse is used in route updates */
        !            77:   u8 check_zero;                       /* Validation of RIPv1 reserved fields */
        !            78:   u8 ecmp_weight;                      /* Weight for ECMP routes*/
        !            79:   u8 auth_type;                                /* Authentication type (RIP_AUTH_*) */
        !            80:   u8 ttl_security;                     /* bool + 2 for TX only (send, but do not check on RX) */
        !            81:   u8 check_link;                       /* Whether iface link change is used */
        !            82:   u8 bfd;                              /* Use BFD on iface */
        !            83:   u16 rx_buffer;                       /* RX buffer size, 0 for MTU */
        !            84:   u16 tx_length;                       /* TX packet length limit (including headers), 0 for MTU */
        !            85:   int tx_tos;
        !            86:   int tx_priority;
        !            87:   u32 update_time;                     /* Periodic update interval */
        !            88:   u32 timeout_time;                    /* Route expiration timeout */
        !            89:   u32 garbage_time;                    /* Unreachable entry GC timeout */
        !            90:   list *passwords;                     /* Passwords for authentication */
        !            91: };
        !            92: 
        !            93: struct rip_proto
        !            94: {
        !            95:   struct proto p;
        !            96:   struct fib rtable;                   /* Internal routing table */
        !            97:   list iface_list;                     /* List of interfaces (struct rip_iface) */
        !            98:   slab *rte_slab;                      /* Slab for internal routes (struct rip_rte) */
        !            99:   timer *timer;                                /* Main protocol timer */
        !           100: 
        !           101:   u8 ecmp;                             /* Maximum number of nexthops in ECMP route, or 0 */
        !           102:   u8 infinity;                         /* Maximum metric value, representing infinity */
        !           103:   u8 triggered;                                /* Logical AND of interface want_triggered values */
        !           104:   u8 rt_reload;                                /* Route reload is scheduled */
        !           105: 
        !           106:   struct tbf log_pkt_tbf;              /* TBF for packet messages */
        !           107:   struct tbf log_rte_tbf;              /* TBF for RTE messages */
        !           108: };
        !           109: 
        !           110: struct rip_iface
        !           111: {
        !           112:   node n;
        !           113:   struct rip_proto *rip;
        !           114:   struct iface *iface;                 /* Underyling core interface */
        !           115:   struct rip_iface_config *cf;         /* Related config, must be updated in reconfigure */
        !           116:   struct object_lock *lock;            /* Interface lock */
        !           117:   timer *timer;                                /* Interface timer */
        !           118:   sock *sk;                            /* UDP socket */
        !           119: 
        !           120:   u8 up;                               /* Interface is active */
        !           121:   u8 csn_ready;                                /* Nonzero CSN can be used */
        !           122:   u16 tx_plen;                         /* Max TX packet data length */
        !           123:   u32 csn;                             /* Last used crypto sequence number */
        !           124:   ip_addr addr;                                /* Destination multicast/broadcast address */
        !           125:   list neigh_list;                     /* List of iface neighbors (struct rip_neighbor) */
        !           126: 
        !           127:   /* Update scheduling */
        !           128:   bird_clock_t next_regular;           /* Next time when regular update should be called */
        !           129:   bird_clock_t next_triggered;         /* Next time when triggerd update may be called */
        !           130:   bird_clock_t want_triggered;         /* Nonzero if triggered update is scheduled */
        !           131: 
        !           132:   /* Active update */
        !           133:   int tx_active;                       /* Update session is active */
        !           134:   ip_addr tx_addr;                     /* Update session destination address */
        !           135:   bird_clock_t tx_changed;             /* Minimal changed time for triggered update */
        !           136:   struct fib_iterator tx_fit;          /* FIB iterator in RIP routing table (p.rtable) */
        !           137: };
        !           138: 
        !           139: struct rip_neighbor
        !           140: {
        !           141:   node n;
        !           142:   struct rip_iface *ifa;               /* Associated interface, may be NULL if stale */
        !           143:   struct neighbor *nbr;                        /* Associaded core neighbor, may be NULL if stale */
        !           144:   struct bfd_request *bfd_req;         /* BFD request, if BFD is used */
        !           145:   bird_clock_t last_seen;              /* Time of last received and accepted message */
        !           146:   u32 uc;                              /* Use count, number of routes linking the neighbor */
        !           147:   u32 csn;                             /* Last received crypto sequence number */
        !           148: };
        !           149: 
        !           150: struct rip_entry
        !           151: {
        !           152:   struct fib_node n;
        !           153:   struct rip_rte *routes;              /* List of incoming routes */
        !           154: 
        !           155:   u8 valid;                            /* Entry validity state (RIP_ENTRY_*) */
        !           156:   u8 metric;                           /* Outgoing route metric */
        !           157:   u16 tag;                             /* Outgoing route tag */
        !           158:   struct iface *from;                  /* Outgoing route from, NULL if from  proto */
        !           159:   struct iface *iface;                 /* Outgoing route iface (for next hop) */
        !           160:   ip_addr next_hop;                    /* Outgoing route next hop */
        !           161: 
        !           162:   bird_clock_t changed;                        /* Last time when the outgoing route metric changed */
        !           163: };
        !           164: 
        !           165: struct rip_rte
        !           166: {
        !           167:   struct rip_rte *next;
        !           168: 
        !           169:   struct rip_neighbor *from;           /* Advertising router */
        !           170:   ip_addr next_hop;                    /* Route next hop (iface is from->nbr->iface) */
        !           171:   u16 metric;                          /* Route metric (after increase) */
        !           172:   u16 tag;                             /* Route tag */
        !           173: 
        !           174:   bird_clock_t expires;                        /* Time of route expiration */
        !           175: };
        !           176: 
        !           177: 
        !           178: #define RIP_AUTH_NONE          0
        !           179: #define RIP_AUTH_PLAIN         2
        !           180: #define RIP_AUTH_CRYPTO                3
        !           181: 
        !           182: #define RIP_IM_MULTICAST       1
        !           183: #define RIP_IM_BROADCAST       2
        !           184: 
        !           185: #define RIP_ENTRY_DUMMY                0       /* Only used to store list of incoming routes */
        !           186: #define RIP_ENTRY_VALID                1       /* Valid outgoing route */
        !           187: #define RIP_ENTRY_STALE                2       /* Stale outgoing route, waiting for GC */
        !           188: 
        !           189: #define EA_RIP_METRIC          EA_CODE(EAP_RIP, 0)
        !           190: #define EA_RIP_TAG             EA_CODE(EAP_RIP, 1)
        !           191: 
        !           192: #define rip_is_v2(X) RIP_IS_V2
        !           193: #define rip_is_ng(X) (!RIP_IS_V2)
        !           194: 
        !           195: /*
        !           196: static inline int rip_is_v2(struct rip_proto *p)
        !           197: { return p->rip2; }
        !           198: 
        !           199: static inline int rip_is_ng(struct rip_proto *p)
        !           200: { return ! p->rip2; }
        !           201: */
        !           202: 
        !           203: static inline void
        !           204: rip_reset_tx_session(struct rip_proto *p, struct rip_iface *ifa)
        !           205: {
        !           206:   if (ifa->tx_active)
        !           207:   {
        !           208:     FIB_ITERATE_UNLINK(&ifa->tx_fit, &p->rtable);
        !           209:     ifa->tx_active = 0;
        !           210:   }
        !           211: }
        !           212: 
        !           213: /* rip.c */
        !           214: void rip_update_rte(struct rip_proto *p, ip_addr *prefix, int pxlen, struct rip_rte *new);
        !           215: void rip_withdraw_rte(struct rip_proto *p, ip_addr *prefix, int pxlen, struct rip_neighbor *from);
        !           216: struct rip_neighbor * rip_get_neighbor(struct rip_proto *p, ip_addr *a, struct rip_iface *ifa);
        !           217: void rip_update_bfd(struct rip_proto *p, struct rip_neighbor *n);
        !           218: void rip_show_interfaces(struct proto *P, char *iff);
        !           219: void rip_show_neighbors(struct proto *P, char *iff);
        !           220: 
        !           221: /* packets.c */
        !           222: void rip_send_request(struct rip_proto *p, struct rip_iface *ifa);
        !           223: void rip_send_table(struct rip_proto *p, struct rip_iface *ifa, ip_addr addr, bird_clock_t changed);
        !           224: int rip_open_socket(struct rip_iface *ifa);
        !           225: 
        !           226: 
        !           227: #endif

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