back to topotato report
topotato coverage report
Current view: top level - ripd - ripd.h (source / functions) Hit Total Coverage
Test: test_demo.py::AllStartupTest Lines: 1 1 100.0 %
Date: 2023-02-24 18:37:51 Functions: 0 0 -

          Line data    Source code
       1             : /* RIP related values and structures.
       2             :  * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
       3             :  *
       4             :  * This file is part of GNU Zebra.
       5             :  *
       6             :  * GNU Zebra is free software; you can redistribute it and/or modify it
       7             :  * under the terms of the GNU General Public License as published by the
       8             :  * Free Software Foundation; either version 2, or (at your option) any
       9             :  * later version.
      10             :  *
      11             :  * GNU Zebra is distributed in the hope that it will be useful, but
      12             :  * WITHOUT ANY WARRANTY; without even the implied warranty of
      13             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14             :  * General Public License for more details.
      15             :  *
      16             :  * You should have received a copy of the GNU General Public License along
      17             :  * with this program; see the file COPYING; if not, write to the Free Software
      18             :  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
      19             :  */
      20             : 
      21             : #ifndef _ZEBRA_RIP_H
      22             : #define _ZEBRA_RIP_H
      23             : 
      24             : #include "hook.h"
      25             : #include "nexthop.h"
      26             : #include "distribute.h"
      27             : #include "memory.h"
      28             : 
      29             : /* RIP version number. */
      30             : #define RIPv1                            1
      31             : #define RIPv2                            2
      32             : /* N.B. stuff will break if
      33             :         (RIPv1 != RI_RIP_VERSION_1) || (RIPv2 != RI_RIP_VERSION_2) */
      34             : 
      35             : 
      36             : /* RIP command list. */
      37             : #define RIP_REQUEST                      1
      38             : #define RIP_RESPONSE                     2
      39             : #define RIP_TRACEON                      3      /* Obsolete */
      40             : #define RIP_TRACEOFF                     4      /* Obsolete */
      41             : #define RIP_POLL                         5
      42             : #define RIP_POLL_ENTRY                   6
      43             : #define RIP_COMMAND_MAX                  7
      44             : 
      45             : /* RIP metric infinity value.*/
      46             : #define RIP_METRIC_INFINITY             16
      47             : 
      48             : /* Normal RIP packet min and max size. */
      49             : #define RIP_PACKET_MINSIZ                4
      50             : #define RIP_PACKET_MAXSIZ              512
      51             : 
      52             : #define RIP_HEADER_SIZE                  4
      53             : #define RIP_RTE_SIZE                    20
      54             : 
      55             : /* Max count of routing table entry in one rip packet. */
      56             : #define RIP_MAX_RTE   ((RIP_PACKET_MAXSIZ - RIP_HEADER_SIZE) / RIP_RTE_SIZE)
      57             : 
      58             : /* RIP version 2 multicast address. */
      59             : #ifndef INADDR_RIP_GROUP
      60             : #define INADDR_RIP_GROUP        0xe0000009    /* 224.0.0.9 */
      61             : #endif
      62             : 
      63             : /* RIP peer timeout value. */
      64             : #define RIP_PEER_TIMER_DEFAULT         180
      65             : 
      66             : /* RIP port number. */
      67             : #define RIP_PORT_DEFAULT               520
      68             : #define RIP_VTY_PORT                  2602
      69             : 
      70             : /* Default configuration file name. */
      71             : #define RIPD_DEFAULT_CONFIG    "ripd.conf"
      72             : 
      73             : /* RIP route types. */
      74             : #define RIP_ROUTE_RTE                    0
      75             : #define RIP_ROUTE_STATIC                 1
      76             : #define RIP_ROUTE_DEFAULT                2
      77             : #define RIP_ROUTE_REDISTRIBUTE           3
      78             : #define RIP_ROUTE_INTERFACE              4
      79             : 
      80             : /* RIPv2 special RTE family types */
      81             : #define RIP_FAMILY_AUTH                  0xffff
      82             : 
      83             : /* RIPv2 authentication types, for RIP_FAMILY_AUTH RTE's */
      84             : #define RIP_NO_AUTH                0
      85             : #define RIP_AUTH_DATA              1
      86             : #define RIP_AUTH_SIMPLE_PASSWORD   2
      87             : #define RIP_AUTH_MD5               3
      88             : 
      89             : /* RIPv2 Simple authentication */
      90             : #define RIP_AUTH_SIMPLE_SIZE            16
      91             : 
      92             : /* RIPv2 MD5 authentication. */
      93             : #define RIP_AUTH_MD5_SIZE               16
      94             : #define RIP_AUTH_MD5_COMPAT_SIZE        RIP_RTE_SIZE
      95             : 
      96             : /* YANG paths */
      97             : #define RIP_INSTANCE    "/frr-ripd:ripd/instance"
      98             : #define RIP_IFACE       "/frr-interface:lib/interface/frr-ripd:rip"
      99             : 
     100             : DECLARE_MGROUP(RIPD);
     101             : 
     102             : /* RIP structure. */
     103             : struct rip {
     104             :         RB_ENTRY(rip) entry;
     105             : 
     106             :         /* VRF this routing instance is associated with. */
     107             :         char *vrf_name;
     108             : 
     109             :         /* VRF backpointer (might be NULL if the VRF doesn't exist). */
     110             :         struct vrf *vrf;
     111             : 
     112             :         /* Status of the routing instance. */
     113             :         bool enabled;
     114             : 
     115             :         /* RIP socket. */
     116             :         int sock;
     117             : 
     118             :         /* Default version of rip instance. */
     119             :         int version_send; /* version 1 or 2 (but not both) */
     120             :         int version_recv; /* version 1 or 2 or both */
     121             : 
     122             :         /* Output buffer of RIP. */
     123             :         struct stream *obuf;
     124             : 
     125             :         /* RIP routing information base. */
     126             :         struct route_table *table;
     127             : 
     128             :         /* RIP static neighbors. */
     129             :         struct route_table *neighbor;
     130             : 
     131             :         /* Linked list of RIP peers. */
     132             :         struct list *peer_list;
     133             : 
     134             :         /* RIP threads. */
     135             :         struct thread *t_read;
     136             : 
     137             :         /* Update and garbage timer. */
     138             :         struct thread *t_update;
     139             : 
     140             :         /* Triggered update hack. */
     141             :         int trigger;
     142             :         struct thread *t_triggered_update;
     143             :         struct thread *t_triggered_interval;
     144             : 
     145             :         /* RIP timer values. */
     146             :         uint32_t update_time;
     147             :         uint32_t timeout_time;
     148             :         uint32_t garbage_time;
     149             : 
     150             :         /* RIP default metric. */
     151             :         uint8_t default_metric;
     152             : 
     153             :         /* RIP default distance. */
     154             :         uint8_t distance;
     155             :         struct route_table *distance_table;
     156             : 
     157             :         /* RIP ECMP flag */
     158             :         bool ecmp;
     159             : 
     160             :         /* Are we in passive-interface default mode? */
     161             :         bool passive_default;
     162             : 
     163             :         /* RIP enabled interfaces. */
     164             :         vector enable_interface;
     165             : 
     166             :         /* RIP enabled networks. */
     167             :         struct route_table *enable_network;
     168             : 
     169             :         /* Vector to store passive-interface name. */
     170             :         vector passive_nondefault;
     171             : 
     172             :         /* RIP offset-lists. */
     173             :         struct list *offset_list_master;
     174             : 
     175             :         /* RIP redistribute configuration. */
     176             :         struct {
     177             :                 bool enabled;
     178             :                 struct {
     179             :                         char *name;
     180             :                         struct route_map *map;
     181             :                 } route_map;
     182             :                 bool metric_config;
     183             :                 uint8_t metric;
     184             :         } redist[ZEBRA_ROUTE_MAX];
     185             : 
     186             :         /* For distribute-list container */
     187             :         struct distribute_ctx *distribute_ctx;
     188             : 
     189             :         /* For if_rmap container */
     190             :         struct if_rmap_ctx *if_rmap_ctx;
     191             : 
     192             :         /* Counters for SNMP. */
     193             :         struct {
     194             :                 /* RIP route changes. */
     195             :                 long route_changes;
     196             : 
     197             :                 /* RIP queries. */
     198             :                 long queries;
     199             :         } counters;
     200             : };
     201             : RB_HEAD(rip_instance_head, rip);
     202           6 : RB_PROTOTYPE(rip_instance_head, rip, entry, rip_instance_compare)
     203             : 
     204             : /* RIP routing table entry which belong to rip_packet. */
     205             : struct rte {
     206             :         uint16_t family;        /* Address family of this route. */
     207             :         uint16_t tag;           /* Route Tag which included in RIP2 packet. */
     208             :         struct in_addr prefix;  /* Prefix of rip route. */
     209             :         struct in_addr mask;    /* Netmask of rip route. */
     210             :         struct in_addr nexthop; /* Next hop of rip route. */
     211             :         uint32_t metric;        /* Metric value of rip route. */
     212             : };
     213             : 
     214             : /* RIP packet structure. */
     215             : struct rip_packet {
     216             :         unsigned char command; /* Command type of RIP packet. */
     217             :         unsigned char version; /* RIP version which coming from peer. */
     218             :         unsigned char pad1;    /* Padding of RIP packet header. */
     219             :         unsigned char pad2;    /* Same as above. */
     220             :         struct rte rte[1];     /* Address structure. */
     221             : };
     222             : 
     223             : /* Buffer to read RIP packet. */
     224             : union rip_buf {
     225             :         struct rip_packet rip_packet;
     226             :         char buf[RIP_PACKET_MAXSIZ];
     227             : };
     228             : 
     229             : /* RIP route information. */
     230             : struct rip_info {
     231             :         /* This route's type. */
     232             :         int type;
     233             : 
     234             :         /* Sub type. */
     235             :         int sub_type;
     236             : 
     237             :         /* RIP nexthop. */
     238             :         struct nexthop nh;
     239             :         struct in_addr from;
     240             : 
     241             :         /* Metric of this route. */
     242             :         uint32_t metric;
     243             : 
     244             :         /* External metric of this route.
     245             :            if learnt from an externalm proto */
     246             :         uint32_t external_metric;
     247             : 
     248             :         /* Tag information of this route. */
     249             :         uint16_t tag;
     250             : 
     251             : /* Flags of RIP route. */
     252             : #define RIP_RTF_FIB      1
     253             : #define RIP_RTF_CHANGED  2
     254             :         uint8_t flags;
     255             : 
     256             :         /* Garbage collect timer. */
     257             :         struct thread *t_timeout;
     258             :         struct thread *t_garbage_collect;
     259             : 
     260             :         /* Route-map futures - this variables can be changed. */
     261             :         struct in_addr nexthop_out;
     262             :         uint8_t metric_set;
     263             :         uint32_t metric_out;
     264             :         uint16_t tag_out;
     265             :         ifindex_t ifindex_out;
     266             : 
     267             :         struct route_node *rp;
     268             : 
     269             :         uint8_t distance;
     270             : };
     271             : 
     272             : typedef enum {
     273             :         RIP_NO_SPLIT_HORIZON = 0,
     274             :         RIP_SPLIT_HORIZON,
     275             :         RIP_SPLIT_HORIZON_POISONED_REVERSE
     276             : } split_horizon_policy_t;
     277             : 
     278             : /* RIP specific interface configuration. */
     279             : struct rip_interface {
     280             :         /* Parent routing instance. */
     281             :         struct rip *rip;
     282             : 
     283             :         /* RIP is enabled on this interface. */
     284             :         int enable_network;
     285             :         int enable_interface;
     286             : 
     287             :         /* RIP is running on this interface. */
     288             :         int running;
     289             : 
     290             :         /* RIP version control. */
     291             :         int ri_send;
     292             :         int ri_receive;
     293             : 
     294             :         /* RIPv2 broadcast mode */
     295             :         bool v2_broadcast;
     296             : 
     297             :         /* RIPv2 authentication type. */
     298             :         int auth_type;
     299             : 
     300             :         /* RIPv2 authentication string. */
     301             :         char *auth_str;
     302             : 
     303             :         /* RIPv2 authentication key chain. */
     304             :         char *key_chain;
     305             : 
     306             :         /* value to use for md5->auth_len */
     307             :         int md5_auth_len;
     308             : 
     309             :         /* Split horizon flag. */
     310             :         split_horizon_policy_t split_horizon;
     311             : 
     312             : /* For filter type slot. */
     313             : #define RIP_FILTER_IN  0
     314             : #define RIP_FILTER_OUT 1
     315             : #define RIP_FILTER_MAX 2
     316             : 
     317             :         /* Access-list. */
     318             :         struct access_list *list[RIP_FILTER_MAX];
     319             : 
     320             :         /* Prefix-list. */
     321             :         struct prefix_list *prefix[RIP_FILTER_MAX];
     322             : 
     323             :         /* Route-map. */
     324             :         struct route_map *routemap[RIP_FILTER_MAX];
     325             : 
     326             :         /* Wake up thread. */
     327             :         struct thread *t_wakeup;
     328             : 
     329             :         /* Interface statistics. */
     330             :         int recv_badpackets;
     331             :         int recv_badroutes;
     332             :         int sent_updates;
     333             : 
     334             :         /* Passive interface. */
     335             :         int passive;
     336             : };
     337             : 
     338             : /* RIP peer information. */
     339             : struct rip_peer {
     340             :         /* Parent routing instance. */
     341             :         struct rip *rip;
     342             : 
     343             :         /* Peer address. */
     344             :         struct in_addr addr;
     345             : 
     346             :         /* Peer RIP tag value. */
     347             :         int domain;
     348             : 
     349             :         /* Last update time. */
     350             :         time_t uptime;
     351             : 
     352             :         /* Peer RIP version. */
     353             :         uint8_t version;
     354             : 
     355             :         /* Statistics. */
     356             :         int recv_badpackets;
     357             :         int recv_badroutes;
     358             : 
     359             :         /* Timeout thread. */
     360             :         struct thread *t_timeout;
     361             : };
     362             : 
     363             : struct rip_distance {
     364             :         /* Distance value for the IP source prefix. */
     365             :         uint8_t distance;
     366             : 
     367             :         /* Name of the access-list to be matched. */
     368             :         char *access_list;
     369             : };
     370             : 
     371             : struct rip_md5_info {
     372             :         uint16_t family;
     373             :         uint16_t type;
     374             :         uint16_t packet_len;
     375             :         uint8_t keyid;
     376             :         uint8_t auth_len;
     377             :         uint32_t sequence;
     378             :         uint32_t reserv1;
     379             :         uint32_t reserv2;
     380             : };
     381             : 
     382             : struct rip_md5_data {
     383             :         uint16_t family;
     384             :         uint16_t type;
     385             :         uint8_t digest[16];
     386             : };
     387             : 
     388             : /* RIP accepet/announce methods. */
     389             : #define RI_RIP_UNSPEC                      0
     390             : #define RI_RIP_VERSION_1                   1
     391             : #define RI_RIP_VERSION_2                   2
     392             : #define RI_RIP_VERSION_1_AND_2             3
     393             : #define RI_RIP_VERSION_NONE                4
     394             : /* N.B. stuff will break if
     395             :         (RIPv1 != RI_RIP_VERSION_1) || (RIPv2 != RI_RIP_VERSION_2) */
     396             : 
     397             : /* RIP event. */
     398             : enum rip_event {
     399             :         RIP_READ,
     400             :         RIP_UPDATE_EVENT,
     401             :         RIP_TRIGGERED_UPDATE,
     402             : };
     403             : 
     404             : /* Macro for timer turn on. */
     405             : #define RIP_TIMER_ON(T,F,V) thread_add_timer (master, (F), rinfo, (V), &(T))
     406             : 
     407             : #define RIP_OFFSET_LIST_IN  0
     408             : #define RIP_OFFSET_LIST_OUT 1
     409             : #define RIP_OFFSET_LIST_MAX 2
     410             : 
     411             : struct rip_offset_list {
     412             :         /* Parent routing instance. */
     413             :         struct rip *rip;
     414             : 
     415             :         char *ifname;
     416             : 
     417             :         struct {
     418             :                 char *alist_name;
     419             :                 /* struct access_list *alist; */
     420             :                 uint8_t metric;
     421             :         } direct[RIP_OFFSET_LIST_MAX];
     422             : };
     423             : 
     424             : /* Prototypes. */
     425             : extern void rip_init(void);
     426             : extern void rip_clean(struct rip *rip);
     427             : extern void rip_clean_network(struct rip *rip);
     428             : extern void rip_interfaces_clean(struct rip *rip);
     429             : extern int rip_passive_nondefault_set(struct rip *rip, const char *ifname);
     430             : extern int rip_passive_nondefault_unset(struct rip *rip, const char *ifname);
     431             : extern void rip_passive_nondefault_clean(struct rip *rip);
     432             : extern void rip_if_init(void);
     433             : extern void rip_route_map_init(void);
     434             : extern void rip_zebra_vrf_register(struct vrf *vrf);
     435             : extern void rip_zebra_vrf_deregister(struct vrf *vrf);
     436             : extern void rip_zclient_init(struct thread_master *);
     437             : extern void rip_zclient_stop(void);
     438             : extern int if_check_address(struct rip *rip, struct in_addr addr);
     439             : extern struct rip *rip_lookup_by_vrf_id(vrf_id_t vrf_id);
     440             : extern struct rip *rip_lookup_by_vrf_name(const char *vrf_name);
     441             : extern struct rip *rip_create(const char *vrf_name, struct vrf *vrf,
     442             :                               int socket);
     443             : 
     444             : extern int rip_request_send(struct sockaddr_in *, struct interface *, uint8_t,
     445             :                             struct connected *);
     446             : extern int rip_neighbor_lookup(struct rip *rip, struct sockaddr_in *from);
     447             : extern int rip_neighbor_add(struct rip *rip, struct prefix_ipv4 *p);
     448             : extern int rip_neighbor_delete(struct rip *rip, struct prefix_ipv4 *p);
     449             : 
     450             : extern int rip_enable_network_add(struct rip *rip, struct prefix *p);
     451             : extern int rip_enable_network_delete(struct rip *rip, struct prefix *p);
     452             : extern int rip_enable_if_add(struct rip *rip, const char *ifname);
     453             : extern int rip_enable_if_delete(struct rip *rip, const char *ifname);
     454             : 
     455             : extern void rip_event(struct rip *rip, enum rip_event event, int sock);
     456             : extern void rip_ecmp_disable(struct rip *rip);
     457             : 
     458             : extern int rip_create_socket(struct vrf *vrf);
     459             : 
     460             : extern int rip_redistribute_check(struct rip *rip, int type);
     461             : extern void rip_redistribute_conf_update(struct rip *rip, int type);
     462             : extern void rip_redistribute_conf_delete(struct rip *rip, int type);
     463             : extern void rip_redistribute_add(struct rip *rip, int type, int sub_type,
     464             :                                  struct prefix_ipv4 *p, struct nexthop *nh,
     465             :                                  unsigned int metric, unsigned char distance,
     466             :                                  route_tag_t tag);
     467             : extern void rip_redistribute_delete(struct rip *rip, int type, int sub_type,
     468             :                                     struct prefix_ipv4 *p, ifindex_t ifindex);
     469             : extern void rip_redistribute_withdraw(struct rip *rip, int type);
     470             : extern void rip_zebra_ipv4_add(struct rip *rip, struct route_node *rp);
     471             : extern void rip_zebra_ipv4_delete(struct rip *rip, struct route_node *rp);
     472             : extern void rip_interface_multicast_set(int, struct connected *);
     473             : extern void rip_distribute_update_interface(struct interface *);
     474             : extern void rip_if_rmap_update_interface(struct interface *ifp);
     475             : 
     476             : extern int rip_show_network_config(struct vty *vty, struct rip *rip);
     477             : extern void rip_show_redistribute_config(struct vty *vty, struct rip *rip);
     478             : 
     479             : extern void rip_peer_update(struct rip *rip, struct sockaddr_in *from,
     480             :                             uint8_t version);
     481             : extern void rip_peer_bad_route(struct rip *rip, struct sockaddr_in *from);
     482             : extern void rip_peer_bad_packet(struct rip *rip, struct sockaddr_in *from);
     483             : extern void rip_peer_display(struct vty *vty, struct rip *rip);
     484             : extern struct rip_peer *rip_peer_lookup(struct rip *rip, struct in_addr *addr);
     485             : extern struct rip_peer *rip_peer_lookup_next(struct rip *rip,
     486             :                                              struct in_addr *addr);
     487             : extern int rip_peer_list_cmp(struct rip_peer *p1, struct rip_peer *p2);
     488             : extern void rip_peer_list_del(void *arg);
     489             : 
     490             : extern void rip_info_free(struct rip_info *);
     491             : extern struct rip *rip_info_get_instance(const struct rip_info *rinfo);
     492             : extern struct rip_distance *rip_distance_new(void);
     493             : extern void rip_distance_free(struct rip_distance *rdistance);
     494             : extern uint8_t rip_distance_apply(struct rip *rip, struct rip_info *rinfo);
     495             : extern void rip_redistribute_enable(struct rip *rip);
     496             : extern void rip_redistribute_disable(struct rip *rip);
     497             : 
     498             : extern int rip_route_rte(struct rip_info *rinfo);
     499             : extern struct rip_info *rip_ecmp_add(struct rip *rip,
     500             :                                      struct rip_info *rinfo_new);
     501             : extern struct rip_info *rip_ecmp_replace(struct rip *rip,
     502             :                                          struct rip_info *rinfo_new);
     503             : extern struct rip_info *rip_ecmp_delete(struct rip *rip,
     504             :                                         struct rip_info *rinfo);
     505             : 
     506             : extern struct rip_offset_list *rip_offset_list_new(struct rip *rip,
     507             :                                                    const char *ifname);
     508             : extern void offset_list_del(struct rip_offset_list *offset);
     509             : extern void offset_list_free(struct rip_offset_list *offset);
     510             : extern struct rip_offset_list *rip_offset_list_lookup(struct rip *rip,
     511             :                                                       const char *ifname);
     512             : extern int rip_offset_list_apply_in(struct prefix_ipv4 *, struct interface *,
     513             :                                     uint32_t *);
     514             : extern int rip_offset_list_apply_out(struct prefix_ipv4 *, struct interface *,
     515             :                                      uint32_t *);
     516             : extern int offset_list_cmp(struct rip_offset_list *o1,
     517             :                            struct rip_offset_list *o2);
     518             : 
     519             : extern void rip_vrf_init(void);
     520             : extern void rip_vrf_terminate(void);
     521             : extern void rip_cli_init(void);
     522             : 
     523             : extern struct zebra_privs_t ripd_privs;
     524             : extern struct rip_instance_head rip_instances;
     525             : 
     526             : /* Master thread structure. */
     527             : extern struct thread_master *master;
     528             : 
     529             : DECLARE_HOOK(rip_ifaddr_add, (struct connected * ifc), (ifc));
     530             : DECLARE_HOOK(rip_ifaddr_del, (struct connected * ifc), (ifc));
     531             : 
     532             : #endif /* _ZEBRA_RIP_H */

Generated by: LCOV version v1.16-topotato