Annotation of embedaddon/quagga/ripngd/ripngd.h, revision 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>