3 * Copyright (C) 1997, 1999 Kunihiro Ishiguro
5 * This file is part of GNU Zebra.
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27 #include "sockunion.h"
32 #include "connected.h"
36 #include "zebra/interface.h"
37 #include "zebra/rtadv.h"
38 #include "zebra/rib.h"
39 #include "zebra/zserv.h"
40 #include "zebra/redistribute.h"
41 #include "zebra/debug.h"
42 #include "zebra/irdp.h"
45 /* Order is intentional. Matches RFC4191. This array is also used for
46 command matching, so only modify with care. */
47 const char *rtadv_pref_strs
[] = { "medium", "high", "INVALID", "low", 0 };
50 /* Called when new interface is added. */
52 if_zebra_new_hook (struct interface
*ifp
)
54 struct zebra_if
*zebra_if
;
56 zebra_if
= XCALLOC (MTYPE_TMP
, sizeof (struct zebra_if
));
58 zebra_if
->multicast
= IF_ZEBRA_MULTICAST_UNSPEC
;
59 zebra_if
->shutdown
= IF_ZEBRA_SHUTDOWN_OFF
;
63 /* Set default router advertise values. */
64 struct rtadvconf
*rtadv
;
66 rtadv
= &zebra_if
->rtadv
;
68 rtadv
->AdvSendAdvertisements
= 0;
69 rtadv
->MaxRtrAdvInterval
= RTADV_MAX_RTR_ADV_INTERVAL
;
70 rtadv
->MinRtrAdvInterval
= RTADV_MIN_RTR_ADV_INTERVAL
;
71 rtadv
->AdvIntervalTimer
= 0;
72 rtadv
->AdvManagedFlag
= 0;
73 rtadv
->AdvOtherConfigFlag
= 0;
74 rtadv
->AdvHomeAgentFlag
= 0;
75 rtadv
->AdvLinkMTU
= 0;
76 rtadv
->AdvReachableTime
= 0;
77 rtadv
->AdvRetransTimer
= 0;
78 rtadv
->AdvCurHopLimit
= 0;
79 rtadv
->AdvDefaultLifetime
= -1; /* derive from MaxRtrAdvInterval */
80 rtadv
->HomeAgentPreference
= 0;
81 rtadv
->HomeAgentLifetime
= -1; /* derive from AdvDefaultLifetime */
82 rtadv
->AdvIntervalOption
= 0;
83 rtadv
->DefaultPreference
= RTADV_PREF_MEDIUM
;
85 rtadv
->AdvPrefixList
= list_new ();
89 /* Initialize installed address chains tree. */
90 zebra_if
->ipv4_subnets
= route_table_init ();
96 /* Called when interface is deleted. */
98 if_zebra_delete_hook (struct interface
*ifp
)
100 struct zebra_if
*zebra_if
;
104 zebra_if
= ifp
->info
;
106 /* Free installed address chains tree. */
107 if (zebra_if
->ipv4_subnets
)
108 route_table_finish (zebra_if
->ipv4_subnets
);
110 XFREE (MTYPE_TMP
, zebra_if
);
116 /* Tie an interface address to its derived subnet list of addresses. */
118 if_subnet_add (struct interface
*ifp
, struct connected
*ifc
)
120 struct route_node
*rn
;
121 struct zebra_if
*zebra_if
;
123 struct list
*addr_list
;
125 assert (ifp
&& ifp
->info
&& ifc
);
126 zebra_if
= ifp
->info
;
128 /* Get address derived subnet node and associated address list, while marking
129 address secondary attribute appropriately. */
132 rn
= route_node_get (zebra_if
->ipv4_subnets
, &cp
);
134 if ((addr_list
= rn
->info
))
135 SET_FLAG (ifc
->flags
, ZEBRA_IFA_SECONDARY
);
138 UNSET_FLAG (ifc
->flags
, ZEBRA_IFA_SECONDARY
);
139 rn
->info
= addr_list
= list_new ();
140 route_lock_node (rn
);
143 /* Tie address at the tail of address list. */
144 listnode_add (addr_list
, ifc
);
146 /* Return list element count. */
147 return (addr_list
->count
);
150 /* Untie an interface address from its derived subnet list of addresses. */
152 if_subnet_delete (struct interface
*ifp
, struct connected
*ifc
)
154 struct route_node
*rn
;
155 struct zebra_if
*zebra_if
;
156 struct list
*addr_list
;
158 assert (ifp
&& ifp
->info
&& ifc
);
159 zebra_if
= ifp
->info
;
161 /* Get address derived subnet node. */
162 rn
= route_node_lookup (zebra_if
->ipv4_subnets
, ifc
->address
);
163 if (! (rn
&& rn
->info
))
165 zlog_warn("Trying to remove an address from an unknown subnet."
166 " (please report this bug)");
169 route_unlock_node (rn
);
171 /* Untie address from subnet's address list. */
172 addr_list
= rn
->info
;
174 /* Deleting an address that is not registered is a bug.
175 * In any case, we shouldn't decrement the lock counter if the address
177 if (!listnode_lookup(addr_list
, ifc
))
179 zlog_warn("Trying to remove an address from a subnet where it is not"
180 " currently registered. (please report this bug)");
184 listnode_delete (addr_list
, ifc
);
185 route_unlock_node (rn
);
187 /* Return list element count, if not empty. */
188 if (addr_list
->count
)
190 /* If deleted address is primary, mark subsequent one as such and distribute. */
191 if (! CHECK_FLAG (ifc
->flags
, ZEBRA_IFA_SECONDARY
))
193 ifc
= listgetdata (listhead (addr_list
));
194 zebra_interface_address_delete_update (ifp
, ifc
);
195 UNSET_FLAG (ifc
->flags
, ZEBRA_IFA_SECONDARY
);
196 /* XXX: Linux kernel removes all the secondary addresses when the primary
197 * address is removed. We could try to work around that, though this is
199 zebra_interface_address_add_update (ifp
, ifc
);
202 return addr_list
->count
;
205 /* Otherwise, free list and route node. */
206 list_free (addr_list
);
208 route_unlock_node (rn
);
213 /* if_flags_mangle: A place for hacks that require mangling
214 * or tweaking the interface flags.
216 * ******************** Solaris flags hacks **************************
218 * Solaris IFF_UP flag reflects only the primary interface as the
219 * routing socket only sends IFINFO for the primary interface. Hence
220 * ~IFF_UP does not per se imply all the logical interfaces are also
221 * down - which we only know of as addresses. Instead we must determine
222 * whether the interface really is up or not according to how many
223 * addresses are still attached. (Solaris always sends RTM_DELADDR if
224 * an interface, logical or not, goes ~IFF_UP).
226 * Ie, we mangle IFF_UP to *additionally* reflect whether or not there
227 * are addresses left in struct connected, not just the actual underlying
230 * We must hence remember the real state of IFF_UP, which we do in
231 * struct zebra_if.primary_state.
233 * Setting IFF_UP within zebra to administratively shutdown the
234 * interface will affect only the primary interface/address on Solaris.
235 ************************End Solaris flags hacks ***********************
238 if_flags_mangle (struct interface
*ifp
, uint64_t *newflags
)
241 struct zebra_if
*zif
= ifp
->info
;
243 zif
->primary_state
= *newflags
& (IFF_UP
& 0xff);
245 if (CHECK_FLAG (zif
->primary_state
, IFF_UP
)
246 || listcount(ifp
->connected
) > 0)
247 SET_FLAG (*newflags
, IFF_UP
);
249 UNSET_FLAG (*newflags
, IFF_UP
);
253 /* Update the flags field of the ifp with the new flag set provided.
254 * Take whatever actions are required for any changes in flags we care
257 * newflags should be the raw value, as obtained from the OS.
260 if_flags_update (struct interface
*ifp
, uint64_t newflags
)
262 if_flags_mangle (ifp
, &newflags
);
264 if (if_is_operative (ifp
))
266 /* operative -> inoperative? */
267 ifp
->flags
= newflags
;
268 if (!if_is_operative (ifp
))
273 /* inoperative -> operative? */
274 ifp
->flags
= newflags
;
275 if (if_is_operative (ifp
))
280 /* Wake up configured address if it is not in current kernel
283 if_addr_wakeup (struct interface
*ifp
)
285 struct listnode
*node
, *nnode
;
286 struct connected
*ifc
;
290 for (ALL_LIST_ELEMENTS (ifp
->connected
, node
, nnode
, ifc
))
294 if (CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
)
295 && ! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
))
298 if (p
->family
== AF_INET
)
300 if (! if_is_up (ifp
))
302 /* Assume zebra is configured like following:
305 * ip addr 192.0.2.1/24
308 * As soon as zebra becomes first aware that gre0 exists in the
309 * kernel, it will set gre0 up and configure its addresses.
311 * (This may happen at startup when the interface already exists
312 * or during runtime when the interface is added to the kernel)
314 * XXX: IRDP code is calling here via if_add_update - this seems
316 * XXX: RUNNING is not a settable flag on any system
317 * I (paulj) am aware of.
319 if_set_flags (ifp
, IFF_UP
| IFF_RUNNING
);
323 ret
= if_set_prefix (ifp
, ifc
);
326 zlog_warn ("Can't set interface's address: %s",
327 safe_strerror(errno
));
331 SET_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
);
332 /* The address will be advertised to zebra clients when the notification
333 * from the kernel has been received.
334 * It will also be added to the interface's subnet list then. */
337 if (p
->family
== AF_INET6
)
339 if (! if_is_up (ifp
))
341 /* See long comment above */
342 if_set_flags (ifp
, IFF_UP
| IFF_RUNNING
);
346 ret
= if_prefix_add_ipv6 (ifp
, ifc
);
349 zlog_warn ("Can't set interface's address: %s",
350 safe_strerror(errno
));
354 SET_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
);
355 /* The address will be advertised to zebra clients when the notification
356 * from the kernel has been received. */
358 #endif /* HAVE_IPV6 */
363 /* Handle interface addition */
365 if_add_update (struct interface
*ifp
)
367 struct zebra_if
*if_data
;
370 if (if_data
->multicast
== IF_ZEBRA_MULTICAST_ON
)
371 if_set_flags (ifp
, IFF_MULTICAST
);
372 else if (if_data
->multicast
== IF_ZEBRA_MULTICAST_OFF
)
373 if_unset_flags (ifp
, IFF_MULTICAST
);
375 zebra_interface_add_update (ifp
);
377 if (! CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
379 SET_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
);
381 if (if_data
&& if_data
->shutdown
== IF_ZEBRA_SHUTDOWN_ON
)
383 if (IS_ZEBRA_DEBUG_KERNEL
)
384 zlog_debug ("interface %s index %d is shutdown. Won't wake it up.",
385 ifp
->name
, ifp
->ifindex
);
389 if_addr_wakeup (ifp
);
391 if (IS_ZEBRA_DEBUG_KERNEL
)
392 zlog_debug ("interface %s index %d becomes active.",
393 ifp
->name
, ifp
->ifindex
);
397 if (IS_ZEBRA_DEBUG_KERNEL
)
398 zlog_debug ("interface %s index %d is added.", ifp
->name
, ifp
->ifindex
);
402 /* Handle an interface delete event */
404 if_delete_update (struct interface
*ifp
)
406 struct connected
*ifc
;
408 struct route_node
*rn
;
409 struct zebra_if
*zebra_if
;
411 zebra_if
= ifp
->info
;
415 zlog_err ("interface %s index %d is still up while being deleted.",
416 ifp
->name
, ifp
->ifindex
);
420 /* Mark interface as inactive */
421 UNSET_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
);
423 if (IS_ZEBRA_DEBUG_KERNEL
)
424 zlog_debug ("interface %s index %d is now inactive.",
425 ifp
->name
, ifp
->ifindex
);
427 /* Delete connected routes from the kernel. */
430 struct listnode
*node
;
431 struct listnode
*last
= NULL
;
433 while ((node
= (last
? last
->next
: listhead (ifp
->connected
))))
435 ifc
= listgetdata (node
);
438 if (p
->family
== AF_INET
439 && (rn
= route_node_lookup (zebra_if
->ipv4_subnets
, p
)))
441 struct listnode
*anode
;
442 struct listnode
*next
;
443 struct listnode
*first
;
444 struct list
*addr_list
;
446 route_unlock_node (rn
);
447 addr_list
= (struct list
*) rn
->info
;
449 /* Remove addresses, secondaries first. */
450 first
= listhead (addr_list
);
451 for (anode
= first
->next
; anode
|| first
; anode
= next
)
460 ifc
= listgetdata (anode
);
462 connected_down_ipv4 (ifp
, ifc
);
464 /* XXX: We have to send notifications here explicitly, because we destroy
465 * the ifc before receiving the notification about the address being deleted.
467 zebra_interface_address_delete_update (ifp
, ifc
);
469 UNSET_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
);
470 UNSET_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
);
472 /* Remove from subnet chain. */
473 list_delete_node (addr_list
, anode
);
474 route_unlock_node (rn
);
476 /* Remove from interface address list (unconditionally). */
477 if (!CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
479 listnode_delete (ifp
->connected
, ifc
);
480 connected_free (ifc
);
486 /* Free chain list and respective route node. */
487 list_delete (addr_list
);
489 route_unlock_node (rn
);
492 else if (p
->family
== AF_INET6
)
494 connected_down_ipv6 (ifp
, ifc
);
496 zebra_interface_address_delete_update (ifp
, ifc
);
498 UNSET_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
);
499 UNSET_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
);
501 if (CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
505 listnode_delete (ifp
->connected
, ifc
);
506 connected_free (ifc
);
509 #endif /* HAVE_IPV6 */
516 zebra_interface_delete_update (ifp
);
518 /* Update ifindex after distributing the delete message. This is in
519 case any client needs to have the old value of ifindex available
520 while processing the deletion. Each client daemon is responsible
521 for setting ifindex to IFINDEX_INTERNAL after processing the
522 interface deletion message. */
523 ifp
->ifindex
= IFINDEX_INTERNAL
;
526 /* Interface is up. */
528 if_up (struct interface
*ifp
)
530 struct listnode
*node
;
531 struct listnode
*next
;
532 struct connected
*ifc
;
535 /* Notify the protocol daemons. */
536 zebra_interface_up_update (ifp
);
538 /* Install connected routes to the kernel. */
541 for (ALL_LIST_ELEMENTS (ifp
->connected
, node
, next
, ifc
))
545 if (p
->family
== AF_INET
)
546 connected_up_ipv4 (ifp
, ifc
);
548 else if (p
->family
== AF_INET6
)
549 connected_up_ipv6 (ifp
, ifc
);
550 #endif /* HAVE_IPV6 */
554 /* Examine all static routes. */
558 /* Interface goes down. We have to manage different behavior of based
561 if_down (struct interface
*ifp
)
563 struct listnode
*node
;
564 struct listnode
*next
;
565 struct connected
*ifc
;
568 /* Notify to the protocol daemons. */
569 zebra_interface_down_update (ifp
);
571 /* Delete connected routes from the kernel. */
574 for (ALL_LIST_ELEMENTS (ifp
->connected
, node
, next
, ifc
))
578 if (p
->family
== AF_INET
)
579 connected_down_ipv4 (ifp
, ifc
);
581 else if (p
->family
== AF_INET6
)
582 connected_down_ipv6 (ifp
, ifc
);
583 #endif /* HAVE_IPV6 */
587 /* Examine all static routes which direct to the interface. */
592 if_refresh (struct interface
*ifp
)
597 /* Output prefix string to vty. */
599 prefix_vty_out (struct vty
*vty
, struct prefix
*p
)
601 char str
[INET6_ADDRSTRLEN
];
603 inet_ntop (p
->family
, &p
->u
.prefix
, str
, sizeof (str
));
604 vty_out (vty
, "%s", str
);
608 /* Dump if address information to vty. */
610 connected_dump_vty (struct vty
*vty
, struct connected
*connected
)
614 /* Print interface address. */
615 p
= connected
->address
;
616 vty_out (vty
, " %s ", prefix_family_str (p
));
617 prefix_vty_out (vty
, p
);
618 vty_out (vty
, "/%d", p
->prefixlen
);
620 /* If there is destination address, print it. */
621 if (connected
->destination
)
623 vty_out (vty
, (CONNECTED_PEER(connected
) ? " peer " : " broadcast "));
624 prefix_vty_out (vty
, connected
->destination
);
627 if (CHECK_FLAG (connected
->flags
, ZEBRA_IFA_SECONDARY
))
628 vty_out (vty
, " secondary");
630 if (connected
->label
)
631 vty_out (vty
, " %s", connected
->label
);
633 vty_out (vty
, "%s", VTY_NEWLINE
);
637 /* Dump interface ND information to vty. */
639 nd_dump_vty (struct vty
*vty
, struct interface
*ifp
)
641 struct zebra_if
*zif
;
642 struct rtadvconf
*rtadv
;
645 zif
= (struct zebra_if
*) ifp
->info
;
648 if (rtadv
->AdvSendAdvertisements
)
650 vty_out (vty
, " ND advertised reachable time is %d milliseconds%s",
651 rtadv
->AdvReachableTime
, VTY_NEWLINE
);
652 vty_out (vty
, " ND advertised retransmit interval is %d milliseconds%s",
653 rtadv
->AdvRetransTimer
, VTY_NEWLINE
);
654 interval
= rtadv
->MaxRtrAdvInterval
;
656 vty_out (vty
, " ND router advertisements are sent every "
657 "%d milliseconds%s", interval
,
660 vty_out (vty
, " ND router advertisements are sent every "
661 "%d seconds%s", interval
/ 1000,
663 if (rtadv
->AdvDefaultLifetime
!= -1)
664 vty_out (vty
, " ND router advertisements live for %d seconds%s",
665 rtadv
->AdvDefaultLifetime
, VTY_NEWLINE
);
667 vty_out (vty
, " ND router advertisements lifetime tracks ra-interval%s",
669 vty_out (vty
, " ND router advertisement default router preference is "
670 "%s%s", rtadv_pref_strs
[rtadv
->DefaultPreference
],
672 if (rtadv
->AdvManagedFlag
)
673 vty_out (vty
, " Hosts use DHCP to obtain routable addresses.%s",
676 vty_out (vty
, " Hosts use stateless autoconfig for addresses.%s",
678 if (rtadv
->AdvHomeAgentFlag
)
680 vty_out (vty
, " ND router advertisements with "
681 "Home Agent flag bit set.%s",
683 if (rtadv
->HomeAgentLifetime
!= -1)
684 vty_out (vty
, " Home Agent lifetime is %u seconds%s",
685 rtadv
->HomeAgentLifetime
, VTY_NEWLINE
);
687 vty_out (vty
, " Home Agent lifetime tracks ra-lifetime%s",
689 vty_out (vty
, " Home Agent preference is %u%s",
690 rtadv
->HomeAgentPreference
, VTY_NEWLINE
);
692 if (rtadv
->AdvIntervalOption
)
693 vty_out (vty
, " ND router advertisements with Adv. Interval option.%s",
699 /* Interface's information print out to vty interface. */
701 if_dump_vty (struct vty
*vty
, struct interface
*ifp
)
703 #ifdef HAVE_STRUCT_SOCKADDR_DL
704 struct sockaddr_dl
*sdl
;
705 #endif /* HAVE_STRUCT_SOCKADDR_DL */
706 struct connected
*connected
;
707 struct listnode
*node
;
708 struct route_node
*rn
;
709 struct zebra_if
*zebra_if
;
711 zebra_if
= ifp
->info
;
713 vty_out (vty
, "Interface %s is ", ifp
->name
);
715 vty_out (vty
, "up, line protocol ");
717 if (CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
)) {
718 if (if_is_running(ifp
))
719 vty_out (vty
, "is up%s", VTY_NEWLINE
);
721 vty_out (vty
, "is down%s", VTY_NEWLINE
);
723 vty_out (vty
, "detection is disabled%s", VTY_NEWLINE
);
726 vty_out (vty
, "down%s", VTY_NEWLINE
);
730 vty_out (vty
, " Description: %s%s", ifp
->desc
,
732 if (ifp
->ifindex
== IFINDEX_INTERNAL
)
734 vty_out(vty
, " pseudo interface%s", VTY_NEWLINE
);
737 else if (! CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
739 vty_out(vty
, " index %d inactive interface%s",
745 vty_out (vty
, " index %d metric %d mtu %d ",
746 ifp
->ifindex
, ifp
->metric
, ifp
->mtu
);
748 if (ifp
->mtu6
!= ifp
->mtu
)
749 vty_out (vty
, "mtu6 %d ", ifp
->mtu6
);
751 vty_out (vty
, "%s flags: %s%s", VTY_NEWLINE
,
752 if_flag_dump (ifp
->flags
), VTY_NEWLINE
);
754 /* Hardware address. */
755 #ifdef HAVE_STRUCT_SOCKADDR_DL
757 if (sdl
!= NULL
&& sdl
->sdl_alen
!= 0)
762 vty_out (vty
, " HWaddr: ");
763 for (i
= 0, ptr
= (u_char
*)LLADDR (sdl
); i
< sdl
->sdl_alen
; i
++, ptr
++)
764 vty_out (vty
, "%s%02x", i
== 0 ? "" : ":", *ptr
);
765 vty_out (vty
, "%s", VTY_NEWLINE
);
768 if (ifp
->hw_addr_len
!= 0)
772 vty_out (vty
, " HWaddr: ");
773 for (i
= 0; i
< ifp
->hw_addr_len
; i
++)
774 vty_out (vty
, "%s%02x", i
== 0 ? "" : ":", ifp
->hw_addr
[i
]);
775 vty_out (vty
, "%s", VTY_NEWLINE
);
777 #endif /* HAVE_STRUCT_SOCKADDR_DL */
779 /* Bandwidth in kbps */
780 if (ifp
->bandwidth
!= 0)
782 vty_out(vty
, " bandwidth %u kbps", ifp
->bandwidth
);
783 vty_out(vty
, "%s", VTY_NEWLINE
);
786 for (rn
= route_top (zebra_if
->ipv4_subnets
); rn
; rn
= route_next (rn
))
791 for (ALL_LIST_ELEMENTS_RO ((struct list
*)rn
->info
, node
, connected
))
792 connected_dump_vty (vty
, connected
);
795 for (ALL_LIST_ELEMENTS_RO (ifp
->connected
, node
, connected
))
797 if (CHECK_FLAG (connected
->conf
, ZEBRA_IFC_REAL
) &&
798 (connected
->address
->family
== AF_INET6
))
799 connected_dump_vty (vty
, connected
);
803 nd_dump_vty (vty
, ifp
);
806 #ifdef HAVE_PROC_NET_DEV
807 /* Statistics print out using proc file system. */
808 vty_out (vty
, " %lu input packets (%lu multicast), %lu bytes, "
810 ifp
->stats
.rx_packets
, ifp
->stats
.rx_multicast
,
811 ifp
->stats
.rx_bytes
, ifp
->stats
.rx_dropped
, VTY_NEWLINE
);
813 vty_out (vty
, " %lu input errors, %lu length, %lu overrun,"
814 " %lu CRC, %lu frame%s",
815 ifp
->stats
.rx_errors
, ifp
->stats
.rx_length_errors
,
816 ifp
->stats
.rx_over_errors
, ifp
->stats
.rx_crc_errors
,
817 ifp
->stats
.rx_frame_errors
, VTY_NEWLINE
);
819 vty_out (vty
, " %lu fifo, %lu missed%s", ifp
->stats
.rx_fifo_errors
,
820 ifp
->stats
.rx_missed_errors
, VTY_NEWLINE
);
822 vty_out (vty
, " %lu output packets, %lu bytes, %lu dropped%s",
823 ifp
->stats
.tx_packets
, ifp
->stats
.tx_bytes
,
824 ifp
->stats
.tx_dropped
, VTY_NEWLINE
);
826 vty_out (vty
, " %lu output errors, %lu aborted, %lu carrier,"
827 " %lu fifo, %lu heartbeat%s",
828 ifp
->stats
.tx_errors
, ifp
->stats
.tx_aborted_errors
,
829 ifp
->stats
.tx_carrier_errors
, ifp
->stats
.tx_fifo_errors
,
830 ifp
->stats
.tx_heartbeat_errors
, VTY_NEWLINE
);
832 vty_out (vty
, " %lu window, %lu collisions%s",
833 ifp
->stats
.tx_window_errors
, ifp
->stats
.collisions
, VTY_NEWLINE
);
834 #endif /* HAVE_PROC_NET_DEV */
836 #ifdef HAVE_NET_RT_IFLIST
837 #if defined (__bsdi__) || defined (__NetBSD__)
838 /* Statistics print out using sysctl (). */
839 vty_out (vty
, " input packets %qu, bytes %qu, dropped %qu,"
840 " multicast packets %qu%s",
841 ifp
->stats
.ifi_ipackets
, ifp
->stats
.ifi_ibytes
,
842 ifp
->stats
.ifi_iqdrops
, ifp
->stats
.ifi_imcasts
,
845 vty_out (vty
, " input errors %qu%s",
846 ifp
->stats
.ifi_ierrors
, VTY_NEWLINE
);
848 vty_out (vty
, " output packets %qu, bytes %qu, multicast packets %qu%s",
849 ifp
->stats
.ifi_opackets
, ifp
->stats
.ifi_obytes
,
850 ifp
->stats
.ifi_omcasts
, VTY_NEWLINE
);
852 vty_out (vty
, " output errors %qu%s",
853 ifp
->stats
.ifi_oerrors
, VTY_NEWLINE
);
855 vty_out (vty
, " collisions %qu%s",
856 ifp
->stats
.ifi_collisions
, VTY_NEWLINE
);
858 /* Statistics print out using sysctl (). */
859 vty_out (vty
, " input packets %lu, bytes %lu, dropped %lu,"
860 " multicast packets %lu%s",
861 ifp
->stats
.ifi_ipackets
, ifp
->stats
.ifi_ibytes
,
862 ifp
->stats
.ifi_iqdrops
, ifp
->stats
.ifi_imcasts
,
865 vty_out (vty
, " input errors %lu%s",
866 ifp
->stats
.ifi_ierrors
, VTY_NEWLINE
);
868 vty_out (vty
, " output packets %lu, bytes %lu, multicast packets %lu%s",
869 ifp
->stats
.ifi_opackets
, ifp
->stats
.ifi_obytes
,
870 ifp
->stats
.ifi_omcasts
, VTY_NEWLINE
);
872 vty_out (vty
, " output errors %lu%s",
873 ifp
->stats
.ifi_oerrors
, VTY_NEWLINE
);
875 vty_out (vty
, " collisions %lu%s",
876 ifp
->stats
.ifi_collisions
, VTY_NEWLINE
);
877 #endif /* __bsdi__ || __NetBSD__ */
878 #endif /* HAVE_NET_RT_IFLIST */
881 /* Wrapper hook point for zebra daemon so that ifindex can be set
882 * DEFUN macro not used as extract.pl HAS to ignore this
883 * See also interface_cmd in lib/if.c
885 DEFUN_NOSH (zebra_interface
,
888 "Select an interface to configure\n"
889 "Interface's name\n")
892 struct interface
* ifp
;
894 /* Call lib interface() */
895 if ((ret
= interface_cmd
.func (self
, vty
, argc
, argv
)) != CMD_SUCCESS
)
900 if (ifp
->ifindex
== IFINDEX_INTERNAL
)
901 /* Is this really necessary? Shouldn't status be initialized to 0
903 UNSET_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
);
908 struct cmd_node interface_node
=
915 /* Show all or specified interface to vty. */
916 DEFUN (show_interface
, show_interface_cmd
,
917 "show interface [IFNAME]",
919 "Interface status and configuration\n"
922 struct listnode
*node
;
923 struct interface
*ifp
;
925 #ifdef HAVE_PROC_NET_DEV
926 /* If system has interface statistics via proc file system, update
928 ifstat_update_proc ();
929 #endif /* HAVE_PROC_NET_DEV */
930 #ifdef HAVE_NET_RT_IFLIST
931 ifstat_update_sysctl ();
932 #endif /* HAVE_NET_RT_IFLIST */
934 /* Specified interface print. */
937 ifp
= if_lookup_by_name (argv
[0]);
940 vty_out (vty
, "%% Can't find interface %s%s", argv
[0],
944 if_dump_vty (vty
, ifp
);
948 /* All interface print. */
949 for (ALL_LIST_ELEMENTS_RO (iflist
, node
, ifp
))
950 if_dump_vty (vty
, ifp
);
955 DEFUN (show_interface_desc
,
956 show_interface_desc_cmd
,
957 "show interface description",
959 "Interface status and configuration\n"
960 "Interface description\n")
962 struct listnode
*node
;
963 struct interface
*ifp
;
965 vty_out (vty
, "Interface Status Protocol Description%s", VTY_NEWLINE
);
966 for (ALL_LIST_ELEMENTS_RO (iflist
, node
, ifp
))
970 len
= vty_out (vty
, "%s", ifp
->name
);
971 vty_out (vty
, "%*s", (16 - len
), " ");
975 vty_out (vty
, "up ");
976 if (CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
))
978 if (if_is_running(ifp
))
979 vty_out (vty
, "up ");
981 vty_out (vty
, "down ");
985 vty_out (vty
, "unknown ");
990 vty_out (vty
, "down down ");
994 vty_out (vty
, "%s", ifp
->desc
);
995 vty_out (vty
, "%s", VTY_NEWLINE
);
1003 "Set multicast flag to interface\n")
1006 struct interface
*ifp
;
1007 struct zebra_if
*if_data
;
1009 ifp
= (struct interface
*) vty
->index
;
1010 if (CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
1012 ret
= if_set_flags (ifp
, IFF_MULTICAST
);
1015 vty_out (vty
, "Can't set multicast flag%s", VTY_NEWLINE
);
1020 if_data
= ifp
->info
;
1021 if_data
->multicast
= IF_ZEBRA_MULTICAST_ON
;
1026 DEFUN (no_multicast
,
1030 "Unset multicast flag to interface\n")
1033 struct interface
*ifp
;
1034 struct zebra_if
*if_data
;
1036 ifp
= (struct interface
*) vty
->index
;
1037 if (CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
1039 ret
= if_unset_flags (ifp
, IFF_MULTICAST
);
1042 vty_out (vty
, "Can't unset multicast flag%s", VTY_NEWLINE
);
1047 if_data
= ifp
->info
;
1048 if_data
->multicast
= IF_ZEBRA_MULTICAST_OFF
;
1056 "Enable link detection on interface\n")
1058 struct interface
*ifp
;
1059 int if_was_operative
;
1061 ifp
= (struct interface
*) vty
->index
;
1062 if_was_operative
= if_is_operative(ifp
);
1063 SET_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
);
1065 /* When linkdetection is enabled, if might come down */
1066 if (!if_is_operative(ifp
) && if_was_operative
) if_down(ifp
);
1068 /* FIXME: Will defer status change forwarding if interface
1069 does not come down! */
1075 DEFUN (no_linkdetect
,
1079 "Disable link detection on interface\n")
1081 struct interface
*ifp
;
1082 int if_was_operative
;
1084 ifp
= (struct interface
*) vty
->index
;
1085 if_was_operative
= if_is_operative(ifp
);
1086 UNSET_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
);
1088 /* Interface may come up after disabling link detection */
1089 if (if_is_operative(ifp
) && !if_was_operative
) if_up(ifp
);
1091 /* FIXME: see linkdetect_cmd */
1099 "Shutdown the selected interface\n")
1102 struct interface
*ifp
;
1103 struct zebra_if
*if_data
;
1105 ifp
= (struct interface
*) vty
->index
;
1106 if (ifp
->ifindex
!= IFINDEX_INTERNAL
)
1108 ret
= if_unset_flags (ifp
, IFF_UP
);
1111 vty_out (vty
, "Can't shutdown interface%s", VTY_NEWLINE
);
1116 if_data
= ifp
->info
;
1117 if_data
->shutdown
= IF_ZEBRA_SHUTDOWN_ON
;
1122 DEFUN (no_shutdown_if
,
1126 "Shutdown the selected interface\n")
1129 struct interface
*ifp
;
1130 struct zebra_if
*if_data
;
1132 ifp
= (struct interface
*) vty
->index
;
1134 if (ifp
->ifindex
!= IFINDEX_INTERNAL
)
1136 ret
= if_set_flags (ifp
, IFF_UP
| IFF_RUNNING
);
1139 vty_out (vty
, "Can't up interface%s", VTY_NEWLINE
);
1144 /* Some addresses (in particular, IPv6 addresses on Linux) get
1145 * removed when the interface goes down. They need to be readded.
1147 if_addr_wakeup(ifp
);
1150 if_data
= ifp
->info
;
1151 if_data
->shutdown
= IF_ZEBRA_SHUTDOWN_OFF
;
1156 DEFUN (bandwidth_if
,
1158 "bandwidth <1-10000000>",
1159 "Set bandwidth informational parameter\n"
1160 "Bandwidth in kilobits\n")
1162 struct interface
*ifp
;
1163 unsigned int bandwidth
;
1165 ifp
= (struct interface
*) vty
->index
;
1166 bandwidth
= strtol(argv
[0], NULL
, 10);
1168 /* bandwidth range is <1-10000000> */
1169 if (bandwidth
< 1 || bandwidth
> 10000000)
1171 vty_out (vty
, "Bandwidth is invalid%s", VTY_NEWLINE
);
1175 ifp
->bandwidth
= bandwidth
;
1177 /* force protocols to recalculate routes due to cost change */
1178 if (if_is_operative (ifp
))
1179 zebra_interface_up_update (ifp
);
1184 DEFUN (no_bandwidth_if
,
1185 no_bandwidth_if_cmd
,
1188 "Set bandwidth informational parameter\n")
1190 struct interface
*ifp
;
1192 ifp
= (struct interface
*) vty
->index
;
1196 /* force protocols to recalculate routes due to cost change */
1197 if (if_is_operative (ifp
))
1198 zebra_interface_up_update (ifp
);
1203 ALIAS (no_bandwidth_if
,
1204 no_bandwidth_if_val_cmd
,
1205 "no bandwidth <1-10000000>",
1207 "Set bandwidth informational parameter\n"
1208 "Bandwidth in kilobits\n")
1211 ip_address_install (struct vty
*vty
, struct interface
*ifp
,
1212 const char *addr_str
, const char *peer_str
,
1215 struct zebra_if
*if_data
;
1216 struct prefix_ipv4 cp
;
1217 struct connected
*ifc
;
1218 struct prefix_ipv4
*p
;
1221 if_data
= ifp
->info
;
1223 ret
= str2prefix_ipv4 (addr_str
, &cp
);
1226 vty_out (vty
, "%% Malformed address %s", VTY_NEWLINE
);
1230 ifc
= connected_check (ifp
, (struct prefix
*) &cp
);
1233 ifc
= connected_new ();
1237 p
= prefix_ipv4_new ();
1239 ifc
->address
= (struct prefix
*) p
;
1242 if (p
->prefixlen
<= IPV4_MAX_PREFIXLEN
-2)
1244 p
= prefix_ipv4_new ();
1246 p
->prefix
.s_addr
= ipv4_broadcast_addr(p
->prefix
.s_addr
,p
->prefixlen
);
1247 ifc
->destination
= (struct prefix
*) p
;
1252 ifc
->label
= XSTRDUP (MTYPE_CONNECTED_LABEL
, label
);
1254 /* Add to linked list. */
1255 listnode_add (ifp
->connected
, ifc
);
1258 /* This address is configured from zebra. */
1259 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
1260 SET_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
1262 /* In case of this route need to install kernel. */
1263 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
)
1264 && CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)
1265 && !(if_data
&& if_data
->shutdown
== IF_ZEBRA_SHUTDOWN_ON
))
1267 /* Some system need to up the interface to set IP address. */
1268 if (! if_is_up (ifp
))
1270 if_set_flags (ifp
, IFF_UP
| IFF_RUNNING
);
1274 ret
= if_set_prefix (ifp
, ifc
);
1277 vty_out (vty
, "%% Can't set interface IP address: %s.%s",
1278 safe_strerror(errno
), VTY_NEWLINE
);
1282 SET_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
);
1283 /* The address will be advertised to zebra clients when the notification
1284 * from the kernel has been received.
1285 * It will also be added to the subnet chain list, then. */
1292 ip_address_uninstall (struct vty
*vty
, struct interface
*ifp
,
1293 const char *addr_str
, const char *peer_str
,
1296 struct prefix_ipv4 cp
;
1297 struct connected
*ifc
;
1300 /* Convert to prefix structure. */
1301 ret
= str2prefix_ipv4 (addr_str
, &cp
);
1304 vty_out (vty
, "%% Malformed address %s", VTY_NEWLINE
);
1308 /* Check current interface address. */
1309 ifc
= connected_check (ifp
, (struct prefix
*) &cp
);
1312 vty_out (vty
, "%% Can't find address%s", VTY_NEWLINE
);
1316 /* This is not configured address. */
1317 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
1320 UNSET_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
1322 /* This is not real address or interface is not active. */
1323 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
)
1324 || ! CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
1326 listnode_delete (ifp
->connected
, ifc
);
1327 connected_free (ifc
);
1331 /* This is real route. */
1332 ret
= if_unset_prefix (ifp
, ifc
);
1335 vty_out (vty
, "%% Can't unset interface IP address: %s.%s",
1336 safe_strerror(errno
), VTY_NEWLINE
);
1339 UNSET_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
);
1340 /* we will receive a kernel notification about this route being removed.
1341 * this will trigger its removal from the connected list. */
1347 "ip address A.B.C.D/M",
1348 "Interface Internet Protocol config commands\n"
1349 "Set the IP address of an interface\n"
1350 "IP address (e.g. 10.0.0.1/8)\n")
1352 return ip_address_install (vty
, vty
->index
, argv
[0], NULL
, NULL
);
1355 DEFUN (no_ip_address
,
1357 "no ip address A.B.C.D/M",
1359 "Interface Internet Protocol config commands\n"
1360 "Set the IP address of an interface\n"
1361 "IP Address (e.g. 10.0.0.1/8)")
1363 return ip_address_uninstall (vty
, vty
->index
, argv
[0], NULL
, NULL
);
1367 DEFUN (ip_address_label
,
1368 ip_address_label_cmd
,
1369 "ip address A.B.C.D/M label LINE",
1370 "Interface Internet Protocol config commands\n"
1371 "Set the IP address of an interface\n"
1372 "IP address (e.g. 10.0.0.1/8)\n"
1373 "Label of this address\n"
1376 return ip_address_install (vty
, vty
->index
, argv
[0], NULL
, argv
[1]);
1379 DEFUN (no_ip_address_label
,
1380 no_ip_address_label_cmd
,
1381 "no ip address A.B.C.D/M label LINE",
1383 "Interface Internet Protocol config commands\n"
1384 "Set the IP address of an interface\n"
1385 "IP address (e.g. 10.0.0.1/8)\n"
1386 "Label of this address\n"
1389 return ip_address_uninstall (vty
, vty
->index
, argv
[0], NULL
, argv
[1]);
1391 #endif /* HAVE_NETLINK */
1395 ipv6_address_install (struct vty
*vty
, struct interface
*ifp
,
1396 const char *addr_str
, const char *peer_str
,
1397 const char *label
, int secondary
)
1399 struct zebra_if
*if_data
;
1400 struct prefix_ipv6 cp
;
1401 struct connected
*ifc
;
1402 struct prefix_ipv6
*p
;
1405 if_data
= ifp
->info
;
1407 ret
= str2prefix_ipv6 (addr_str
, &cp
);
1410 vty_out (vty
, "%% Malformed address %s", VTY_NEWLINE
);
1414 ifc
= connected_check (ifp
, (struct prefix
*) &cp
);
1417 ifc
= connected_new ();
1421 p
= prefix_ipv6_new ();
1423 ifc
->address
= (struct prefix
*) p
;
1427 SET_FLAG (ifc
->flags
, ZEBRA_IFA_SECONDARY
);
1431 ifc
->label
= XSTRDUP (MTYPE_CONNECTED_LABEL
, label
);
1433 /* Add to linked list. */
1434 listnode_add (ifp
->connected
, ifc
);
1437 /* This address is configured from zebra. */
1438 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
1439 SET_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
1441 /* In case of this route need to install kernel. */
1442 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
)
1443 && CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)
1444 && !(if_data
&& if_data
->shutdown
== IF_ZEBRA_SHUTDOWN_ON
))
1446 /* Some system need to up the interface to set IP address. */
1447 if (! if_is_up (ifp
))
1449 if_set_flags (ifp
, IFF_UP
| IFF_RUNNING
);
1453 ret
= if_prefix_add_ipv6 (ifp
, ifc
);
1457 vty_out (vty
, "%% Can't set interface IP address: %s.%s",
1458 safe_strerror(errno
), VTY_NEWLINE
);
1462 SET_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
);
1463 /* The address will be advertised to zebra clients when the notification
1464 * from the kernel has been received. */
1471 ipv6_address_uninstall (struct vty
*vty
, struct interface
*ifp
,
1472 const char *addr_str
, const char *peer_str
,
1473 const char *label
, int secondry
)
1475 struct prefix_ipv6 cp
;
1476 struct connected
*ifc
;
1479 /* Convert to prefix structure. */
1480 ret
= str2prefix_ipv6 (addr_str
, &cp
);
1483 vty_out (vty
, "%% Malformed address %s", VTY_NEWLINE
);
1487 /* Check current interface address. */
1488 ifc
= connected_check (ifp
, (struct prefix
*) &cp
);
1491 vty_out (vty
, "%% Can't find address%s", VTY_NEWLINE
);
1495 /* This is not configured address. */
1496 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
1499 UNSET_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
1501 /* This is not real address or interface is not active. */
1502 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
)
1503 || ! CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
1505 listnode_delete (ifp
->connected
, ifc
);
1506 connected_free (ifc
);
1510 /* This is real route. */
1511 ret
= if_prefix_delete_ipv6 (ifp
, ifc
);
1514 vty_out (vty
, "%% Can't unset interface IP address: %s.%s",
1515 safe_strerror(errno
), VTY_NEWLINE
);
1519 UNSET_FLAG (ifc
->conf
, ZEBRA_IFC_QUEUED
);
1520 /* This information will be propagated to the zclients when the
1521 * kernel notification is received. */
1525 DEFUN (ipv6_address
,
1527 "ipv6 address X:X::X:X/M",
1528 "Interface IPv6 config commands\n"
1529 "Set the IP address of an interface\n"
1530 "IPv6 address (e.g. 3ffe:506::1/48)\n")
1532 return ipv6_address_install (vty
, vty
->index
, argv
[0], NULL
, NULL
, 0);
1535 DEFUN (no_ipv6_address
,
1536 no_ipv6_address_cmd
,
1537 "no ipv6 address X:X::X:X/M",
1539 "Interface IPv6 config commands\n"
1540 "Set the IP address of an interface\n"
1541 "IPv6 address (e.g. 3ffe:506::1/48)\n")
1543 return ipv6_address_uninstall (vty
, vty
->index
, argv
[0], NULL
, NULL
, 0);
1545 #endif /* HAVE_IPV6 */
1548 if_config_write (struct vty
*vty
)
1550 struct listnode
*node
;
1551 struct interface
*ifp
;
1553 for (ALL_LIST_ELEMENTS_RO (iflist
, node
, ifp
))
1555 struct zebra_if
*if_data
;
1556 struct listnode
*addrnode
;
1557 struct connected
*ifc
;
1560 if_data
= ifp
->info
;
1562 vty_out (vty
, "interface %s%s", ifp
->name
,
1567 if (if_data
->shutdown
== IF_ZEBRA_SHUTDOWN_ON
)
1568 vty_out (vty
, " shutdown%s", VTY_NEWLINE
);
1572 vty_out (vty
, " description %s%s", ifp
->desc
,
1575 /* Assign bandwidth here to avoid unnecessary interface flap
1576 while processing config script */
1577 if (ifp
->bandwidth
!= 0)
1578 vty_out(vty
, " bandwidth %u%s", ifp
->bandwidth
, VTY_NEWLINE
);
1580 if (CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
))
1581 vty_out(vty
, " link-detect%s", VTY_NEWLINE
);
1583 for (ALL_LIST_ELEMENTS_RO (ifp
->connected
, addrnode
, ifc
))
1585 if (CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
1587 char buf
[INET6_ADDRSTRLEN
];
1589 vty_out (vty
, " ip%s address %s/%d",
1590 p
->family
== AF_INET
? "" : "v6",
1591 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, sizeof(buf
)),
1595 vty_out (vty
, " label %s", ifc
->label
);
1597 vty_out (vty
, "%s", VTY_NEWLINE
);
1603 if (if_data
->multicast
!= IF_ZEBRA_MULTICAST_UNSPEC
)
1604 vty_out (vty
, " %smulticast%s",
1605 if_data
->multicast
== IF_ZEBRA_MULTICAST_ON
? "" : "no ",
1610 rtadv_config_write (vty
, ifp
);
1614 irdp_config_write (vty
, ifp
);
1617 vty_out (vty
, "!%s", VTY_NEWLINE
);
1622 /* Allocate and initialize interface vector. */
1624 zebra_if_init (void)
1626 /* Initialize interface and new hook. */
1628 if_add_hook (IF_NEW_HOOK
, if_zebra_new_hook
);
1629 if_add_hook (IF_DELETE_HOOK
, if_zebra_delete_hook
);
1631 /* Install configuration write function. */
1632 install_node (&interface_node
, if_config_write
);
1634 install_element (VIEW_NODE
, &show_interface_cmd
);
1635 install_element (ENABLE_NODE
, &show_interface_cmd
);
1636 install_element (ENABLE_NODE
, &show_interface_desc_cmd
);
1637 install_element (CONFIG_NODE
, &zebra_interface_cmd
);
1638 install_element (CONFIG_NODE
, &no_interface_cmd
);
1639 install_default (INTERFACE_NODE
);
1640 install_element (INTERFACE_NODE
, &interface_desc_cmd
);
1641 install_element (INTERFACE_NODE
, &no_interface_desc_cmd
);
1642 install_element (INTERFACE_NODE
, &multicast_cmd
);
1643 install_element (INTERFACE_NODE
, &no_multicast_cmd
);
1644 install_element (INTERFACE_NODE
, &linkdetect_cmd
);
1645 install_element (INTERFACE_NODE
, &no_linkdetect_cmd
);
1646 install_element (INTERFACE_NODE
, &shutdown_if_cmd
);
1647 install_element (INTERFACE_NODE
, &no_shutdown_if_cmd
);
1648 install_element (INTERFACE_NODE
, &bandwidth_if_cmd
);
1649 install_element (INTERFACE_NODE
, &no_bandwidth_if_cmd
);
1650 install_element (INTERFACE_NODE
, &no_bandwidth_if_val_cmd
);
1651 install_element (INTERFACE_NODE
, &ip_address_cmd
);
1652 install_element (INTERFACE_NODE
, &no_ip_address_cmd
);
1654 install_element (INTERFACE_NODE
, &ipv6_address_cmd
);
1655 install_element (INTERFACE_NODE
, &no_ipv6_address_cmd
);
1656 #endif /* HAVE_IPV6 */
1658 install_element (INTERFACE_NODE
, &ip_address_label_cmd
);
1659 install_element (INTERFACE_NODE
, &no_ip_address_label_cmd
);
1660 #endif /* HAVE_NETLINK */