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 306 : RB_PROTOTYPE(if_name_head, interface, name_entry, if_cmp_func)
314 : RB_HEAD(if_index_head, interface);
315 239 : 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 : static inline bool if_address_is_local(const void *matchaddr, int family,
527 : vrf_id_t vrf_id)
528 : {
529 : 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 */
|