Annotation of embedaddon/quagga/lib/if.h, revision 1.1.1.3

1.1       misho       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
                     17: along with GNU Zebra; see the file COPYING.  If not, write to the
                     18: Free Software Foundation, Inc., 59 Temple Place - Suite 330,
                     19: Boston, MA 02111-1307, USA.  */
                     20: 
                     21: #ifndef _ZEBRA_IF_H
                     22: #define _ZEBRA_IF_H
                     23: 
1.1.1.3 ! misho      24: #include "zebra.h"
1.1       misho      25: #include "linklist.h"
                     26: 
1.1.1.3 ! misho      27: /* Interface link-layer type, if known. Derived from:
        !            28:  *
        !            29:  * net/if_arp.h on various platforms - Linux especially.
        !            30:  * http://www.iana.org/assignments/arp-parameters/arp-parameters.xhtml
        !            31:  *
        !            32:  * Some of the more obviously defunct technologies left out.
        !            33:  */
        !            34: enum zebra_link_type {
        !            35:   ZEBRA_LLT_UNKNOWN = 0,
        !            36:   ZEBRA_LLT_ETHER,
        !            37:   ZEBRA_LLT_EETHER,
        !            38:   ZEBRA_LLT_AX25,
        !            39:   ZEBRA_LLT_PRONET,
        !            40:   ZEBRA_LLT_IEEE802,
        !            41:   ZEBRA_LLT_ARCNET,
        !            42:   ZEBRA_LLT_APPLETLK,
        !            43:   ZEBRA_LLT_DLCI,
        !            44:   ZEBRA_LLT_ATM,
        !            45:   ZEBRA_LLT_METRICOM,
        !            46:   ZEBRA_LLT_IEEE1394,
        !            47:   ZEBRA_LLT_EUI64,
        !            48:   ZEBRA_LLT_INFINIBAND,
        !            49:   ZEBRA_LLT_SLIP,
        !            50:   ZEBRA_LLT_CSLIP,
        !            51:   ZEBRA_LLT_SLIP6,
        !            52:   ZEBRA_LLT_CSLIP6,
        !            53:   ZEBRA_LLT_RSRVD,
        !            54:   ZEBRA_LLT_ADAPT,
        !            55:   ZEBRA_LLT_ROSE,
        !            56:   ZEBRA_LLT_X25,
        !            57:   ZEBRA_LLT_PPP,
        !            58:   ZEBRA_LLT_CHDLC,
        !            59:   ZEBRA_LLT_LAPB,
        !            60:   ZEBRA_LLT_RAWHDLC,
        !            61:   ZEBRA_LLT_IPIP,
        !            62:   ZEBRA_LLT_IPIP6,
        !            63:   ZEBRA_LLT_FRAD,
        !            64:   ZEBRA_LLT_SKIP,
        !            65:   ZEBRA_LLT_LOOPBACK,
        !            66:   ZEBRA_LLT_LOCALTLK,
        !            67:   ZEBRA_LLT_FDDI,
        !            68:   ZEBRA_LLT_SIT,
        !            69:   ZEBRA_LLT_IPDDP,
        !            70:   ZEBRA_LLT_IPGRE,
        !            71:   ZEBRA_LLT_IP6GRE,
        !            72:   ZEBRA_LLT_PIMREG,
        !            73:   ZEBRA_LLT_HIPPI,
        !            74:   ZEBRA_LLT_ECONET,
        !            75:   ZEBRA_LLT_IRDA,
        !            76:   ZEBRA_LLT_FCPP,
        !            77:   ZEBRA_LLT_FCAL,
        !            78:   ZEBRA_LLT_FCPL,
        !            79:   ZEBRA_LLT_FCFABRIC,
        !            80:   ZEBRA_LLT_IEEE802_TR,
        !            81:   ZEBRA_LLT_IEEE80211,
        !            82:   ZEBRA_LLT_IEEE80211_RADIOTAP,
        !            83:   ZEBRA_LLT_IEEE802154,
        !            84:   ZEBRA_LLT_IEEE802154_PHY,
        !            85: };
        !            86: 
1.1       misho      87: /*
                     88:   Interface name length.
                     89: 
                     90:    Linux define value in /usr/include/linux/if.h.
                     91:    #define IFNAMSIZ        16
                     92: 
                     93:    FreeBSD define value in /usr/include/net/if.h.
                     94:    #define IFNAMSIZ        16
                     95: */
                     96: 
                     97: #define INTERFACE_NAMSIZ      20
                     98: #define INTERFACE_HWADDR_MAX  20
                     99: 
1.1.1.3 ! misho     100: typedef signed int ifindex_t;
        !           101: 
1.1       misho     102: #ifdef HAVE_PROC_NET_DEV
                    103: struct if_stats
                    104: {
                    105:   unsigned long rx_packets;   /* total packets received       */
                    106:   unsigned long tx_packets;   /* total packets transmitted    */
                    107:   unsigned long rx_bytes;     /* total bytes received         */
                    108:   unsigned long tx_bytes;     /* total bytes transmitted      */
                    109:   unsigned long rx_errors;    /* bad packets received         */
                    110:   unsigned long tx_errors;    /* packet transmit problems     */
                    111:   unsigned long rx_dropped;   /* no space in linux buffers    */
                    112:   unsigned long tx_dropped;   /* no space available in linux  */
                    113:   unsigned long rx_multicast; /* multicast packets received   */
                    114:   unsigned long rx_compressed;
                    115:   unsigned long tx_compressed;
                    116:   unsigned long collisions;
                    117: 
                    118:   /* detailed rx_errors: */
                    119:   unsigned long rx_length_errors;
                    120:   unsigned long rx_over_errors;       /* receiver ring buff overflow  */
                    121:   unsigned long rx_crc_errors;        /* recved pkt with crc error    */
                    122:   unsigned long rx_frame_errors;      /* recv'd frame alignment error */
                    123:   unsigned long rx_fifo_errors;       /* recv'r fifo overrun          */
                    124:   unsigned long rx_missed_errors;     /* receiver missed packet     */
                    125:   /* detailed tx_errors */
                    126:   unsigned long tx_aborted_errors;
                    127:   unsigned long tx_carrier_errors;
                    128:   unsigned long tx_fifo_errors;
                    129:   unsigned long tx_heartbeat_errors;
                    130:   unsigned long tx_window_errors;
                    131: };
                    132: #endif /* HAVE_PROC_NET_DEV */
                    133: 
                    134: /* Interface structure */
                    135: struct interface 
                    136: {
                    137:   /* Interface name.  This should probably never be changed after the
                    138:      interface is created, because the configuration info for this interface
                    139:      is associated with this structure.  For that reason, the interface
                    140:      should also never be deleted (to avoid losing configuration info).
                    141:      To delete, just set ifindex to IFINDEX_INTERNAL to indicate that the
                    142:      interface does not exist in the kernel.
                    143:    */
                    144:   char name[INTERFACE_NAMSIZ + 1];
                    145: 
                    146:   /* Interface index (should be IFINDEX_INTERNAL for non-kernel or
                    147:      deleted interfaces). */
1.1.1.3 ! misho     148:   ifindex_t ifindex;
1.1       misho     149: #define IFINDEX_INTERNAL       0
                    150: 
                    151:   /* Zebra internal interface status */
                    152:   u_char status;
                    153: #define ZEBRA_INTERFACE_ACTIVE     (1 << 0)
                    154: #define ZEBRA_INTERFACE_SUB        (1 << 1)
                    155: #define ZEBRA_INTERFACE_LINKDETECTION (1 << 2)
                    156:   
                    157:   /* Interface flags. */
                    158:   uint64_t flags;
                    159: 
                    160:   /* Interface metric */
                    161:   int metric;
                    162: 
                    163:   /* Interface MTU. */
                    164:   unsigned int mtu;    /* IPv4 MTU */
                    165:   unsigned int mtu6;   /* IPv6 MTU - probably, but not neccessarily same as mtu */
                    166: 
1.1.1.3 ! misho     167:   /* Link-layer information and hardware address */
        !           168:   enum zebra_link_type ll_type;
1.1       misho     169:   u_char hw_addr[INTERFACE_HWADDR_MAX];
                    170:   int hw_addr_len;
                    171: 
                    172:   /* interface bandwidth, kbits */
                    173:   unsigned int bandwidth;
                    174:   
                    175:   /* description of the interface. */
                    176:   char *desc;                  
                    177: 
                    178:   /* Distribute list. */
                    179:   void *distribute_in;
                    180:   void *distribute_out;
                    181: 
                    182:   /* Connected address list. */
                    183:   struct list *connected;
                    184: 
                    185:   /* Daemon specific interface data pointer. */
                    186:   void *info;
                    187: 
                    188:   /* Statistics fileds. */
                    189: #ifdef HAVE_PROC_NET_DEV
                    190:   struct if_stats stats;
                    191: #endif /* HAVE_PROC_NET_DEV */  
                    192: #ifdef HAVE_NET_RT_IFLIST
                    193:   struct if_data stats;
                    194: #endif /* HAVE_NET_RT_IFLIST */
1.1.1.3 ! misho     195: 
        !           196:   vrf_id_t vrf_id;
1.1       misho     197: };
                    198: 
                    199: /* Connected address structure. */
                    200: struct connected
                    201: {
                    202:   /* Attached interface. */
                    203:   struct interface *ifp;
                    204: 
                    205:   /* Flags for configuration. */
                    206:   u_char conf;
                    207: #define ZEBRA_IFC_REAL         (1 << 0)
                    208: #define ZEBRA_IFC_CONFIGURED   (1 << 1)
1.1.1.3 ! misho     209: #define ZEBRA_IFC_QUEUED       (1 << 2)
1.1       misho     210:   /*
                    211:      The ZEBRA_IFC_REAL flag should be set if and only if this address
1.1.1.3 ! misho     212:      exists in the kernel and is actually usable. (A case where it exists but
        !           213:      is not yet usable would be IPv6 with DAD)
1.1       misho     214:      The ZEBRA_IFC_CONFIGURED flag should be set if and only if this address
                    215:      was configured by the user from inside quagga.
1.1.1.3 ! misho     216:      The ZEBRA_IFC_QUEUED flag should be set if and only if the address exists
        !           217:      in the kernel. It may and should be set although the address might not be
        !           218:      usable yet. (compare with ZEBRA_IFC_REAL)
1.1       misho     219:    */
                    220: 
                    221:   /* Flags for connected address. */
                    222:   u_char flags;
                    223: #define ZEBRA_IFA_SECONDARY    (1 << 0)
                    224: #define ZEBRA_IFA_PEER         (1 << 1)
                    225:   /* N.B. the ZEBRA_IFA_PEER flag should be set if and only if
                    226:      a peer address has been configured.  If this flag is set,
                    227:      the destination field must contain the peer address.  
                    228:      Otherwise, if this flag is not set, the destination address
                    229:      will either contain a broadcast address or be NULL.
                    230:    */
                    231: 
                    232:   /* Address of connected network. */
                    233:   struct prefix *address;
                    234: 
                    235:   /* Peer or Broadcast address, depending on whether ZEBRA_IFA_PEER is set.
                    236:      Note: destination may be NULL if ZEBRA_IFA_PEER is not set. */
                    237:   struct prefix *destination;
                    238: 
                    239:   /* Label for Linux 2.2.X and upper. */
                    240:   char *label;
                    241: };
                    242: 
                    243: /* Does the destination field contain a peer address? */
                    244: #define CONNECTED_PEER(C) CHECK_FLAG((C)->flags, ZEBRA_IFA_PEER)
                    245: 
                    246: /* Prefix to insert into the RIB */
                    247: #define CONNECTED_PREFIX(C) \
                    248:        (CONNECTED_PEER(C) ? (C)->destination : (C)->address)
                    249: 
                    250: /* Identifying address.  We guess that if there's a peer address, but the
                    251:    local address is in the same prefix, then the local address may be unique. */
                    252: #define CONNECTED_ID(C)        \
                    253:        ((CONNECTED_PEER(C) && !prefix_match((C)->destination, (C)->address)) ?\
                    254:         (C)->destination : (C)->address)
                    255: 
                    256: /* Interface hook sort. */
                    257: #define IF_NEW_HOOK   0
                    258: #define IF_DELETE_HOOK 1
                    259: 
                    260: /* There are some interface flags which are only supported by some
                    261:    operating system. */
                    262: 
                    263: #ifndef IFF_NOTRAILERS
                    264: #define IFF_NOTRAILERS 0x0
                    265: #endif /* IFF_NOTRAILERS */
                    266: #ifndef IFF_OACTIVE
                    267: #define IFF_OACTIVE 0x0
                    268: #endif /* IFF_OACTIVE */
                    269: #ifndef IFF_SIMPLEX
                    270: #define IFF_SIMPLEX 0x0
                    271: #endif /* IFF_SIMPLEX */
                    272: #ifndef IFF_LINK0
                    273: #define IFF_LINK0 0x0
                    274: #endif /* IFF_LINK0 */
                    275: #ifndef IFF_LINK1
                    276: #define IFF_LINK1 0x0
                    277: #endif /* IFF_LINK1 */
                    278: #ifndef IFF_LINK2
                    279: #define IFF_LINK2 0x0
                    280: #endif /* IFF_LINK2 */
                    281: #ifndef IFF_NOXMIT
                    282: #define IFF_NOXMIT 0x0
                    283: #endif /* IFF_NOXMIT */
                    284: #ifndef IFF_NORTEXCH
                    285: #define IFF_NORTEXCH 0x0
                    286: #endif /* IFF_NORTEXCH */
                    287: #ifndef IFF_IPV4
                    288: #define IFF_IPV4 0x0
                    289: #endif /* IFF_IPV4 */
                    290: #ifndef IFF_IPV6
                    291: #define IFF_IPV6 0x0
                    292: #endif /* IFF_IPV6 */
                    293: #ifndef IFF_VIRTUAL
                    294: #define IFF_VIRTUAL 0x0
                    295: #endif /* IFF_VIRTUAL */
                    296: 
                    297: /* Prototypes. */
                    298: extern int if_cmp_func (struct interface *, struct interface *);
                    299: extern struct interface *if_create (const char *name, int namelen);
1.1.1.3 ! misho     300: extern struct interface *if_lookup_by_index (ifindex_t);
1.1       misho     301: extern struct interface *if_lookup_exact_address (struct in_addr);
                    302: extern struct interface *if_lookup_address (struct in_addr);
1.1.1.3 ! misho     303: extern struct interface *if_lookup_prefix (struct prefix *prefix);
        !           304: 
        !           305: extern struct interface *if_create_vrf (const char *name, int namelen,
        !           306:                                 vrf_id_t vrf_id);
        !           307: extern struct interface *if_lookup_by_index_vrf (ifindex_t, vrf_id_t vrf_id);
        !           308: extern struct interface *if_lookup_exact_address_vrf (struct in_addr,
        !           309:                                 vrf_id_t vrf_id);
        !           310: extern struct interface *if_lookup_address_vrf (struct in_addr,
        !           311:                                 vrf_id_t vrf_id);
        !           312: extern struct interface *if_lookup_prefix_vrf (struct prefix *prefix,
        !           313:                                 vrf_id_t vrf_id);
1.1       misho     314: 
                    315: /* These 2 functions are to be used when the ifname argument is terminated
                    316:    by a '\0' character: */
                    317: extern struct interface *if_lookup_by_name (const char *ifname);
                    318: extern struct interface *if_get_by_name (const char *ifname);
                    319: 
1.1.1.3 ! misho     320: extern struct interface *if_lookup_by_name_vrf (const char *ifname,
        !           321:                                 vrf_id_t vrf_id);
        !           322: extern struct interface *if_get_by_name_vrf (const char *ifname,
        !           323:                                 vrf_id_t vrf_id);
        !           324: 
1.1       misho     325: /* For these 2 functions, the namelen argument should be the precise length
                    326:    of the ifname string (not counting any optional trailing '\0' character).
                    327:    In most cases, strnlen should be used to calculate the namelen value. */
                    328: extern struct interface *if_lookup_by_name_len(const char *ifname,
1.1.1.3 ! misho     329:                                               size_t namelen);
        !           330: extern struct interface *if_get_by_name_len(const char *ifname,size_t namelen);
        !           331: 
        !           332: extern struct interface *if_lookup_by_name_len_vrf(const char *ifname,
        !           333:                                 size_t namelen, vrf_id_t vrf_id);
        !           334: extern struct interface *if_get_by_name_len_vrf(const char *ifname,
        !           335:                                 size_t namelen, vrf_id_t vrf_id);
1.1       misho     336: 
                    337: 
                    338: /* Delete the interface, but do not free the structure, and leave it in the
                    339:    interface list.  It is often advisable to leave the pseudo interface 
                    340:    structure because there may be configuration information attached. */
                    341: extern void if_delete_retain (struct interface *);
                    342: 
                    343: /* Delete and free the interface structure: calls if_delete_retain and then
                    344:    deletes it from the interface list and frees the structure. */
                    345: extern void if_delete (struct interface *);
                    346: 
                    347: extern int if_is_up (struct interface *);
                    348: extern int if_is_running (struct interface *);
                    349: extern int if_is_operative (struct interface *);
                    350: extern int if_is_loopback (struct interface *);
                    351: extern int if_is_broadcast (struct interface *);
                    352: extern int if_is_pointopoint (struct interface *);
                    353: extern int if_is_multicast (struct interface *);
                    354: extern void if_add_hook (int, int (*)(struct interface *));
1.1.1.3 ! misho     355: extern void if_init (vrf_id_t, struct list **);
        !           356: extern void if_terminate (vrf_id_t, struct list **);
1.1       misho     357: extern void if_dump_all (void);
                    358: extern const char *if_flag_dump(unsigned long);
1.1.1.3 ! misho     359: extern const char *if_link_type_str (enum zebra_link_type);
1.1       misho     360: 
                    361: /* Please use ifindex2ifname instead of if_indextoname where possible;
                    362:    ifindex2ifname uses internal interface info, whereas if_indextoname must
                    363:    make a system call. */
1.1.1.3 ! misho     364: extern const char *ifindex2ifname (ifindex_t);
        !           365: extern const char *ifindex2ifname_vrf (ifindex_t, vrf_id_t vrf_id);
1.1       misho     366: 
                    367: /* Please use ifname2ifindex instead of if_nametoindex where possible;
                    368:    ifname2ifindex uses internal interface info, whereas if_nametoindex must
                    369:    make a system call. */
1.1.1.3 ! misho     370: extern ifindex_t ifname2ifindex(const char *ifname);
        !           371: extern ifindex_t ifname2ifindex_vrf(const char *ifname, vrf_id_t vrf_id);
1.1       misho     372: 
                    373: /* Connected address functions. */
                    374: extern struct connected *connected_new (void);
                    375: extern void connected_free (struct connected *);
                    376: extern void connected_add (struct interface *, struct connected *);
                    377: extern struct connected  *connected_add_by_prefix (struct interface *,
                    378:                                             struct prefix *,
                    379:                                             struct prefix *);
                    380: extern struct connected  *connected_delete_by_prefix (struct interface *, 
                    381:                                                struct prefix *);
                    382: extern struct connected  *connected_lookup_address (struct interface *, 
                    383:                                              struct in_addr);
                    384: 
                    385: #ifndef HAVE_IF_NAMETOINDEX
1.1.1.3 ! misho     386: extern ifindex_t if_nametoindex (const char *);
1.1       misho     387: #endif
                    388: #ifndef HAVE_IF_INDEXTONAME
1.1.1.3 ! misho     389: extern char *if_indextoname (ifindex_t, char *);
1.1       misho     390: #endif
                    391: 
                    392: /* Exported variables. */
                    393: extern struct list *iflist;
                    394: extern struct cmd_element interface_desc_cmd;
                    395: extern struct cmd_element no_interface_desc_cmd;
                    396: extern struct cmd_element interface_cmd;
                    397: extern struct cmd_element no_interface_cmd;
1.1.1.3 ! misho     398: extern struct cmd_element interface_vrf_cmd;
        !           399: extern struct cmd_element no_interface_vrf_cmd;
1.1       misho     400: extern struct cmd_element interface_pseudo_cmd;
                    401: extern struct cmd_element no_interface_pseudo_cmd;
                    402: extern struct cmd_element show_address_cmd;
1.1.1.3 ! misho     403: extern struct cmd_element show_address_vrf_cmd;
        !           404: extern struct cmd_element show_address_vrf_all_cmd;
1.1       misho     405: 
                    406: #endif /* _ZEBRA_IF_H */

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