back to topotato report
topotato coverage report
Current view: top level - lib - if.h (source / functions) Hit Total Coverage
Test: test_rip.py::RIPBasic Lines: 4 4 100.0 %
Date: 2023-02-24 18:39:46 Functions: 0 0 -

          Line data    Source code
       1             : /* Interface related header.
       2             :  * Copyright (C) 1997, 98, 99 Kunihiro Ishiguro
       3             :  *
       4             :  * This file is part of GNU Zebra.
       5             :  *
       6             :  * GNU Zebra is free software; you can redistribute it and/or modify
       7             :  * it under the terms of the GNU General Public License as published
       8             :  * by the Free Software Foundation; either version 2, or (at your
       9             :  * option) any 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_IF_H
      22             : #define _ZEBRA_IF_H
      23             : 
      24             : #include "zebra.h"
      25             : #include "linklist.h"
      26             : #include "memory.h"
      27             : #include "qobj.h"
      28             : #include "hook.h"
      29             : 
      30             : #ifdef __cplusplus
      31             : extern "C" {
      32             : #endif
      33             : 
      34             : DECLARE_MTYPE(CONNECTED_LABEL);
      35             : 
      36             : /* Interface link-layer type, if known. Derived from:
      37             :  *
      38             :  * net/if_arp.h on various platforms - Linux especially.
      39             :  * http://www.iana.org/assignments/arp-parameters/arp-parameters.xhtml
      40             :  *
      41             :  * Some of the more obviously defunct technologies left out.
      42             :  */
      43             : enum zebra_link_type {
      44             :         ZEBRA_LLT_UNKNOWN = 0,
      45             :         ZEBRA_LLT_ETHER,
      46             :         ZEBRA_LLT_EETHER,
      47             :         ZEBRA_LLT_AX25,
      48             :         ZEBRA_LLT_PRONET,
      49             :         ZEBRA_LLT_IEEE802,
      50             :         ZEBRA_LLT_ARCNET,
      51             :         ZEBRA_LLT_APPLETLK,
      52             :         ZEBRA_LLT_DLCI,
      53             :         ZEBRA_LLT_ATM,
      54             :         ZEBRA_LLT_METRICOM,
      55             :         ZEBRA_LLT_IEEE1394,
      56             :         ZEBRA_LLT_EUI64,
      57             :         ZEBRA_LLT_INFINIBAND,
      58             :         ZEBRA_LLT_SLIP,
      59             :         ZEBRA_LLT_CSLIP,
      60             :         ZEBRA_LLT_SLIP6,
      61             :         ZEBRA_LLT_CSLIP6,
      62             :         ZEBRA_LLT_RSRVD,
      63             :         ZEBRA_LLT_ADAPT,
      64             :         ZEBRA_LLT_ROSE,
      65             :         ZEBRA_LLT_X25,
      66             :         ZEBRA_LLT_PPP,
      67             :         ZEBRA_LLT_CHDLC,
      68             :         ZEBRA_LLT_LAPB,
      69             :         ZEBRA_LLT_RAWHDLC,
      70             :         ZEBRA_LLT_IPIP,
      71             :         ZEBRA_LLT_IPIP6,
      72             :         ZEBRA_LLT_FRAD,
      73             :         ZEBRA_LLT_SKIP,
      74             :         ZEBRA_LLT_LOOPBACK,
      75             :         ZEBRA_LLT_LOCALTLK,
      76             :         ZEBRA_LLT_FDDI,
      77             :         ZEBRA_LLT_SIT,
      78             :         ZEBRA_LLT_IPDDP,
      79             :         ZEBRA_LLT_IPGRE,
      80             :         ZEBRA_LLT_IP6GRE,
      81             :         ZEBRA_LLT_PIMREG,
      82             :         ZEBRA_LLT_HIPPI,
      83             :         ZEBRA_LLT_ECONET,
      84             :         ZEBRA_LLT_IRDA,
      85             :         ZEBRA_LLT_FCPP,
      86             :         ZEBRA_LLT_FCAL,
      87             :         ZEBRA_LLT_FCPL,
      88             :         ZEBRA_LLT_FCFABRIC,
      89             :         ZEBRA_LLT_IEEE802_TR,
      90             :         ZEBRA_LLT_IEEE80211,
      91             :         ZEBRA_LLT_IEEE80211_RADIOTAP,
      92             :         ZEBRA_LLT_IEEE802154,
      93             :         ZEBRA_LLT_IEEE802154_PHY,
      94             : };
      95             : 
      96             : /*
      97             :   Interface name length.
      98             : 
      99             :    Linux define value in /usr/include/linux/if.h.
     100             :    #define IFNAMSIZ        16
     101             : 
     102             :    FreeBSD define value in /usr/include/net/if.h.
     103             :    #define IFNAMSIZ        16
     104             : */
     105             : 
     106             : #define INTERFACE_NAMSIZ      IFNAMSIZ
     107             : #define INTERFACE_HWADDR_MAX  20
     108             : 
     109             : typedef signed int ifindex_t;
     110             : 
     111             : #ifdef HAVE_PROC_NET_DEV
     112             : struct if_stats {
     113             :         unsigned long rx_packets;   /* total packets received       */
     114             :         unsigned long tx_packets;   /* total packets transmitted    */
     115             :         unsigned long rx_bytes;     /* total bytes received         */
     116             :         unsigned long tx_bytes;     /* total bytes transmitted      */
     117             :         unsigned long rx_errors;    /* bad packets received         */
     118             :         unsigned long tx_errors;    /* packet transmit problems     */
     119             :         unsigned long rx_dropped;   /* no space in linux buffers    */
     120             :         unsigned long tx_dropped;   /* no space available in linux  */
     121             :         unsigned long rx_multicast; /* multicast packets received   */
     122             :         unsigned long rx_compressed;
     123             :         unsigned long tx_compressed;
     124             :         unsigned long collisions;
     125             : 
     126             :         /* detailed rx_errors: */
     127             :         unsigned long rx_length_errors;
     128             :         unsigned long rx_over_errors;   /* receiver ring buff overflow  */
     129             :         unsigned long rx_crc_errors;    /* recved pkt with crc error    */
     130             :         unsigned long rx_frame_errors;  /* recv'd frame alignment error */
     131             :         unsigned long rx_fifo_errors;   /* recv'r fifo overrun          */
     132             :         unsigned long rx_missed_errors; /* receiver missed packet     */
     133             :         /* detailed tx_errors */
     134             :         unsigned long tx_aborted_errors;
     135             :         unsigned long tx_carrier_errors;
     136             :         unsigned long tx_fifo_errors;
     137             :         unsigned long tx_heartbeat_errors;
     138             :         unsigned long tx_window_errors;
     139             : };
     140             : #endif /* HAVE_PROC_NET_DEV */
     141             : 
     142             : /* Here are "non-official" architectural constants. */
     143             : #define TE_EXT_MASK             0x0FFFFFFF
     144             : #define TE_EXT_ANORMAL          0x80000000
     145             : #define LOSS_PRECISION          0.000003
     146             : /* TE_MEGA_BIT and TE_BYTE are utilized to convert TE bandwidth */
     147             : #define TE_MEGA_BIT             1000000
     148             : #define TE_BYTE                 8
     149             : /* Default TE bandwidth when no value in config.
     150             :  * The value is in Mbps (will be multiplied by TE_BYTE)
     151             :  */
     152             : #define DEFAULT_BANDWIDTH 10
     153             : #define MAX_CLASS_TYPE          8
     154             : #define MAX_PKT_LOSS            50.331642
     155             : 
     156             : /*
     157             :  * Link Parameters Status:
     158             :  *  equal to 0: unset
     159             :  *  different from 0: set
     160             :  */
     161             : #define LP_UNSET                0x0000
     162             : #define LP_TE_METRIC            0x0001
     163             : #define LP_MAX_BW               0x0002
     164             : #define LP_MAX_RSV_BW           0x0004
     165             : #define LP_UNRSV_BW             0x0008
     166             : #define LP_ADM_GRP              0x0010
     167             : #define LP_RMT_AS               0x0020
     168             : #define LP_DELAY                0x0040
     169             : #define LP_MM_DELAY             0x0080
     170             : #define LP_DELAY_VAR            0x0100
     171             : #define LP_PKT_LOSS             0x0200
     172             : #define LP_RES_BW               0x0400
     173             : #define LP_AVA_BW               0x0800
     174             : #define LP_USE_BW               0x1000
     175             : 
     176             : #define IS_PARAM_UNSET(lp, st) !(lp->lp_status & st)
     177             : #define IS_PARAM_SET(lp, st) (lp->lp_status & st)
     178             : #define IS_LINK_PARAMS_SET(lp) (lp->lp_status != LP_UNSET)
     179             : 
     180             : #define SET_PARAM(lp, st) (lp->lp_status) |= (st)
     181             : #define UNSET_PARAM(lp, st) (lp->lp_status) &= ~(st)
     182             : #define RESET_LINK_PARAM(lp) (lp->lp_status = LP_UNSET)
     183             : 
     184             : /* Link Parameters for Traffic Engineering */
     185             : struct if_link_params {
     186             :         uint32_t lp_status; /* Status of Link Parameters: */
     187             :         uint32_t te_metric; /* Traffic Engineering metric */
     188             :         float default_bw;
     189             :         float max_bw;                   /* Maximum Bandwidth */
     190             :         float max_rsv_bw;               /* Maximum Reservable Bandwidth */
     191             :         float unrsv_bw[MAX_CLASS_TYPE]; /* Unreserved Bandwidth per Class Type
     192             :                                            (8) */
     193             :         uint32_t admin_grp;             /* Administrative group */
     194             :         uint32_t rmt_as;                /* Remote AS number */
     195             :         struct in_addr rmt_ip;          /* Remote IP address */
     196             :         uint32_t av_delay;              /* Link Average Delay */
     197             :         uint32_t min_delay;             /* Link Min Delay */
     198             :         uint32_t max_delay;             /* Link Max Delay */
     199             :         uint32_t delay_var;             /* Link Delay Variation */
     200             :         float pkt_loss;                 /* Link Packet Loss */
     201             :         float res_bw;                   /* Residual Bandwidth */
     202             :         float ava_bw;                   /* Available Bandwidth */
     203             :         float use_bw;                   /* Utilized Bandwidth */
     204             : };
     205             : 
     206             : #define INTERFACE_LINK_PARAMS_SIZE   sizeof(struct if_link_params)
     207             : #define HAS_LINK_PARAMS(ifp)  ((ifp)->link_params != NULL)
     208             : 
     209             : /* Interface structure */
     210             : struct interface {
     211             :         RB_ENTRY(interface) name_entry, index_entry;
     212             : 
     213             :         /* Interface name.  This should probably never be changed after the
     214             :            interface is created, because the configuration info for this
     215             :            interface
     216             :            is associated with this structure.  For that reason, the interface
     217             :            should also never be deleted (to avoid losing configuration info).
     218             :            To delete, just set ifindex to IFINDEX_INTERNAL to indicate that the
     219             :            interface does not exist in the kernel.
     220             :          */
     221             :         char name[INTERFACE_NAMSIZ];
     222             : 
     223             :         /* Interface index (should be IFINDEX_INTERNAL for non-kernel or
     224             :            deleted interfaces).
     225             :            WARNING: the ifindex needs to be changed using the if_set_index()
     226             :            function. Failure to respect this will cause corruption in the data
     227             :            structure used to store the interfaces and if_lookup_by_index() will
     228             :            not work as expected.
     229             :          */
     230             :         ifindex_t ifindex;
     231             :         ifindex_t oldifindex;
     232             : 
     233             :         /*
     234             :          * ifindex of parent interface, if any
     235             :          */
     236             :         ifindex_t link_ifindex;
     237             : #define IFINDEX_INTERNAL        0
     238             : 
     239             :         /* Zebra internal interface status */
     240             :         uint8_t status;
     241             : #define ZEBRA_INTERFACE_ACTIVE     (1 << 0)
     242             : #define ZEBRA_INTERFACE_SUB        (1 << 1)
     243             : #define ZEBRA_INTERFACE_LINKDETECTION (1 << 2)
     244             : #define ZEBRA_INTERFACE_VRF_LOOPBACK (1 << 3)
     245             : 
     246             :         /* Interface flags. */
     247             :         uint64_t flags;
     248             : 
     249             :         /* Interface metric */
     250             :         uint32_t metric;
     251             : 
     252             :         /* Interface Speed in Mb/s */
     253             :         uint32_t speed;
     254             : 
     255             :         /* Interface MTU. */
     256             :         unsigned int mtu; /* IPv4 MTU */
     257             :         unsigned int
     258             :                 mtu6; /* IPv6 MTU - probably, but not necessarily same as mtu
     259             :                        */
     260             : 
     261             :         /* Link-layer information and hardware address */
     262             :         enum zebra_link_type ll_type;
     263             :         uint8_t hw_addr[INTERFACE_HWADDR_MAX];
     264             :         int hw_addr_len;
     265             : 
     266             :         /* interface bandwidth, kbits */
     267             :         unsigned int bandwidth;
     268             : 
     269             :         /* Link parameters for Traffic Engineering */
     270             :         struct if_link_params *link_params;
     271             : 
     272             :         /* description of the interface. */
     273             :         char *desc;
     274             : 
     275             :         /* Distribute list. */
     276             :         void *distribute_in;
     277             :         void *distribute_out;
     278             : 
     279             :         /* Connected address list. */
     280             :         struct list *connected;
     281             : 
     282             :         /* Neighbor connected address list. */
     283             :         struct list *nbr_connected;
     284             : 
     285             :         /* Daemon specific interface data pointer. */
     286             :         void *info;
     287             : 
     288             :         char ptm_enable; /* Should we look at ptm_status ? */
     289             :         char ptm_status;
     290             : 
     291             : /* Statistics fileds. */
     292             : #ifdef HAVE_PROC_NET_DEV
     293             :         struct if_stats stats;
     294             : #endif /* HAVE_PROC_NET_DEV */
     295             : #ifdef HAVE_NET_RT_IFLIST
     296             :         struct if_data stats;
     297             : #endif /* HAVE_NET_RT_IFLIST */
     298             : 
     299             :         struct route_node *node;
     300             : 
     301             :         struct vrf *vrf;
     302             : 
     303             :         /*
     304             :          * Has the end users entered `interface XXXX` from the cli in some
     305             :          * fashion?
     306             :          */
     307             :         bool configured;
     308             : 
     309             :         QOBJ_FIELDS;
     310             : };
     311             : 
     312             : RB_HEAD(if_name_head, interface);
     313         714 : RB_PROTOTYPE(if_name_head, interface, name_entry, if_cmp_func)
     314             : RB_HEAD(if_index_head, interface);
     315         390 : RB_PROTOTYPE(if_index_head, interface, index_entry, if_cmp_index_func)
     316             : DECLARE_QOBJ_TYPE(interface);
     317             : 
     318             : #define IFNAME_RB_INSERT(v, ifp)                                                      \
     319             :         ({                                                                            \
     320             :                 struct interface *_iz =                                               \
     321             :                         RB_INSERT(if_name_head, &v->ifaces_by_name, (ifp));           \
     322             :                 if (_iz)                                                              \
     323             :                         flog_err(                                                     \
     324             :                                 EC_LIB_INTERFACE,                                     \
     325             :                                 "%s(%s): corruption detected -- interface with this " \
     326             :                                 "name exists already in VRF %s!",                     \
     327             :                                 __func__, (ifp)->name, (ifp)->vrf->name);             \
     328             :                 _iz;                                                                  \
     329             :         })
     330             : 
     331             : #define IFNAME_RB_REMOVE(v, ifp)                                                      \
     332             :         ({                                                                            \
     333             :                 struct interface *_iz =                                               \
     334             :                         RB_REMOVE(if_name_head, &v->ifaces_by_name, (ifp));           \
     335             :                 if (_iz == NULL)                                                      \
     336             :                         flog_err(                                                     \
     337             :                                 EC_LIB_INTERFACE,                                     \
     338             :                                 "%s(%s): corruption detected -- interface with this " \
     339             :                                 "name doesn't exist in VRF %s!",                      \
     340             :                                 __func__, (ifp)->name, (ifp)->vrf->name);             \
     341             :                 _iz;                                                                  \
     342             :         })
     343             : 
     344             : 
     345             : #define IFINDEX_RB_INSERT(v, ifp)                                                     \
     346             :         ({                                                                            \
     347             :                 struct interface *_iz =                                               \
     348             :                         RB_INSERT(if_index_head, &v->ifaces_by_index, (ifp));         \
     349             :                 if (_iz)                                                              \
     350             :                         flog_err(                                                     \
     351             :                                 EC_LIB_INTERFACE,                                     \
     352             :                                 "%s(%u): corruption detected -- interface with this " \
     353             :                                 "ifindex exists already in VRF %s!",                  \
     354             :                                 __func__, (ifp)->ifindex, (ifp)->vrf->name);          \
     355             :                 _iz;                                                                  \
     356             :         })
     357             : 
     358             : #define IFINDEX_RB_REMOVE(v, ifp)                                                     \
     359             :         ({                                                                            \
     360             :                 struct interface *_iz =                                               \
     361             :                         RB_REMOVE(if_index_head, &v->ifaces_by_index, (ifp));         \
     362             :                 if (_iz == NULL)                                                      \
     363             :                         flog_err(                                                     \
     364             :                                 EC_LIB_INTERFACE,                                     \
     365             :                                 "%s(%u): corruption detected -- interface with this " \
     366             :                                 "ifindex doesn't exist in VRF %s!",                   \
     367             :                                 __func__, (ifp)->ifindex, (ifp)->vrf->name);          \
     368             :                 _iz;                                                                  \
     369             :         })
     370             : 
     371             : #define FOR_ALL_INTERFACES(vrf, ifp)                                           \
     372             :         if (vrf)                                                               \
     373             :                 RB_FOREACH (ifp, if_name_head, &vrf->ifaces_by_name)
     374             : 
     375             : #define FOR_ALL_INTERFACES_ADDRESSES(ifp, connected, node)                     \
     376             :         for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected))
     377             : 
     378             : /* called from the library code whenever interfaces are created/deleted
     379             :  * note: interfaces may not be fully realized at that point; also they
     380             :  * may not exist in the system (ifindex = IFINDEX_INTERNAL)
     381             :  *
     382             :  * priority values are important here, daemons should be at 0 while modules
     383             :  * can use 1000+ so they run after the daemon has initialised daemon-specific
     384             :  * interface data
     385             :  */
     386             : DECLARE_HOOK(if_add, (struct interface * ifp), (ifp));
     387             : DECLARE_KOOH(if_del, (struct interface * ifp), (ifp));
     388             : 
     389             : #define METRIC_MAX (~0)
     390             : 
     391             : /* Connected address structure. */
     392             : struct connected {
     393             :         /* Attached interface. */
     394             :         struct interface *ifp;
     395             : 
     396             :         /* Flags for configuration. */
     397             :         uint8_t conf;
     398             : #define ZEBRA_IFC_REAL         (1 << 0)
     399             : #define ZEBRA_IFC_CONFIGURED   (1 << 1)
     400             : #define ZEBRA_IFC_QUEUED       (1 << 2)
     401             : #define ZEBRA_IFC_DOWN         (1 << 3)
     402             :         /*
     403             :            The ZEBRA_IFC_REAL flag should be set if and only if this address
     404             :            exists in the kernel and is actually usable. (A case where it exists
     405             :            but is not yet usable would be IPv6 with DAD)
     406             :            The ZEBRA_IFC_CONFIGURED flag should be set if and only if this
     407             :            address was configured by the user from inside frr.
     408             :            The ZEBRA_IFC_QUEUED flag should be set if and only if the address
     409             :            exists in the kernel. It may and should be set although the
     410             :            address might not be usable yet. (compare with ZEBRA_IFC_REAL)
     411             :            The ZEBRA_IFC_DOWN flag is used to record that an address is
     412             :            present, but down/unavailable.
     413             :          */
     414             : 
     415             :         /* Flags for connected address. */
     416             :         uint8_t flags;
     417             : #define ZEBRA_IFA_SECONDARY    (1 << 0)
     418             : #define ZEBRA_IFA_PEER         (1 << 1)
     419             : #define ZEBRA_IFA_UNNUMBERED   (1 << 2)
     420             :         /* N.B. the ZEBRA_IFA_PEER flag should be set if and only if
     421             :            a peer address has been configured.  If this flag is set,
     422             :            the destination field must contain the peer address.
     423             :          */
     424             : 
     425             :         /* Address of connected network. */
     426             :         struct prefix *address;
     427             : 
     428             :         /* Peer address, if ZEBRA_IFA_PEER is set, otherwise NULL */
     429             :         struct prefix *destination;
     430             : 
     431             :         /* Label for Linux 2.2.X and upper. */
     432             :         char *label;
     433             : 
     434             :         /*
     435             :          * Used for setting the connected route's cost. If the metric
     436             :          * here is set to METRIC_MAX the connected route falls back to
     437             :          * "struct interface"
     438             :          */
     439             :         uint32_t metric;
     440             : };
     441             : 
     442             : /* Nbr Connected address structure. */
     443             : struct nbr_connected {
     444             :         /* Attached interface. */
     445             :         struct interface *ifp;
     446             : 
     447             :         /* Address of connected network. */
     448             :         struct prefix *address;
     449             : };
     450             : 
     451             : /* Does the destination field contain a peer address? */
     452             : #define CONNECTED_PEER(C) CHECK_FLAG((C)->flags, ZEBRA_IFA_PEER)
     453             : 
     454             : /* Prefix to insert into the RIB */
     455             : #define CONNECTED_PREFIX(C)                                                    \
     456             :         (CONNECTED_PEER(C) ? (C)->destination : (C)->address)
     457             : 
     458             : /* Identifying address.  We guess that if there's a peer address, but the
     459             :    local address is in the same prefix, then the local address may be unique. */
     460             : #define CONNECTED_ID(C)                                                        \
     461             :         ((CONNECTED_PEER(C) && !prefix_match((C)->destination, (C)->address))  \
     462             :                  ? (C)->destination                                            \
     463             :                  : (C)->address)
     464             : 
     465             : /* There are some interface flags which are only supported by some
     466             :    operating system. */
     467             : 
     468             : #ifndef IFF_NOTRAILERS
     469             : #define IFF_NOTRAILERS 0x0
     470             : #endif /* IFF_NOTRAILERS */
     471             : #ifndef IFF_OACTIVE
     472             : #define IFF_OACTIVE 0x0
     473             : #endif /* IFF_OACTIVE */
     474             : #ifndef IFF_SIMPLEX
     475             : #define IFF_SIMPLEX 0x0
     476             : #endif /* IFF_SIMPLEX */
     477             : #ifndef IFF_LINK0
     478             : #define IFF_LINK0 0x0
     479             : #endif /* IFF_LINK0 */
     480             : #ifndef IFF_LINK1
     481             : #define IFF_LINK1 0x0
     482             : #endif /* IFF_LINK1 */
     483             : #ifndef IFF_LINK2
     484             : #define IFF_LINK2 0x0
     485             : #endif /* IFF_LINK2 */
     486             : #ifndef IFF_NOXMIT
     487             : #define IFF_NOXMIT 0x0
     488             : #endif /* IFF_NOXMIT */
     489             : #ifndef IFF_NORTEXCH
     490             : #define IFF_NORTEXCH 0x0
     491             : #endif /* IFF_NORTEXCH */
     492             : #ifndef IFF_IPV4
     493             : #define IFF_IPV4 0x0
     494             : #endif /* IFF_IPV4 */
     495             : #ifndef IFF_IPV6
     496             : #define IFF_IPV6 0x0
     497             : #endif /* IFF_IPV6 */
     498             : #ifndef IFF_VIRTUAL
     499             : #define IFF_VIRTUAL 0x0
     500             : #endif /* IFF_VIRTUAL */
     501             : 
     502             : /* Prototypes. */
     503             : extern int if_cmp_name_func(const char *p1, const char *p2);
     504             : 
     505             : /*
     506             :  * Passing in VRF_UNKNOWN is a valid thing to do, unless we
     507             :  * are creating a new interface.
     508             :  *
     509             :  * This is useful for vrf route-leaking.  So more than anything
     510             :  * else think before you use VRF_UNKNOWN
     511             :  */
     512             : extern void if_update_to_new_vrf(struct interface *, vrf_id_t vrf_id);
     513             : 
     514             : extern struct interface *if_lookup_by_index(ifindex_t, vrf_id_t vrf_id);
     515             : extern struct interface *if_vrf_lookup_by_index_next(ifindex_t ifindex,
     516             :                                                      vrf_id_t vrf_id);
     517             : extern struct interface *if_lookup_address_local(const void *matchaddr,
     518             :                                                  int family, vrf_id_t vrf_id);
     519             : extern struct connected *if_lookup_address(const void *matchaddr, int family,
     520             :                                            vrf_id_t vrf_id);
     521             : extern struct interface *if_lookup_prefix(const struct prefix *prefix,
     522             :                                           vrf_id_t vrf_id);
     523             : size_t if_lookup_by_hwaddr(const uint8_t *hw_addr, size_t addrsz,
     524             :                            struct interface ***result, vrf_id_t vrf_id);
     525             : 
     526           8 : static inline bool if_address_is_local(const void *matchaddr, int family,
     527             :                                        vrf_id_t vrf_id)
     528             : {
     529           8 :         return if_lookup_address_local(matchaddr, family, vrf_id) != NULL;
     530             : }
     531             : 
     532             : struct vrf;
     533             : extern struct interface *if_lookup_by_name_vrf(const char *name, struct vrf *vrf);
     534             : extern struct interface *if_lookup_by_name(const char *ifname, vrf_id_t vrf_id);
     535             : extern struct interface *if_get_vrf_loopback(vrf_id_t vrf_id);
     536             : extern struct interface *if_get_by_name(const char *ifname, vrf_id_t vrf_id,
     537             :                                         const char *vrf_name);
     538             : 
     539             : /* create a "virtual" interface - has no name, cannot be configured, cannot
     540             :  * be accessed from CLI or YANG.  Used for OSPFv3 virtual-link support.
     541             :  */
     542             : extern struct interface *if_create_virtual(struct vrf *vrf);
     543             : 
     544             : /* Sets the index and adds to index list */
     545             : extern int if_set_index(struct interface *ifp, ifindex_t ifindex);
     546             : 
     547             : /* Delete the interface, but do not free the structure, and leave it in the
     548             :    interface list.  It is often advisable to leave the pseudo interface
     549             :    structure because there may be configuration information attached. */
     550             : extern void if_delete_retain(struct interface *);
     551             : 
     552             : /* Delete and free the interface structure: calls if_delete_retain and then
     553             :    deletes it from the interface list and frees the structure. */
     554             : extern void if_delete(struct interface **ifp);
     555             : 
     556             : extern int if_is_up(const struct interface *ifp);
     557             : extern int if_is_running(const struct interface *ifp);
     558             : extern int if_is_operative(const struct interface *ifp);
     559             : extern int if_is_no_ptm_operative(const struct interface *ifp);
     560             : extern int if_is_loopback_exact(const struct interface *ifp);
     561             : extern int if_is_vrf(const struct interface *ifp);
     562             : extern bool if_is_loopback(const struct interface *ifp);
     563             : extern int if_is_broadcast(const struct interface *ifp);
     564             : extern int if_is_pointopoint(const struct interface *ifp);
     565             : extern int if_is_multicast(const struct interface *ifp);
     566             : extern void if_terminate(struct vrf *vrf);
     567             : extern void if_dump_all(void);
     568             : extern const char *if_flag_dump(unsigned long);
     569             : extern const char *if_link_type_str(enum zebra_link_type);
     570             : 
     571             : /* Please use ifindex2ifname instead of if_indextoname where possible;
     572             :    ifindex2ifname uses internal interface info, whereas if_indextoname must
     573             :    make a system call. */
     574             : extern const char *ifindex2ifname(ifindex_t, vrf_id_t vrf_id);
     575             : 
     576             : /* Please use ifname2ifindex instead of if_nametoindex where possible;
     577             :    ifname2ifindex uses internal interface info, whereas if_nametoindex must
     578             :    make a system call. */
     579             : extern ifindex_t ifname2ifindex(const char *ifname, vrf_id_t vrf_id);
     580             : 
     581             : /* Connected address functions. */
     582             : extern struct connected *connected_new(void);
     583             : extern void connected_free(struct connected **connected);
     584             : extern struct connected *
     585             : connected_add_by_prefix(struct interface *, struct prefix *, struct prefix *);
     586             : extern struct connected *connected_delete_by_prefix(struct interface *,
     587             :                                                     struct prefix *);
     588             : extern struct connected *connected_lookup_prefix(struct interface *,
     589             :                                                  const struct prefix *);
     590             : extern struct connected *connected_lookup_prefix_exact(struct interface *,
     591             :                                                        const struct prefix *);
     592             : extern unsigned int connected_count_by_family(struct interface *, int family);
     593             : extern struct nbr_connected *nbr_connected_new(void);
     594             : extern void nbr_connected_free(struct nbr_connected *);
     595             : struct nbr_connected *nbr_connected_check(struct interface *, struct prefix *);
     596             : struct connected *connected_get_linklocal(struct interface *ifp);
     597             : 
     598             : /* link parameters */
     599             : struct if_link_params *if_link_params_get(struct interface *);
     600             : struct if_link_params *if_link_params_enable(struct interface *ifp);
     601             : struct if_link_params *if_link_params_init(struct interface *ifp);
     602             : void if_link_params_free(struct interface *);
     603             : 
     604             : /* Northbound. */
     605             : struct vty;
     606             : extern void if_vty_config_start(struct vty *vty, struct interface *ifp);
     607             : extern void if_vty_config_end(struct vty *vty);
     608             : extern void if_cmd_init(int (*config_write)(struct vty *));
     609             : extern void if_cmd_init_default(void);
     610             : extern void if_zapi_callbacks(int (*create)(struct interface *ifp),
     611             :                               int (*up)(struct interface *ifp),
     612             :                               int (*down)(struct interface *ifp),
     613             :                               int (*destroy)(struct interface *ifp));
     614             : 
     615             : extern void if_new_via_zapi(struct interface *ifp);
     616             : extern void if_up_via_zapi(struct interface *ifp);
     617             : extern void if_down_via_zapi(struct interface *ifp);
     618             : extern void if_destroy_via_zapi(struct interface *ifp);
     619             : 
     620             : extern const struct frr_yang_module_info frr_interface_info;
     621             : 
     622             : #ifdef __cplusplus
     623             : }
     624             : #endif
     625             : 
     626             : #endif /* _ZEBRA_IF_H */

Generated by: LCOV version v1.16-topotato