Annotation of embedaddon/quagga/ripngd/ripngd.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * RIPng related value and structure.
                      3:  * Copyright (C) 1998 Kunihiro Ishiguro
                      4:  *
                      5:  * This file is part of GNU Zebra.
                      6:  *
                      7:  * GNU Zebra is free software; you can redistribute it and/or modify it
                      8:  * under the terms of the GNU General Public License as published by the
                      9:  * Free Software Foundation; either version 2, or (at your option) any
                     10:  * later version.
                     11:  *
                     12:  * GNU Zebra is distributed in the hope that it will be useful, but
                     13:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     15:  * General Public License for more details.
                     16:  *
                     17:  * You should have received a copy of the GNU General Public License
                     18:  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
                     19:  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
                     20:  * 02111-1307, USA.  
                     21:  */
                     22: 
                     23: #ifndef _ZEBRA_RIPNG_RIPNGD_H
                     24: #define _ZEBRA_RIPNG_RIPNGD_H
                     25: 
                     26: #include <zclient.h>
                     27: #include <vty.h>
                     28: 
                     29: /* RIPng version and port number. */
                     30: #define RIPNG_V1                         1
                     31: #define RIPNG_PORT_DEFAULT             521
                     32: #define RIPNG_VTY_PORT                2603
                     33: #define RIPNG_MAX_PACKET_SIZE         1500
                     34: #define RIPNG_PRIORITY_DEFAULT           0
                     35: 
                     36: /* RIPng commands. */
                     37: #define RIPNG_REQUEST                    1
                     38: #define RIPNG_RESPONSE                   2
                     39: 
                     40: /* RIPng metric and multicast group address. */
                     41: #define RIPNG_METRIC_INFINITY           16
                     42: #define RIPNG_METRIC_NEXTHOP          0xff
                     43: #define RIPNG_GROUP              "ff02::9"
                     44: 
                     45: /* RIPng timers. */
                     46: #define RIPNG_UPDATE_TIMER_DEFAULT      30
                     47: #define RIPNG_TIMEOUT_TIMER_DEFAULT    180
                     48: #define RIPNG_GARBAGE_TIMER_DEFAULT    120
                     49: 
                     50: /* RIPng peer timeout value. */
                     51: #define RIPNG_PEER_TIMER_DEFAULT       180
                     52: 
                     53: /* Default config file name. */
                     54: #define RIPNG_DEFAULT_CONFIG "ripngd.conf"
                     55: 
                     56: /* RIPng route types. */
                     57: #define RIPNG_ROUTE_RTE                  0
                     58: #define RIPNG_ROUTE_STATIC               1
                     59: #define RIPNG_ROUTE_DEFAULT              2
                     60: #define RIPNG_ROUTE_REDISTRIBUTE         3
                     61: #define RIPNG_ROUTE_INTERFACE            4
                     62: #define RIPNG_ROUTE_AGGREGATE            5
                     63: 
                     64: /* Interface send/receive configuration. */
                     65: #define RIPNG_SEND_UNSPEC                0
                     66: #define RIPNG_SEND_OFF                   1
                     67: #define RIPNG_RECEIVE_UNSPEC             0
                     68: #define RIPNG_RECEIVE_OFF                1
                     69: 
                     70: /* RIP default route's accept/announce methods. */
                     71: #define RIPNG_DEFAULT_ADVERTISE_UNSPEC   0
                     72: #define RIPNG_DEFAULT_ADVERTISE_NONE     1
                     73: #define RIPNG_DEFAULT_ADVERTISE          2
                     74: 
                     75: #define RIPNG_DEFAULT_ACCEPT_UNSPEC      0
                     76: #define RIPNG_DEFAULT_ACCEPT_NONE        1
                     77: #define RIPNG_DEFAULT_ACCEPT             2
                     78: 
                     79: /* Default value for "default-metric" command. */
                     80: #define RIPNG_DEFAULT_METRIC_DEFAULT     1
                     81: 
                     82: /* For max RTE calculation. */
                     83: #ifndef IPV6_HDRLEN
                     84: #define IPV6_HDRLEN 40
                     85: #endif /* IPV6_HDRLEN */
                     86: 
                     87: #ifndef IFMINMTU
                     88: #define IFMINMTU    576
                     89: #endif /* IFMINMTU */
                     90: 
                     91: /* RIPng structure. */
                     92: struct ripng 
                     93: {
                     94:   /* RIPng socket. */
                     95:   int sock;
                     96: 
                     97:   /* RIPng Parameters.*/
                     98:   u_char command;
                     99:   u_char version;
                    100:   unsigned long update_time;
                    101:   unsigned long timeout_time;
                    102:   unsigned long garbage_time;
                    103:   int max_mtu;
                    104:   int default_metric;
                    105:   int default_information;
                    106: 
                    107:   /* Input/output buffer of RIPng. */
                    108:   struct stream *ibuf;
                    109:   struct stream *obuf;
                    110: 
                    111:   /* RIPng routing information base. */
                    112:   struct route_table *table;
                    113: 
                    114:   /* RIPng only static route information. */
                    115:   struct route_table *route;
                    116: 
                    117:   /* RIPng aggregate route information. */
                    118:   struct route_table *aggregate;
                    119: 
                    120:   /* RIPng threads. */
                    121:   struct thread *t_read;
                    122:   struct thread *t_write;
                    123:   struct thread *t_update;
                    124:   struct thread *t_garbage;
                    125:   struct thread *t_zebra;
                    126: 
                    127:   /* Triggered update hack. */
                    128:   int trigger;
                    129:   struct thread *t_triggered_update;
                    130:   struct thread *t_triggered_interval;
                    131: 
                    132:   /* For redistribute route map. */
                    133:   struct
                    134:   {
                    135:     char *name;
                    136:     struct route_map *map;
                    137:     int metric_config;
                    138:     u_int32_t metric;
                    139:   } route_map[ZEBRA_ROUTE_MAX];
                    140: };
                    141: 
                    142: /* Routing table entry. */
                    143: struct rte
                    144: {
                    145:   struct in6_addr addr;        /* RIPng destination prefix */
                    146:   u_short tag;         /* RIPng tag */
                    147:   u_char prefixlen;    /* Length of the RIPng prefix */
                    148:   u_char metric;       /* Metric of the RIPng route */
                    149:                        /* The nexthop is stored by the structure
                    150:                         * ripng_nexthop within ripngd.c */
                    151: };
                    152: 
                    153: /* RIPNG send packet. */
                    154: struct ripng_packet
                    155: {
                    156:   u_char command;
                    157:   u_char version;
                    158:   u_int16_t zero; 
                    159:   struct rte rte[1];
                    160: };
                    161: 
                    162: /* Each route's information. */
                    163: struct ripng_info
                    164: {
                    165:   /* This route's type.  Static, ripng or aggregate. */
                    166:   u_char type;
                    167: 
                    168:   /* Sub type for static route. */
                    169:   u_char sub_type;
                    170: 
                    171:   /* RIPng specific information */
                    172:   struct in6_addr nexthop;     
                    173:   struct in6_addr from;
                    174: 
                    175:   /* Which interface does this route come from. */
                    176:   unsigned int ifindex;                
                    177: 
                    178:   /* Metric of this route.  */
                    179:   u_char metric;               
                    180: 
                    181:   /* Tag field of RIPng packet.*/
                    182:   u_int16_t tag;               
                    183: 
                    184:   /* For aggregation. */
                    185:   unsigned int suppress;
                    186: 
                    187:   /* Flags of RIPng route. */
                    188: #define RIPNG_RTF_FIB      1
                    189: #define RIPNG_RTF_CHANGED  2
                    190:   u_char flags;
                    191: 
                    192:   /* Garbage collect timer. */
                    193:   struct thread *t_timeout;
                    194:   struct thread *t_garbage_collect;
                    195: 
                    196:   /* Route-map features - this variables can be changed. */
                    197:   struct in6_addr nexthop_out;
                    198:   u_char metric_set;
                    199:   u_char metric_out;
                    200:   u_short tag_out;
                    201: 
                    202:   struct route_node *rp;
                    203: };
                    204: 
                    205: #ifdef notyet
                    206: #if 0
                    207: /* RIPng tag structure. */
                    208: struct ripng_tag
                    209: {
                    210:   /* Tag value. */
                    211:   u_int16_t tag;
                    212: 
                    213:   /* Port. */
                    214:   u_int16_t port;
                    215: 
                    216:   /* Multicast group. */
                    217:   struct in6_addr maddr;
                    218: 
                    219:   /* Table number. */
                    220:   int table;
                    221: 
                    222:   /* Distance. */
                    223:   int distance;
                    224: 
                    225:   /* Split horizon. */
                    226:   u_char split_horizon;
                    227: 
                    228:   /* Poison reverse. */
                    229:   u_char poison_reverse;
                    230: };
                    231: #endif /* 0 */
                    232: #endif /* not yet */
                    233: 
                    234: typedef enum {
                    235:   RIPNG_NO_SPLIT_HORIZON = 0,
                    236:   RIPNG_SPLIT_HORIZON,
                    237:   RIPNG_SPLIT_HORIZON_POISONED_REVERSE
                    238: } split_horizon_policy_t;
                    239: 
                    240: /* RIPng specific interface configuration. */
                    241: struct ripng_interface
                    242: {
                    243:   /* RIPng is enabled on this interface. */
                    244:   int enable_network;
                    245:   int enable_interface;
                    246: 
                    247:   /* RIPng is running on this interface. */
                    248:   int running;
                    249: 
                    250:   /* Split horizon flag. */
                    251:   split_horizon_policy_t split_horizon;
                    252:   split_horizon_policy_t split_horizon_default;
                    253:   
                    254:   /* For filter type slot. */
                    255: #define RIPNG_FILTER_IN  0
                    256: #define RIPNG_FILTER_OUT 1
                    257: #define RIPNG_FILTER_MAX 2
                    258: 
                    259:   /* Access-list. */
                    260:   struct access_list *list[RIPNG_FILTER_MAX];
                    261: 
                    262:   /* Prefix-list. */
                    263:   struct prefix_list *prefix[RIPNG_FILTER_MAX];
                    264: 
                    265:   /* Route-map. */
                    266:   struct route_map *routemap[RIPNG_FILTER_MAX];
                    267: 
                    268: #ifdef notyet
                    269: #if 0
                    270:   /* RIPng tag configuration. */
                    271:   struct ripng_tag *rtag;
                    272: #endif /* 0 */
                    273: #endif /* notyet */
                    274: 
                    275:   /* Default information originate. */
                    276:   u_char default_originate;
                    277: 
                    278:   /* Default information only. */
                    279:   u_char default_only;
                    280: 
                    281:   /* Wake up thread. */
                    282:   struct thread *t_wakeup;
                    283: 
                    284:   /* Passive interface. */
                    285:   int passive;
                    286: };
                    287: 
                    288: /* RIPng peer information. */
                    289: struct ripng_peer
                    290: {
                    291:   /* Peer address. */
                    292:   struct in6_addr addr;
                    293: 
                    294:   /* Peer RIPng tag value. */
                    295:   int domain;
                    296: 
                    297:   /* Last update time. */
                    298:   time_t uptime;
                    299: 
                    300:   /* Peer RIP version. */
                    301:   u_char version;
                    302: 
                    303:   /* Statistics. */
                    304:   int recv_badpackets;
                    305:   int recv_badroutes;
                    306: 
                    307:   /* Timeout thread. */
                    308:   struct thread *t_timeout;
                    309: };
                    310: 
                    311: /* All RIPng events. */
                    312: enum ripng_event
                    313: {
                    314:   RIPNG_READ,
                    315:   RIPNG_ZEBRA,
                    316:   RIPNG_REQUEST_EVENT,
                    317:   RIPNG_UPDATE_EVENT,
                    318:   RIPNG_TRIGGERED_UPDATE,
                    319: };
                    320: 
                    321: /* RIPng timer on/off macro. */
                    322: #define RIPNG_TIMER_ON(T,F,V) \
                    323: do { \
                    324:    if (!(T)) \
                    325:       (T) = thread_add_timer (master, (F), rinfo, (V)); \
                    326: } while (0)
                    327: 
                    328: #define RIPNG_TIMER_OFF(T) \
                    329: do { \
                    330:    if (T) \
                    331:      { \
                    332:        thread_cancel(T); \
                    333:        (T) = NULL; \
                    334:      } \
                    335: } while (0)
                    336: 
                    337: /* Count prefix size from mask length */
                    338: #define PSIZE(a) (((a) + 7) / (8))
                    339: 
                    340: /* Extern variables. */
                    341: extern struct ripng *ripng;
                    342: 
                    343: extern struct thread_master *master;
                    344: 
                    345: /* Prototypes. */
                    346: extern void ripng_init (void);
                    347: extern void ripng_reset (void);
                    348: extern void ripng_clean (void);
                    349: extern void ripng_clean_network (void);
                    350: extern void ripng_interface_clean (void);
                    351: extern void ripng_interface_reset (void);
                    352: extern void ripng_passive_interface_clean (void);
                    353: extern void ripng_if_init (void);
                    354: extern void ripng_route_map_init (void);
                    355: extern void ripng_route_map_reset (void);
                    356: extern void ripng_terminate (void);
                    357:  /* zclient_init() is done by ripng_zebra.c:zebra_init() */
                    358: extern void zebra_init (void);
                    359: extern void ripng_zclient_start (void);
                    360: extern void ripng_zclient_reset (void);
                    361: extern void ripng_offset_init (void);
                    362: 
                    363: extern int config_write_ripng_offset_list (struct vty *);
                    364: 
                    365: extern void ripng_peer_init (void);
                    366: extern void ripng_peer_update (struct sockaddr_in6 *, u_char);
                    367: extern void ripng_peer_bad_route (struct sockaddr_in6 *);
                    368: extern void ripng_peer_bad_packet (struct sockaddr_in6 *);
                    369: extern void ripng_peer_display (struct vty *);
                    370: extern struct ripng_peer *ripng_peer_lookup (struct in6_addr *);
                    371: extern struct ripng_peer *ripng_peer_lookup_next (struct in6_addr *);
                    372: 
                    373: extern int ripng_offset_list_apply_in (struct prefix_ipv6 *,
                    374:                                        struct interface *, u_char *);
                    375: extern int ripng_offset_list_apply_out (struct prefix_ipv6 *,
                    376:                                         struct interface *, u_char *);
                    377: extern void ripng_offset_clean (void);
                    378: 
                    379: extern struct ripng_info * ripng_info_new (void);
                    380: extern void ripng_info_free (struct ripng_info *rinfo);
                    381: extern void ripng_event (enum ripng_event, int);
                    382: extern int ripng_request (struct interface *ifp);
                    383: extern void ripng_redistribute_add (int, int, struct prefix_ipv6 *,
                    384:                                     unsigned int, struct in6_addr *);
                    385: extern void ripng_redistribute_delete (int, int, struct prefix_ipv6 *,
                    386:                                        unsigned int);
                    387: extern void ripng_redistribute_withdraw (int type);
                    388: 
                    389: extern void ripng_distribute_update_interface (struct interface *);
                    390: extern void ripng_if_rmap_update_interface (struct interface *);
                    391: 
                    392: extern void ripng_zebra_ipv6_add (struct prefix_ipv6 *p,
                    393:                                   struct in6_addr *nexthop,
                    394:                                   unsigned int ifindex, u_char metric);
                    395: extern void ripng_zebra_ipv6_delete (struct prefix_ipv6 *p,
                    396:                                      struct in6_addr *nexthop,
                    397:                                      unsigned int ifindex);
                    398: 
                    399: extern void ripng_redistribute_clean (void);
                    400: extern int ripng_redistribute_check (int);
                    401: extern void ripng_redistribute_write (struct vty *, int);
                    402: 
                    403: extern int ripng_write_rte (int num, struct stream *s, struct prefix_ipv6 *p,
                    404:                             struct in6_addr *nexthop,
                    405:                             u_int16_t tag, u_char metric);
                    406: extern int ripng_send_packet (caddr_t buf, int bufsize,
                    407:                               struct sockaddr_in6 *to, struct interface *ifp);
                    408: 
                    409: extern void ripng_packet_dump (struct ripng_packet *packet, int size,
                    410:                                const char *sndrcv);
                    411: 
                    412: extern int ripng_interface_up (int command, struct zclient *, zebra_size_t);
                    413: extern int ripng_interface_down (int command, struct zclient *, zebra_size_t);
                    414: extern int ripng_interface_add (int command, struct zclient *, zebra_size_t);
                    415: extern int ripng_interface_delete (int command, struct zclient *, zebra_size_t);
                    416: extern int ripng_interface_address_add (int command, struct zclient *, zebra_size_t);
                    417: extern int ripng_interface_address_delete (int command, struct zclient *, zebra_size_t);
                    418: 
                    419: extern int ripng_network_write (struct vty *, int);
                    420: 
                    421: #endif /* _ZEBRA_RIPNG_RIPNGD_H */

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