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 along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "lib_errors.h"
27 #include "sockunion.h"
31 #include "zebra_memory.h"
33 #include "connected.h"
38 #include "zebra/rtadv.h"
40 #include "zebra_vrf.h"
41 #include "zebra/interface.h"
42 #include "zebra/rib.h"
44 #include "zebra/zserv.h"
45 #include "zebra/redistribute.h"
46 #include "zebra/debug.h"
47 #include "zebra/irdp.h"
48 #include "zebra/zebra_ptm.h"
49 #include "zebra/rt_netlink.h"
50 #include "zebra/interface.h"
51 #include "zebra/zebra_vxlan.h"
52 #include "zebra/zebra_errors.h"
54 DEFINE_MTYPE_STATIC(ZEBRA
, ZINFO
, "Zebra Interface Information")
56 #define ZEBRA_PTM_SUPPORT
58 DEFINE_HOOK(zebra_if_extra_info
, (struct vty
* vty
, struct interface
*ifp
),
60 DEFINE_HOOK(zebra_if_config_wr
, (struct vty
* vty
, struct interface
*ifp
),
64 static void if_down_del_nbr_connected(struct interface
*ifp
);
66 static int if_zebra_speed_update(struct thread
*thread
)
68 struct interface
*ifp
= THREAD_ARG(thread
);
69 struct zebra_if
*zif
= ifp
->info
;
72 zif
->speed_update
= NULL
;
74 new_speed
= kernel_get_speed(ifp
);
75 if (new_speed
!= ifp
->speed
) {
76 zlog_info("%s: %s old speed: %u new speed: %u",
77 __PRETTY_FUNCTION__
, ifp
->name
, ifp
->speed
,
79 ifp
->speed
= new_speed
;
86 static void zebra_if_node_destroy(route_table_delegate_t
*delegate
,
87 struct route_table
*table
,
88 struct route_node
*node
)
91 list_delete((struct list
**)&node
->info
);
92 route_node_destroy(delegate
, table
, node
);
95 route_table_delegate_t zebra_if_table_delegate
= {
96 .create_node
= route_node_create
,
97 .destroy_node
= zebra_if_node_destroy
};
99 /* Called when new interface is added. */
100 static int if_zebra_new_hook(struct interface
*ifp
)
102 struct zebra_if
*zebra_if
;
104 zebra_if
= XCALLOC(MTYPE_ZINFO
, sizeof(struct zebra_if
));
106 zebra_if
->multicast
= IF_ZEBRA_MULTICAST_UNSPEC
;
107 zebra_if
->shutdown
= IF_ZEBRA_SHUTDOWN_OFF
;
108 zebra_ptm_if_init(zebra_if
);
110 ifp
->ptm_enable
= zebra_ptm_get_enable_state();
111 #if defined(HAVE_RTADV)
113 /* Set default router advertise values. */
114 struct rtadvconf
*rtadv
;
116 rtadv
= &zebra_if
->rtadv
;
118 rtadv
->AdvSendAdvertisements
= 0;
119 rtadv
->MaxRtrAdvInterval
= RTADV_MAX_RTR_ADV_INTERVAL
;
120 rtadv
->MinRtrAdvInterval
= RTADV_MIN_RTR_ADV_INTERVAL
;
121 rtadv
->AdvIntervalTimer
= 0;
122 rtadv
->AdvManagedFlag
= 0;
123 rtadv
->AdvOtherConfigFlag
= 0;
124 rtadv
->AdvHomeAgentFlag
= 0;
125 rtadv
->AdvLinkMTU
= 0;
126 rtadv
->AdvReachableTime
= 0;
127 rtadv
->AdvRetransTimer
= 0;
128 rtadv
->AdvCurHopLimit
= 0;
129 rtadv
->AdvDefaultLifetime
=
130 -1; /* derive from MaxRtrAdvInterval */
131 rtadv
->HomeAgentPreference
= 0;
132 rtadv
->HomeAgentLifetime
=
133 -1; /* derive from AdvDefaultLifetime */
134 rtadv
->AdvIntervalOption
= 0;
135 rtadv
->DefaultPreference
= RTADV_PREF_MEDIUM
;
137 rtadv
->AdvPrefixList
= list_new();
139 #endif /* HAVE_RTADV */
141 memset(&zebra_if
->neigh_mac
[0], 0, 6);
143 /* Initialize installed address chains tree. */
144 zebra_if
->ipv4_subnets
=
145 route_table_init_with_delegate(&zebra_if_table_delegate
);
147 ifp
->info
= zebra_if
;
150 * Some platforms are telling us that the interface is
151 * up and ready to go. When we check the speed we
152 * sometimes get the wrong value. Wait a couple
153 * of seconds and ask again. Hopefully it's all settled
156 thread_add_timer(zebrad
.master
, if_zebra_speed_update
, ifp
, 15,
157 &zebra_if
->speed_update
);
161 /* Called when interface is deleted. */
162 static int if_zebra_delete_hook(struct interface
*ifp
)
164 struct zebra_if
*zebra_if
;
167 zebra_if
= ifp
->info
;
169 /* Free installed address chains tree. */
170 if (zebra_if
->ipv4_subnets
)
171 route_table_finish(zebra_if
->ipv4_subnets
);
172 #if defined(HAVE_RTADV)
174 struct rtadvconf
*rtadv
;
176 rtadv
= &zebra_if
->rtadv
;
177 list_delete(&rtadv
->AdvPrefixList
);
178 #endif /* HAVE_RTADV */
180 THREAD_OFF(zebra_if
->speed_update
);
182 XFREE(MTYPE_ZINFO
, zebra_if
);
188 /* Build the table key */
189 static void if_build_key(uint32_t ifindex
, struct prefix
*p
)
192 p
->prefixlen
= IPV4_MAX_BITLEN
;
193 p
->u
.prefix4
.s_addr
= ifindex
;
196 /* Link an interface in a per NS interface tree */
197 struct interface
*if_link_per_ns(struct zebra_ns
*ns
, struct interface
*ifp
)
200 struct route_node
*rn
;
202 if (ifp
->ifindex
== IFINDEX_INTERNAL
)
205 if_build_key(ifp
->ifindex
, &p
);
206 rn
= route_node_get(ns
->if_table
, &p
);
208 ifp
= (struct interface
*)rn
->info
;
209 route_unlock_node(rn
); /* get */
219 /* Delete a VRF. This is called in vrf_terminate(). */
220 void if_unlink_per_ns(struct interface
*ifp
)
222 ifp
->node
->info
= NULL
;
223 route_unlock_node(ifp
->node
);
227 /* Look up an interface by identifier within a NS */
228 struct interface
*if_lookup_by_index_per_ns(struct zebra_ns
*ns
,
232 struct route_node
*rn
;
233 struct interface
*ifp
= NULL
;
235 if_build_key(ifindex
, &p
);
236 rn
= route_node_lookup(ns
->if_table
, &p
);
238 ifp
= (struct interface
*)rn
->info
;
239 route_unlock_node(rn
); /* lookup */
244 /* Look up an interface by name within a NS */
245 struct interface
*if_lookup_by_name_per_ns(struct zebra_ns
*ns
,
248 struct route_node
*rn
;
249 struct interface
*ifp
;
251 for (rn
= route_top(ns
->if_table
); rn
; rn
= route_next(rn
)) {
252 ifp
= (struct interface
*)rn
->info
;
253 if (ifp
&& strcmp(ifp
->name
, ifname
) == 0)
260 const char *ifindex2ifname_per_ns(struct zebra_ns
*zns
, unsigned int ifindex
)
262 struct interface
*ifp
;
264 return ((ifp
= if_lookup_by_index_per_ns(zns
, ifindex
)) != NULL
)
269 /* Tie an interface address to its derived subnet list of addresses. */
270 int if_subnet_add(struct interface
*ifp
, struct connected
*ifc
)
272 struct route_node
*rn
;
273 struct zebra_if
*zebra_if
;
275 struct list
*addr_list
;
277 assert(ifp
&& ifp
->info
&& ifc
);
278 zebra_if
= ifp
->info
;
280 /* Get address derived subnet node and associated address list, while
282 address secondary attribute appropriately. */
283 cp
= *CONNECTED_PREFIX(ifc
);
285 rn
= route_node_get(zebra_if
->ipv4_subnets
, &cp
);
287 if ((addr_list
= rn
->info
))
288 SET_FLAG(ifc
->flags
, ZEBRA_IFA_SECONDARY
);
290 UNSET_FLAG(ifc
->flags
, ZEBRA_IFA_SECONDARY
);
291 rn
->info
= addr_list
= list_new();
295 /* Tie address at the tail of address list. */
296 listnode_add(addr_list
, ifc
);
298 /* Return list element count. */
299 return (addr_list
->count
);
302 /* Untie an interface address from its derived subnet list of addresses. */
303 int if_subnet_delete(struct interface
*ifp
, struct connected
*ifc
)
305 struct route_node
*rn
;
306 struct zebra_if
*zebra_if
;
307 struct list
*addr_list
;
310 assert(ifp
&& ifp
->info
&& ifc
);
311 zebra_if
= ifp
->info
;
313 cp
= *CONNECTED_PREFIX(ifc
);
316 /* Get address derived subnet node. */
317 rn
= route_node_lookup(zebra_if
->ipv4_subnets
, &cp
);
318 if (!(rn
&& rn
->info
)) {
319 flog_warn(EC_ZEBRA_REMOVE_ADDR_UNKNOWN_SUBNET
,
320 "Trying to remove an address from an unknown subnet."
321 " (please report this bug)");
324 route_unlock_node(rn
);
326 /* Untie address from subnet's address list. */
327 addr_list
= rn
->info
;
329 /* Deleting an address that is not registered is a bug.
330 * In any case, we shouldn't decrement the lock counter if the address
332 if (!listnode_lookup(addr_list
, ifc
)) {
334 EC_ZEBRA_REMOVE_UNREGISTERED_ADDR
,
335 "Trying to remove an address from a subnet where it is not"
336 " currently registered. (please report this bug)");
340 listnode_delete(addr_list
, ifc
);
341 route_unlock_node(rn
);
343 /* Return list element count, if not empty. */
344 if (addr_list
->count
) {
345 /* If deleted address is primary, mark subsequent one as such
347 if (!CHECK_FLAG(ifc
->flags
, ZEBRA_IFA_SECONDARY
)) {
349 (struct listnode
*)listhead(addr_list
));
350 zebra_interface_address_delete_update(ifp
, ifc
);
351 UNSET_FLAG(ifc
->flags
, ZEBRA_IFA_SECONDARY
);
352 /* XXX: Linux kernel removes all the secondary addresses
354 * address is removed. We could try to work around that,
357 zebra_interface_address_add_update(ifp
, ifc
);
360 return addr_list
->count
;
363 /* Otherwise, free list and route node. */
364 list_delete(&addr_list
);
366 route_unlock_node(rn
);
371 /* if_flags_mangle: A place for hacks that require mangling
372 * or tweaking the interface flags.
374 * ******************** Solaris flags hacks **************************
376 * Solaris IFF_UP flag reflects only the primary interface as the
377 * routing socket only sends IFINFO for the primary interface. Hence
378 * ~IFF_UP does not per se imply all the logical interfaces are also
379 * down - which we only know of as addresses. Instead we must determine
380 * whether the interface really is up or not according to how many
381 * addresses are still attached. (Solaris always sends RTM_DELADDR if
382 * an interface, logical or not, goes ~IFF_UP).
384 * Ie, we mangle IFF_UP to *additionally* reflect whether or not there
385 * are addresses left in struct connected, not just the actual underlying
388 * We must hence remember the real state of IFF_UP, which we do in
389 * struct zebra_if.primary_state.
391 * Setting IFF_UP within zebra to administratively shutdown the
392 * interface will affect only the primary interface/address on Solaris.
393 ************************End Solaris flags hacks ***********************
395 static void if_flags_mangle(struct interface
*ifp
, uint64_t *newflags
)
398 struct zebra_if
*zif
= ifp
->info
;
400 zif
->primary_state
= *newflags
& (IFF_UP
& 0xff);
402 if (CHECK_FLAG(zif
->primary_state
, IFF_UP
)
403 || listcount(ifp
->connected
) > 0)
404 SET_FLAG(*newflags
, IFF_UP
);
406 UNSET_FLAG(*newflags
, IFF_UP
);
410 /* Update the flags field of the ifp with the new flag set provided.
411 * Take whatever actions are required for any changes in flags we care
414 * newflags should be the raw value, as obtained from the OS.
416 void if_flags_update(struct interface
*ifp
, uint64_t newflags
)
418 if_flags_mangle(ifp
, &newflags
);
420 if (if_is_no_ptm_operative(ifp
)) {
421 /* operative -> inoperative? */
422 ifp
->flags
= newflags
;
423 if (!if_is_operative(ifp
))
426 /* inoperative -> operative? */
427 ifp
->flags
= newflags
;
428 if (if_is_operative(ifp
))
433 /* Wake up configured address if it is not in current kernel
435 static void if_addr_wakeup(struct interface
*ifp
)
437 struct listnode
*node
, *nnode
;
438 struct connected
*ifc
;
442 for (ALL_LIST_ELEMENTS(ifp
->connected
, node
, nnode
, ifc
)) {
445 if (CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
)
446 && !CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)) {
448 if (p
->family
== AF_INET
) {
449 if (!if_is_up(ifp
)) {
450 /* Assume zebra is configured like
454 * ip addr 192.0.2.1/24
457 * As soon as zebra becomes first aware
458 * that gre0 exists in the
459 * kernel, it will set gre0 up and
460 * configure its addresses.
462 * (This may happen at startup when the
463 * interface already exists
464 * or during runtime when the interface
465 * is added to the kernel)
467 * XXX: IRDP code is calling here via
468 * if_add_update - this seems
470 * XXX: RUNNING is not a settable flag
472 * I (paulj) am aware of.
474 if_set_flags(ifp
, IFF_UP
| IFF_RUNNING
);
478 ret
= if_set_prefix(ifp
, ifc
);
481 EC_ZEBRA_IFACE_ADDR_ADD_FAILED
,
482 "Can't set interface's address: %s",
483 safe_strerror(errno
));
487 SET_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
);
488 /* The address will be advertised to zebra
489 * clients when the notification
490 * from the kernel has been received.
491 * It will also be added to the interface's
492 * subnet list then. */
494 if (p
->family
== AF_INET6
) {
495 if (!if_is_up(ifp
)) {
496 /* See long comment above */
497 if_set_flags(ifp
, IFF_UP
| IFF_RUNNING
);
501 ret
= if_prefix_add_ipv6(ifp
, ifc
);
504 EC_ZEBRA_IFACE_ADDR_ADD_FAILED
,
505 "Can't set interface's address: %s",
506 safe_strerror(errno
));
510 SET_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
);
511 /* The address will be advertised to zebra
512 * clients when the notification
513 * from the kernel has been received. */
519 /* Handle interface addition */
520 void if_add_update(struct interface
*ifp
)
522 struct zebra_if
*if_data
;
523 struct zebra_ns
*zns
;
524 struct zebra_vrf
*zvrf
= vrf_info_lookup(ifp
->vrf_id
);
526 /* case interface populate before vrf enabled */
530 zns
= zebra_ns_lookup(NS_DEFAULT
);
531 if_link_per_ns(zns
, ifp
);
535 if (if_data
->multicast
== IF_ZEBRA_MULTICAST_ON
)
536 if_set_flags(ifp
, IFF_MULTICAST
);
537 else if (if_data
->multicast
== IF_ZEBRA_MULTICAST_OFF
)
538 if_unset_flags(ifp
, IFF_MULTICAST
);
540 zebra_ptm_if_set_ptm_state(ifp
, if_data
);
542 zebra_interface_add_update(ifp
);
544 if (!CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
545 SET_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
);
547 if (if_data
->shutdown
== IF_ZEBRA_SHUTDOWN_ON
) {
548 if (IS_ZEBRA_DEBUG_KERNEL
)
550 "interface %s vrf %u index %d is shutdown. "
552 ifp
->name
, ifp
->vrf_id
, ifp
->ifindex
);
558 if (IS_ZEBRA_DEBUG_KERNEL
)
560 "interface %s vrf %u index %d becomes active.",
561 ifp
->name
, ifp
->vrf_id
, ifp
->ifindex
);
564 if (IS_ZEBRA_DEBUG_KERNEL
)
565 zlog_debug("interface %s vrf %u index %d is added.",
566 ifp
->name
, ifp
->vrf_id
, ifp
->ifindex
);
570 /* Install connected routes corresponding to an interface. */
571 static void if_install_connected(struct interface
*ifp
)
573 struct listnode
*node
;
574 struct listnode
*next
;
575 struct connected
*ifc
;
577 if (ifp
->connected
) {
578 for (ALL_LIST_ELEMENTS(ifp
->connected
, node
, next
, ifc
)) {
579 if (CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_REAL
))
580 zebra_interface_address_add_update(ifp
, ifc
);
582 connected_up(ifp
, ifc
);
587 /* Uninstall connected routes corresponding to an interface. */
588 static void if_uninstall_connected(struct interface
*ifp
)
590 struct listnode
*node
;
591 struct listnode
*next
;
592 struct connected
*ifc
;
594 if (ifp
->connected
) {
595 for (ALL_LIST_ELEMENTS(ifp
->connected
, node
, next
, ifc
)) {
596 zebra_interface_address_delete_update(ifp
, ifc
);
597 connected_down(ifp
, ifc
);
602 /* Uninstall and delete connected routes corresponding to an interface. */
603 /* TODO - Check why IPv4 handling here is different from install or if_down */
604 static void if_delete_connected(struct interface
*ifp
)
606 struct connected
*ifc
;
608 struct route_node
*rn
;
609 struct zebra_if
*zebra_if
;
610 struct listnode
*node
;
611 struct listnode
*last
= NULL
;
613 zebra_if
= ifp
->info
;
618 while ((node
= (last
? last
->next
: listhead(ifp
->connected
)))) {
619 ifc
= listgetdata(node
);
621 cp
= *CONNECTED_PREFIX(ifc
);
624 if (cp
.family
== AF_INET
625 && (rn
= route_node_lookup(zebra_if
->ipv4_subnets
, &cp
))) {
626 struct listnode
*anode
;
627 struct listnode
*next
;
628 struct listnode
*first
;
629 struct list
*addr_list
;
631 route_unlock_node(rn
);
632 addr_list
= (struct list
*)rn
->info
;
634 /* Remove addresses, secondaries first. */
635 first
= listhead(addr_list
);
637 for (anode
= first
->next
; anode
|| first
;
645 ifc
= listgetdata(anode
);
646 connected_down(ifp
, ifc
);
648 /* XXX: We have to send notifications
649 * here explicitly, because we destroy
650 * the ifc before receiving the
651 * notification about the address being
654 zebra_interface_address_delete_update(
657 UNSET_FLAG(ifc
->conf
, ZEBRA_IFC_REAL
);
658 UNSET_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
);
660 /* Remove from subnet chain. */
661 list_delete_node(addr_list
, anode
);
662 route_unlock_node(rn
);
664 /* Remove from interface address list
665 * (unconditionally). */
666 if (!CHECK_FLAG(ifc
->conf
,
667 ZEBRA_IFC_CONFIGURED
)) {
668 listnode_delete(ifp
->connected
,
675 /* Free chain list and respective route node. */
676 list_delete(&addr_list
);
678 route_unlock_node(rn
);
679 } else if (cp
.family
== AF_INET6
) {
680 connected_down(ifp
, ifc
);
682 zebra_interface_address_delete_update(ifp
, ifc
);
684 UNSET_FLAG(ifc
->conf
, ZEBRA_IFC_REAL
);
685 UNSET_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
);
687 if (CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
690 listnode_delete(ifp
->connected
, ifc
);
699 /* Handle an interface delete event */
700 void if_delete_update(struct interface
*ifp
)
702 struct zebra_if
*zif
;
707 "interface %s vrf %u index %d is still up while being deleted.",
708 ifp
->name
, ifp
->vrf_id
, ifp
->ifindex
);
712 if (!CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
715 /* Mark interface as inactive */
716 UNSET_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
);
718 if (IS_ZEBRA_DEBUG_KERNEL
)
719 zlog_debug("interface %s vrf %u index %d is now inactive.",
720 ifp
->name
, ifp
->vrf_id
, ifp
->ifindex
);
722 /* Delete connected routes from the kernel. */
723 if_delete_connected(ifp
);
725 /* Send out notification on interface delete. */
726 zebra_interface_delete_update(ifp
);
728 if_unlink_per_ns(ifp
);
730 /* Update ifindex after distributing the delete message. This is in
731 case any client needs to have the old value of ifindex available
732 while processing the deletion. Each client daemon is responsible
733 for setting ifindex to IFINDEX_INTERNAL after processing the
734 interface deletion message. */
735 if_set_index(ifp
, IFINDEX_INTERNAL
);
738 /* if the ifp is in a vrf, move it to default so vrf can be deleted if
739 * desired. This operation is not done for netns implementation to avoid
740 * collision with interface with the same name in the default vrf (can
741 * occur with this implementation whereas it is not possible with
744 if (ifp
->vrf_id
&& !vrf_is_backend_netns())
745 if_handle_vrf_change(ifp
, VRF_DEFAULT
);
747 /* Reset some zebra interface params to default values. */
750 zif
->zif_type
= ZEBRA_IF_OTHER
;
751 zif
->zif_slave_type
= ZEBRA_IF_SLAVE_NONE
;
752 memset(&zif
->l2info
, 0, sizeof(union zebra_l2if_info
));
753 memset(&zif
->brslave_info
, 0,
754 sizeof(struct zebra_l2info_brslave
));
758 /* VRF change for an interface */
759 void if_handle_vrf_change(struct interface
*ifp
, vrf_id_t vrf_id
)
763 old_vrf_id
= ifp
->vrf_id
;
765 /* Uninstall connected routes. */
766 if_uninstall_connected(ifp
);
768 /* Delete any IPv4 neighbors created to implement RFC 5549 */
769 if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(ifp
);
771 /* Delete all neighbor addresses learnt through IPv6 RA */
772 if_down_del_nbr_connected(ifp
);
774 /* Send out notification on interface VRF change. */
775 /* This is to issue an UPDATE or a DELETE, as appropriate. */
776 zebra_interface_vrf_update_del(ifp
, vrf_id
);
779 if_update_to_new_vrf(ifp
, vrf_id
);
781 /* Send out notification on interface VRF change. */
782 /* This is to issue an ADD, if needed. */
783 zebra_interface_vrf_update_add(ifp
, old_vrf_id
);
785 /* Install connected routes (in new VRF). */
786 if (if_is_operative(ifp
))
787 if_install_connected(ifp
);
789 /* Due to connected route change, schedule RIB processing for both old
792 if (IS_ZEBRA_DEBUG_RIB_DETAILED
)
793 zlog_debug("%u: IF %s VRF change, scheduling RIB processing",
794 ifp
->vrf_id
, ifp
->name
);
795 rib_update(old_vrf_id
, RIB_UPDATE_IF_CHANGE
);
796 rib_update(ifp
->vrf_id
, RIB_UPDATE_IF_CHANGE
);
799 static void ipv6_ll_address_to_mac(struct in6_addr
*address
, uint8_t *mac
)
801 mac
[0] = address
->s6_addr
[8] ^ 0x02;
802 mac
[1] = address
->s6_addr
[9];
803 mac
[2] = address
->s6_addr
[10];
804 mac
[3] = address
->s6_addr
[13];
805 mac
[4] = address
->s6_addr
[14];
806 mac
[5] = address
->s6_addr
[15];
809 void if_nbr_mac_to_ipv4ll_neigh_update(struct interface
*ifp
,
811 struct in6_addr
*address
,
814 struct zebra_vrf
*zvrf
= vrf_info_lookup(ifp
->vrf_id
);
815 struct zebra_if
*zif
= ifp
->info
;
816 char buf
[16] = "169.254.0.1";
817 struct in_addr ipv4_ll
;
820 inet_pton(AF_INET
, buf
, &ipv4_ll
);
822 ns_id
= zvrf
->zns
->ns_id
;
825 * Remove and re-add any existing neighbor entry for this address,
826 * since Netlink doesn't currently offer update message types.
828 kernel_neigh_update(0, ifp
->ifindex
, ipv4_ll
.s_addr
, mac
, 6, ns_id
);
830 /* Add new neighbor entry.
832 * We force installation even if current neighbor entry is the same.
833 * Since this function is used to refresh our MAC entries after an
834 * interface flap, if we don't force in our custom entries with their
835 * state set to PERMANENT or REACHABLE then the kernel will attempt to
836 * resolve our leftover entries, fail, mark them unreachable and then
837 * they'll be useless to us.
840 kernel_neigh_update(add
, ifp
->ifindex
, ipv4_ll
.s_addr
, mac
, 6,
843 memcpy(&zif
->neigh_mac
[0], &mac
[0], 6);
846 * We need to note whether or not we originated a v6
847 * neighbor entry for this interface. So that when
848 * someone unwisely accidently deletes this entry
849 * we can shove it back in.
851 zif
->v6_2_v4_ll_neigh_entry
= !!add
;
852 memcpy(&zif
->v6_2_v4_ll_addr6
, address
, sizeof(*address
));
854 zvrf
->neigh_updates
++;
857 void if_nbr_ipv6ll_to_ipv4ll_neigh_update(struct interface
*ifp
,
858 struct in6_addr
*address
, int add
)
863 ipv6_ll_address_to_mac(address
, (uint8_t *)mac
);
864 if_nbr_mac_to_ipv4ll_neigh_update(ifp
, mac
, address
, add
);
867 static void if_nbr_ipv6ll_to_ipv4ll_neigh_add_all(struct interface
*ifp
)
869 if (listhead(ifp
->nbr_connected
)) {
870 struct nbr_connected
*nbr_connected
;
871 struct listnode
*node
;
873 for (ALL_LIST_ELEMENTS_RO(ifp
->nbr_connected
, node
,
875 if_nbr_ipv6ll_to_ipv4ll_neigh_update(
876 ifp
, &nbr_connected
->address
->u
.prefix6
, 1);
880 void if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(struct interface
*ifp
)
882 if (listhead(ifp
->nbr_connected
)) {
883 struct nbr_connected
*nbr_connected
;
884 struct listnode
*node
;
886 for (ALL_LIST_ELEMENTS_RO(ifp
->nbr_connected
, node
,
888 if_nbr_ipv6ll_to_ipv4ll_neigh_update(
889 ifp
, &nbr_connected
->address
->u
.prefix6
, 0);
893 static void if_down_del_nbr_connected(struct interface
*ifp
)
895 struct nbr_connected
*nbr_connected
;
896 struct listnode
*node
, *nnode
;
898 for (ALL_LIST_ELEMENTS(ifp
->nbr_connected
, node
, nnode
,
900 listnode_delete(ifp
->nbr_connected
, nbr_connected
);
901 nbr_connected_free(nbr_connected
);
905 /* Interface is up. */
906 void if_up(struct interface
*ifp
)
908 struct zebra_if
*zif
;
909 struct interface
*link_if
;
910 struct zebra_vrf
*zvrf
= vrf_info_lookup(ifp
->vrf_id
);
914 quagga_timestamp(2, zif
->up_last
, sizeof(zif
->up_last
));
916 /* Notify the protocol daemons. */
917 if (ifp
->ptm_enable
&& (ifp
->ptm_status
== ZEBRA_PTM_STATUS_DOWN
)) {
918 flog_warn(EC_ZEBRA_PTM_NOT_READY
,
919 "%s: interface %s hasn't passed ptm check\n",
920 __func__
, ifp
->name
);
923 zebra_interface_up_update(ifp
);
925 if_nbr_ipv6ll_to_ipv4ll_neigh_add_all(ifp
);
927 #if defined(HAVE_RTADV)
928 /* Enable fast tx of RA if enabled && RA interval is not in msecs */
929 if (zif
->rtadv
.AdvSendAdvertisements
930 && (zif
->rtadv
.MaxRtrAdvInterval
>= 1000)) {
931 zif
->rtadv
.inFastRexmit
= 1;
932 zif
->rtadv
.NumFastReXmitsRemain
= RTADV_NUM_FAST_REXMITS
;
936 /* Install connected routes to the kernel. */
937 if_install_connected(ifp
);
939 if (IS_ZEBRA_DEBUG_RIB_DETAILED
)
940 zlog_debug("%u: IF %s up, scheduling RIB processing",
941 ifp
->vrf_id
, ifp
->name
);
942 rib_update(ifp
->vrf_id
, RIB_UPDATE_IF_CHANGE
);
944 /* Handle interface up for specific types for EVPN. Non-VxLAN interfaces
945 * are checked to see if (remote) neighbor entries need to be installed
946 * on them for ARP suppression.
948 if (IS_ZEBRA_IF_VXLAN(ifp
))
949 zebra_vxlan_if_up(ifp
);
950 else if (IS_ZEBRA_IF_BRIDGE(ifp
)) {
952 zebra_vxlan_svi_up(ifp
, link_if
);
953 } else if (IS_ZEBRA_IF_VLAN(ifp
)) {
954 link_if
= if_lookup_by_index_per_ns(zvrf
->zns
,
957 zebra_vxlan_svi_up(ifp
, link_if
);
961 /* Interface goes down. We have to manage different behavior of based
963 void if_down(struct interface
*ifp
)
965 struct zebra_if
*zif
;
966 struct interface
*link_if
;
967 struct zebra_vrf
*zvrf
= vrf_info_lookup(ifp
->vrf_id
);
971 quagga_timestamp(2, zif
->down_last
, sizeof(zif
->down_last
));
973 /* Handle interface down for specific types for EVPN. Non-VxLAN
975 * are checked to see if (remote) neighbor entries need to be purged
976 * for ARP suppression.
978 if (IS_ZEBRA_IF_VXLAN(ifp
))
979 zebra_vxlan_if_down(ifp
);
980 else if (IS_ZEBRA_IF_BRIDGE(ifp
)) {
982 zebra_vxlan_svi_down(ifp
, link_if
);
983 } else if (IS_ZEBRA_IF_VLAN(ifp
)) {
984 link_if
= if_lookup_by_index_per_ns(zvrf
->zns
,
987 zebra_vxlan_svi_down(ifp
, link_if
);
991 /* Notify to the protocol daemons. */
992 zebra_interface_down_update(ifp
);
994 /* Uninstall connected routes from the kernel. */
995 if_uninstall_connected(ifp
);
997 if (IS_ZEBRA_DEBUG_RIB_DETAILED
)
998 zlog_debug("%u: IF %s down, scheduling RIB processing",
999 ifp
->vrf_id
, ifp
->name
);
1000 rib_update(ifp
->vrf_id
, RIB_UPDATE_IF_CHANGE
);
1002 if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(ifp
);
1004 /* Delete all neighbor addresses learnt through IPv6 RA */
1005 if_down_del_nbr_connected(ifp
);
1008 void if_refresh(struct interface
*ifp
)
1013 void zebra_if_update_link(struct interface
*ifp
, ifindex_t link_ifindex
,
1016 struct zebra_if
*zif
;
1018 if (IS_ZEBRA_IF_VETH(ifp
))
1020 zif
= (struct zebra_if
*)ifp
->info
;
1021 zif
->link_ifindex
= link_ifindex
;
1022 zif
->link
= if_lookup_by_index_per_ns(zebra_ns_lookup(ns_id
),
1027 * during initial link dump kernel does not order lower devices before
1028 * upper devices so we need to fixup link dependencies at the end of dump
1030 void zebra_if_update_all_links(void)
1032 struct route_node
*rn
;
1033 struct interface
*ifp
;
1034 struct zebra_if
*zif
;
1035 struct zebra_ns
*ns
;
1037 if (IS_ZEBRA_DEBUG_KERNEL
)
1038 zlog_info("fixup link dependencies");
1040 ns
= zebra_ns_lookup(NS_DEFAULT
);
1041 for (rn
= route_top(ns
->if_table
); rn
; rn
= route_next(rn
)) {
1042 ifp
= (struct interface
*)rn
->info
;
1046 if ((zif
->link_ifindex
!= IFINDEX_INTERNAL
) && !zif
->link
) {
1047 zif
->link
= if_lookup_by_index_per_ns(ns
,
1049 if (IS_ZEBRA_DEBUG_KERNEL
)
1050 zlog_debug("interface %s/%d's lower fixup to %s/%d",
1051 ifp
->name
, ifp
->ifindex
,
1052 zif
->link
?zif
->link
->name
:"unk",
1060 /* Output prefix string to vty. */
1061 static int prefix_vty_out(struct vty
*vty
, struct prefix
*p
)
1063 char str
[INET6_ADDRSTRLEN
];
1065 inet_ntop(p
->family
, &p
->u
.prefix
, str
, sizeof(str
));
1066 vty_out(vty
, "%s", str
);
1070 /* Dump if address information to vty. */
1071 static void connected_dump_vty(struct vty
*vty
, struct connected
*connected
)
1075 /* Print interface address. */
1076 p
= connected
->address
;
1077 vty_out(vty
, " %s ", prefix_family_str(p
));
1078 prefix_vty_out(vty
, p
);
1079 vty_out(vty
, "/%d", p
->prefixlen
);
1081 /* If there is destination address, print it. */
1082 if (connected
->destination
) {
1084 (CONNECTED_PEER(connected
) ? " peer " : " broadcast "));
1085 prefix_vty_out(vty
, connected
->destination
);
1086 if (CONNECTED_PEER(connected
))
1087 vty_out(vty
, "/%d", connected
->destination
->prefixlen
);
1090 if (CHECK_FLAG(connected
->flags
, ZEBRA_IFA_SECONDARY
))
1091 vty_out(vty
, " secondary");
1093 if (CHECK_FLAG(connected
->flags
, ZEBRA_IFA_UNNUMBERED
))
1094 vty_out(vty
, " unnumbered");
1096 if (connected
->label
)
1097 vty_out(vty
, " %s", connected
->label
);
1102 /* Dump interface neighbor address information to vty. */
1103 static void nbr_connected_dump_vty(struct vty
*vty
,
1104 struct nbr_connected
*connected
)
1108 /* Print interface address. */
1109 p
= connected
->address
;
1110 vty_out(vty
, " %s ", prefix_family_str(p
));
1111 prefix_vty_out(vty
, p
);
1112 vty_out(vty
, "/%d", p
->prefixlen
);
1117 static const char *zebra_ziftype_2str(zebra_iftype_t zif_type
)
1120 case ZEBRA_IF_OTHER
:
1124 case ZEBRA_IF_BRIDGE
:
1132 case ZEBRA_IF_VXLAN
:
1147 case ZEBRA_IF_BOND_SLAVE
:
1148 return "bond_slave";
1150 case ZEBRA_IF_MACVLAN
:
1159 /* Interface's information print out to vty interface. */
1160 static void if_dump_vty(struct vty
*vty
, struct interface
*ifp
)
1162 struct connected
*connected
;
1163 struct nbr_connected
*nbr_connected
;
1164 struct listnode
*node
;
1165 struct route_node
*rn
;
1166 struct zebra_if
*zebra_if
;
1169 zebra_if
= ifp
->info
;
1171 vty_out(vty
, "Interface %s is ", ifp
->name
);
1172 if (if_is_up(ifp
)) {
1173 vty_out(vty
, "up, line protocol ");
1175 if (CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
)) {
1176 if (if_is_running(ifp
))
1177 vty_out(vty
, "is up\n");
1179 vty_out(vty
, "is down\n");
1181 vty_out(vty
, "detection is disabled\n");
1184 vty_out(vty
, "down\n");
1187 vty_out(vty
, " Link ups: %5u last: %s\n", zebra_if
->up_count
,
1188 zebra_if
->up_last
[0] ? zebra_if
->up_last
: "(never)");
1189 vty_out(vty
, " Link downs: %5u last: %s\n", zebra_if
->down_count
,
1190 zebra_if
->down_last
[0] ? zebra_if
->down_last
: "(never)");
1192 zebra_ptm_show_status(vty
, ifp
);
1194 vrf
= vrf_lookup_by_id(ifp
->vrf_id
);
1195 vty_out(vty
, " vrf: %s\n", vrf
->name
);
1198 vty_out(vty
, " Description: %s\n", ifp
->desc
);
1199 if (ifp
->ifindex
== IFINDEX_INTERNAL
) {
1200 vty_out(vty
, " pseudo interface\n");
1202 } else if (!CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
1203 vty_out(vty
, " index %d inactive interface\n", ifp
->ifindex
);
1207 vty_out(vty
, " index %d metric %d mtu %d speed %u ", ifp
->ifindex
,
1208 ifp
->metric
, ifp
->mtu
, ifp
->speed
);
1209 if (ifp
->mtu6
!= ifp
->mtu
)
1210 vty_out(vty
, "mtu6 %d ", ifp
->mtu6
);
1211 vty_out(vty
, "\n flags: %s\n", if_flag_dump(ifp
->flags
));
1213 /* Hardware address. */
1214 vty_out(vty
, " Type: %s\n", if_link_type_str(ifp
->ll_type
));
1215 if (ifp
->hw_addr_len
!= 0) {
1218 vty_out(vty
, " HWaddr: ");
1219 for (i
= 0; i
< ifp
->hw_addr_len
; i
++)
1220 vty_out(vty
, "%s%02x", i
== 0 ? "" : ":",
1225 /* Bandwidth in Mbps */
1226 if (ifp
->bandwidth
!= 0) {
1227 vty_out(vty
, " bandwidth %u Mbps", ifp
->bandwidth
);
1231 for (rn
= route_top(zebra_if
->ipv4_subnets
); rn
; rn
= route_next(rn
)) {
1235 for (ALL_LIST_ELEMENTS_RO((struct list
*)rn
->info
, node
,
1237 connected_dump_vty(vty
, connected
);
1240 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, node
, connected
)) {
1241 if (CHECK_FLAG(connected
->conf
, ZEBRA_IFC_REAL
)
1242 && (connected
->address
->family
== AF_INET6
))
1243 connected_dump_vty(vty
, connected
);
1246 vty_out(vty
, " Interface Type %s\n",
1247 zebra_ziftype_2str(zebra_if
->zif_type
));
1248 if (IS_ZEBRA_IF_BRIDGE(ifp
)) {
1249 struct zebra_l2info_bridge
*bridge_info
;
1251 bridge_info
= &zebra_if
->l2info
.br
;
1252 vty_out(vty
, " Bridge VLAN-aware: %s\n",
1253 bridge_info
->vlan_aware
? "yes" : "no");
1254 } else if (IS_ZEBRA_IF_VLAN(ifp
)) {
1255 struct zebra_l2info_vlan
*vlan_info
;
1257 vlan_info
= &zebra_if
->l2info
.vl
;
1258 vty_out(vty
, " VLAN Id %u\n", vlan_info
->vid
);
1259 } else if (IS_ZEBRA_IF_VXLAN(ifp
)) {
1260 struct zebra_l2info_vxlan
*vxlan_info
;
1262 vxlan_info
= &zebra_if
->l2info
.vxl
;
1263 vty_out(vty
, " VxLAN Id %u", vxlan_info
->vni
);
1264 if (vxlan_info
->vtep_ip
.s_addr
!= INADDR_ANY
)
1265 vty_out(vty
, " VTEP IP: %s",
1266 inet_ntoa(vxlan_info
->vtep_ip
));
1267 if (vxlan_info
->access_vlan
)
1268 vty_out(vty
, " Access VLAN Id %u",
1269 vxlan_info
->access_vlan
);
1273 if (IS_ZEBRA_IF_BRIDGE_SLAVE(ifp
)) {
1274 struct zebra_l2info_brslave
*br_slave
;
1276 br_slave
= &zebra_if
->brslave_info
;
1277 if (br_slave
->bridge_ifindex
!= IFINDEX_INTERNAL
)
1278 vty_out(vty
, " Master (bridge) ifindex %u\n",
1279 br_slave
->bridge_ifindex
);
1282 if (IS_ZEBRA_IF_BOND_SLAVE(ifp
)) {
1283 struct zebra_l2info_bondslave
*bond_slave
;
1285 bond_slave
= &zebra_if
->bondslave_info
;
1286 if (bond_slave
->bond_ifindex
!= IFINDEX_INTERNAL
)
1287 vty_out(vty
, " Master (bond) ifindex %u\n",
1288 bond_slave
->bond_ifindex
);
1291 if (zebra_if
->link_ifindex
!= IFINDEX_INTERNAL
) {
1292 vty_out(vty
, " Link ifindex %u", zebra_if
->link_ifindex
);
1294 vty_out(vty
, "(%s)\n", zebra_if
->link
->name
);
1296 vty_out(vty
, "(Unknown)\n");
1299 if (HAS_LINK_PARAMS(ifp
)) {
1301 struct if_link_params
*iflp
= ifp
->link_params
;
1302 vty_out(vty
, " Traffic Engineering Link Parameters:\n");
1303 if (IS_PARAM_SET(iflp
, LP_TE_METRIC
))
1304 vty_out(vty
, " TE metric %u\n", iflp
->te_metric
);
1305 if (IS_PARAM_SET(iflp
, LP_MAX_BW
))
1306 vty_out(vty
, " Maximum Bandwidth %g (Byte/s)\n",
1308 if (IS_PARAM_SET(iflp
, LP_MAX_RSV_BW
))
1310 " Maximum Reservable Bandwidth %g (Byte/s)\n",
1312 if (IS_PARAM_SET(iflp
, LP_UNRSV_BW
)) {
1314 " Unreserved Bandwidth per Class Type in Byte/s:\n");
1315 for (i
= 0; i
< MAX_CLASS_TYPE
; i
+= 2)
1317 " [%d]: %g (Bytes/sec),\t[%d]: %g (Bytes/sec)\n",
1318 i
, iflp
->unrsv_bw
[i
], i
+ 1,
1319 iflp
->unrsv_bw
[i
+ 1]);
1322 if (IS_PARAM_SET(iflp
, LP_ADM_GRP
))
1323 vty_out(vty
, " Administrative Group:%u\n",
1325 if (IS_PARAM_SET(iflp
, LP_DELAY
)) {
1326 vty_out(vty
, " Link Delay Average: %u (micro-sec.)",
1328 if (IS_PARAM_SET(iflp
, LP_MM_DELAY
)) {
1329 vty_out(vty
, " Min: %u (micro-sec.)",
1331 vty_out(vty
, " Max: %u (micro-sec.)",
1336 if (IS_PARAM_SET(iflp
, LP_DELAY_VAR
))
1338 " Link Delay Variation %u (micro-sec.)\n",
1340 if (IS_PARAM_SET(iflp
, LP_PKT_LOSS
))
1341 vty_out(vty
, " Link Packet Loss %g (in %%)\n",
1343 if (IS_PARAM_SET(iflp
, LP_AVA_BW
))
1344 vty_out(vty
, " Available Bandwidth %g (Byte/s)\n",
1346 if (IS_PARAM_SET(iflp
, LP_RES_BW
))
1347 vty_out(vty
, " Residual Bandwidth %g (Byte/s)\n",
1349 if (IS_PARAM_SET(iflp
, LP_USE_BW
))
1350 vty_out(vty
, " Utilized Bandwidth %g (Byte/s)\n",
1352 if (IS_PARAM_SET(iflp
, LP_RMT_AS
))
1353 vty_out(vty
, " Neighbor ASBR IP: %s AS: %u \n",
1354 inet_ntoa(iflp
->rmt_ip
), iflp
->rmt_as
);
1357 hook_call(zebra_if_extra_info
, vty
, ifp
);
1359 if (listhead(ifp
->nbr_connected
))
1360 vty_out(vty
, " Neighbor address(s):\n");
1361 for (ALL_LIST_ELEMENTS_RO(ifp
->nbr_connected
, node
, nbr_connected
))
1362 nbr_connected_dump_vty(vty
, nbr_connected
);
1364 #ifdef HAVE_PROC_NET_DEV
1365 /* Statistics print out using proc file system. */
1367 " %lu input packets (%lu multicast), %lu bytes, "
1369 ifp
->stats
.rx_packets
, ifp
->stats
.rx_multicast
,
1370 ifp
->stats
.rx_bytes
, ifp
->stats
.rx_dropped
);
1373 " %lu input errors, %lu length, %lu overrun,"
1374 " %lu CRC, %lu frame\n",
1375 ifp
->stats
.rx_errors
, ifp
->stats
.rx_length_errors
,
1376 ifp
->stats
.rx_over_errors
, ifp
->stats
.rx_crc_errors
,
1377 ifp
->stats
.rx_frame_errors
);
1379 vty_out(vty
, " %lu fifo, %lu missed\n", ifp
->stats
.rx_fifo_errors
,
1380 ifp
->stats
.rx_missed_errors
);
1382 vty_out(vty
, " %lu output packets, %lu bytes, %lu dropped\n",
1383 ifp
->stats
.tx_packets
, ifp
->stats
.tx_bytes
,
1384 ifp
->stats
.tx_dropped
);
1387 " %lu output errors, %lu aborted, %lu carrier,"
1388 " %lu fifo, %lu heartbeat\n",
1389 ifp
->stats
.tx_errors
, ifp
->stats
.tx_aborted_errors
,
1390 ifp
->stats
.tx_carrier_errors
, ifp
->stats
.tx_fifo_errors
,
1391 ifp
->stats
.tx_heartbeat_errors
);
1393 vty_out(vty
, " %lu window, %lu collisions\n",
1394 ifp
->stats
.tx_window_errors
, ifp
->stats
.collisions
);
1395 #endif /* HAVE_PROC_NET_DEV */
1397 #ifdef HAVE_NET_RT_IFLIST
1398 #if defined(__bsdi__) || defined(__NetBSD__)
1399 /* Statistics print out using sysctl (). */
1401 " input packets %llu, bytes %llu, dropped %llu,"
1402 " multicast packets %llu\n",
1403 (unsigned long long)ifp
->stats
.ifi_ipackets
,
1404 (unsigned long long)ifp
->stats
.ifi_ibytes
,
1405 (unsigned long long)ifp
->stats
.ifi_iqdrops
,
1406 (unsigned long long)ifp
->stats
.ifi_imcasts
);
1408 vty_out(vty
, " input errors %llu\n",
1409 (unsigned long long)ifp
->stats
.ifi_ierrors
);
1412 " output packets %llu, bytes %llu,"
1413 " multicast packets %llu\n",
1414 (unsigned long long)ifp
->stats
.ifi_opackets
,
1415 (unsigned long long)ifp
->stats
.ifi_obytes
,
1416 (unsigned long long)ifp
->stats
.ifi_omcasts
);
1418 vty_out(vty
, " output errors %llu\n",
1419 (unsigned long long)ifp
->stats
.ifi_oerrors
);
1421 vty_out(vty
, " collisions %llu\n",
1422 (unsigned long long)ifp
->stats
.ifi_collisions
);
1424 /* Statistics print out using sysctl (). */
1426 " input packets %lu, bytes %lu, dropped %lu,"
1427 " multicast packets %lu\n",
1428 ifp
->stats
.ifi_ipackets
, ifp
->stats
.ifi_ibytes
,
1429 ifp
->stats
.ifi_iqdrops
, ifp
->stats
.ifi_imcasts
);
1431 vty_out(vty
, " input errors %lu\n", ifp
->stats
.ifi_ierrors
);
1434 " output packets %lu, bytes %lu, multicast packets %lu\n",
1435 ifp
->stats
.ifi_opackets
, ifp
->stats
.ifi_obytes
,
1436 ifp
->stats
.ifi_omcasts
);
1438 vty_out(vty
, " output errors %lu\n", ifp
->stats
.ifi_oerrors
);
1440 vty_out(vty
, " collisions %lu\n", ifp
->stats
.ifi_collisions
);
1441 #endif /* __bsdi__ || __NetBSD__ */
1442 #endif /* HAVE_NET_RT_IFLIST */
1445 static void interface_update_stats(void)
1447 #ifdef HAVE_PROC_NET_DEV
1448 /* If system has interface statistics via proc file system, update
1450 ifstat_update_proc();
1451 #endif /* HAVE_PROC_NET_DEV */
1452 #ifdef HAVE_NET_RT_IFLIST
1453 ifstat_update_sysctl();
1454 #endif /* HAVE_NET_RT_IFLIST */
1457 struct cmd_node interface_node
= {INTERFACE_NODE
, "%s(config-if)# ", 1};
1459 /* Show all interfaces to vty. */
1460 DEFUN (show_interface
,
1462 "show interface [vrf NAME]",
1464 "Interface status and configuration\n"
1468 struct interface
*ifp
;
1469 vrf_id_t vrf_id
= VRF_DEFAULT
;
1471 interface_update_stats();
1474 VRF_GET_ID(vrf_id
, argv
[3]->arg
, false);
1476 /* All interface print. */
1477 vrf
= vrf_lookup_by_id(vrf_id
);
1478 FOR_ALL_INTERFACES (vrf
, ifp
)
1479 if_dump_vty(vty
, ifp
);
1485 /* Show all interfaces to vty. */
1486 DEFUN (show_interface_vrf_all
,
1487 show_interface_vrf_all_cmd
,
1488 "show interface vrf all",
1490 "Interface status and configuration\n"
1491 VRF_ALL_CMD_HELP_STR
)
1494 struct interface
*ifp
;
1496 interface_update_stats();
1498 /* All interface print. */
1499 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
)
1500 FOR_ALL_INTERFACES (vrf
, ifp
)
1501 if_dump_vty(vty
, ifp
);
1506 /* Show specified interface to vty. */
1508 DEFUN (show_interface_name_vrf
,
1509 show_interface_name_vrf_cmd
,
1510 "show interface IFNAME vrf NAME",
1512 "Interface status and configuration\n"
1518 struct interface
*ifp
;
1521 interface_update_stats();
1523 VRF_GET_ID(vrf_id
, argv
[idx_name
]->arg
, false);
1525 /* Specified interface print. */
1526 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
1528 vty_out(vty
, "%% Can't find interface %s\n",
1529 argv
[idx_ifname
]->arg
);
1532 if_dump_vty(vty
, ifp
);
1537 /* Show specified interface to vty. */
1538 DEFUN (show_interface_name_vrf_all
,
1539 show_interface_name_vrf_all_cmd
,
1540 "show interface IFNAME [vrf all]",
1542 "Interface status and configuration\n"
1544 VRF_ALL_CMD_HELP_STR
)
1548 struct interface
*ifp
;
1551 interface_update_stats();
1553 /* All interface print. */
1554 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
1555 /* Specified interface print. */
1556 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf
->vrf_id
);
1558 if_dump_vty(vty
, ifp
);
1564 vty_out(vty
, "%% Can't find interface %s\n",
1565 argv
[idx_ifname
]->arg
);
1573 static void if_show_description(struct vty
*vty
, vrf_id_t vrf_id
)
1575 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
1576 struct interface
*ifp
;
1578 vty_out(vty
, "Interface Status Protocol Description\n");
1579 FOR_ALL_INTERFACES (vrf
, ifp
) {
1582 len
= vty_out(vty
, "%s", ifp
->name
);
1583 vty_out(vty
, "%*s", (16 - len
), " ");
1585 if (if_is_up(ifp
)) {
1586 vty_out(vty
, "up ");
1587 if (CHECK_FLAG(ifp
->status
,
1588 ZEBRA_INTERFACE_LINKDETECTION
)) {
1589 if (if_is_running(ifp
))
1590 vty_out(vty
, "up ");
1592 vty_out(vty
, "down ");
1594 vty_out(vty
, "unknown ");
1597 vty_out(vty
, "down down ");
1601 vty_out(vty
, "%s", ifp
->desc
);
1606 DEFUN (show_interface_desc
,
1607 show_interface_desc_cmd
,
1608 "show interface description [vrf NAME]",
1610 "Interface status and configuration\n"
1611 "Interface description\n"
1614 vrf_id_t vrf_id
= VRF_DEFAULT
;
1617 VRF_GET_ID(vrf_id
, argv
[4]->arg
, false);
1619 if_show_description(vty
, vrf_id
);
1625 DEFUN (show_interface_desc_vrf_all
,
1626 show_interface_desc_vrf_all_cmd
,
1627 "show interface description vrf all",
1629 "Interface status and configuration\n"
1630 "Interface description\n"
1631 VRF_ALL_CMD_HELP_STR
)
1635 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
)
1636 if (!RB_EMPTY(if_name_head
, &vrf
->ifaces_by_name
)) {
1637 vty_out(vty
, "\n\tVRF %u\n\n", vrf
->vrf_id
);
1638 if_show_description(vty
, vrf
->vrf_id
);
1647 "Set multicast flag to interface\n")
1649 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1651 struct zebra_if
*if_data
;
1653 if (CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
1654 ret
= if_set_flags(ifp
, IFF_MULTICAST
);
1656 vty_out(vty
, "Can't set multicast flag\n");
1657 return CMD_WARNING_CONFIG_FAILED
;
1661 if_data
= ifp
->info
;
1662 if_data
->multicast
= IF_ZEBRA_MULTICAST_ON
;
1667 DEFUN (no_multicast
,
1671 "Unset multicast flag to interface\n")
1673 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1675 struct zebra_if
*if_data
;
1677 if (CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
1678 ret
= if_unset_flags(ifp
, IFF_MULTICAST
);
1680 vty_out(vty
, "Can't unset multicast flag\n");
1681 return CMD_WARNING_CONFIG_FAILED
;
1685 if_data
= ifp
->info
;
1686 if_data
->multicast
= IF_ZEBRA_MULTICAST_OFF
;
1694 "Enable link detection on interface\n")
1696 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1697 int if_was_operative
;
1699 if_was_operative
= if_is_no_ptm_operative(ifp
);
1700 SET_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
);
1702 /* When linkdetection is enabled, if might come down */
1703 if (!if_is_no_ptm_operative(ifp
) && if_was_operative
)
1706 /* FIXME: Will defer status change forwarding if interface
1707 does not come down! */
1713 DEFUN (no_linkdetect
,
1717 "Disable link detection on interface\n")
1719 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1720 int if_was_operative
;
1722 if_was_operative
= if_is_no_ptm_operative(ifp
);
1723 UNSET_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
);
1725 /* Interface may come up after disabling link detection */
1726 if (if_is_operative(ifp
) && !if_was_operative
)
1729 /* FIXME: see linkdetect_cmd */
1737 "Shutdown the selected interface\n")
1739 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1741 struct zebra_if
*if_data
;
1743 if (ifp
->ifindex
!= IFINDEX_INTERNAL
) {
1744 ret
= if_unset_flags(ifp
, IFF_UP
);
1746 vty_out(vty
, "Can't shutdown interface\n");
1747 return CMD_WARNING_CONFIG_FAILED
;
1751 if_data
= ifp
->info
;
1752 if_data
->shutdown
= IF_ZEBRA_SHUTDOWN_ON
;
1757 DEFUN (no_shutdown_if
,
1761 "Shutdown the selected interface\n")
1763 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1765 struct zebra_if
*if_data
;
1767 if (ifp
->ifindex
!= IFINDEX_INTERNAL
) {
1768 ret
= if_set_flags(ifp
, IFF_UP
| IFF_RUNNING
);
1770 vty_out(vty
, "Can't up interface\n");
1771 return CMD_WARNING_CONFIG_FAILED
;
1775 /* Some addresses (in particular, IPv6 addresses on Linux) get
1776 * removed when the interface goes down. They need to be
1779 if_addr_wakeup(ifp
);
1782 if_data
= ifp
->info
;
1783 if_data
->shutdown
= IF_ZEBRA_SHUTDOWN_OFF
;
1788 DEFUN (bandwidth_if
,
1790 "bandwidth (1-100000)",
1791 "Set bandwidth informational parameter\n"
1792 "Bandwidth in megabits\n")
1795 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1796 unsigned int bandwidth
;
1798 bandwidth
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
1800 /* bandwidth range is <1-100000> */
1801 if (bandwidth
< 1 || bandwidth
> 100000) {
1802 vty_out(vty
, "Bandwidth is invalid\n");
1803 return CMD_WARNING_CONFIG_FAILED
;
1806 ifp
->bandwidth
= bandwidth
;
1808 /* force protocols to recalculate routes due to cost change */
1809 if (if_is_operative(ifp
))
1810 zebra_interface_up_update(ifp
);
1815 DEFUN (no_bandwidth_if
,
1816 no_bandwidth_if_cmd
,
1817 "no bandwidth [(1-100000)]",
1819 "Set bandwidth informational parameter\n"
1820 "Bandwidth in megabits\n")
1822 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1826 /* force protocols to recalculate routes due to cost change */
1827 if (if_is_operative(ifp
))
1828 zebra_interface_up_update(ifp
);
1834 struct cmd_node link_params_node
= {
1835 LINK_PARAMS_NODE
, "%s(config-link-params)# ", 1,
1838 static void link_param_cmd_set_uint32(struct interface
*ifp
, uint32_t *field
,
1839 uint32_t type
, uint32_t value
)
1841 /* Update field as needed */
1842 if (IS_PARAM_UNSET(ifp
->link_params
, type
) || *field
!= value
) {
1844 SET_PARAM(ifp
->link_params
, type
);
1846 /* force protocols to update LINK STATE due to parameters change
1848 if (if_is_operative(ifp
))
1849 zebra_interface_parameters_update(ifp
);
1852 static void link_param_cmd_set_float(struct interface
*ifp
, float *field
,
1853 uint32_t type
, float value
)
1856 /* Update field as needed */
1857 if (IS_PARAM_UNSET(ifp
->link_params
, type
) || *field
!= value
) {
1859 SET_PARAM(ifp
->link_params
, type
);
1861 /* force protocols to update LINK STATE due to parameters change
1863 if (if_is_operative(ifp
))
1864 zebra_interface_parameters_update(ifp
);
1868 static void link_param_cmd_unset(struct interface
*ifp
, uint32_t type
)
1870 if (ifp
->link_params
== NULL
)
1874 UNSET_PARAM(ifp
->link_params
, type
);
1876 /* force protocols to update LINK STATE due to parameters change */
1877 if (if_is_operative(ifp
))
1878 zebra_interface_parameters_update(ifp
);
1881 DEFUN_NOSH (link_params
,
1886 /* vty->qobj_index stays the same @ interface pointer */
1887 vty
->node
= LINK_PARAMS_NODE
;
1892 DEFUN_NOSH (exit_link_params
,
1893 exit_link_params_cmd
,
1895 "Exit from Link Params configuration mode\n")
1897 if (vty
->node
== LINK_PARAMS_NODE
)
1898 vty
->node
= INTERFACE_NODE
;
1902 /* Specific Traffic Engineering parameters commands */
1903 DEFUN (link_params_enable
,
1904 link_params_enable_cmd
,
1906 "Activate link parameters on this interface\n")
1908 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1910 /* This command could be issue at startup, when activate MPLS TE */
1911 /* on a new interface or after a ON / OFF / ON toggle */
1912 /* In all case, TE parameters are reset to their default factory */
1913 if (IS_ZEBRA_DEBUG_EVENT
)
1915 "Link-params: enable TE link parameters on interface %s",
1918 if (!if_link_params_get(ifp
)) {
1919 if (IS_ZEBRA_DEBUG_EVENT
)
1921 "Link-params: failed to init TE link parameters %s",
1924 return CMD_WARNING_CONFIG_FAILED
;
1927 /* force protocols to update LINK STATE due to parameters change */
1928 if (if_is_operative(ifp
))
1929 zebra_interface_parameters_update(ifp
);
1934 DEFUN (no_link_params_enable
,
1935 no_link_params_enable_cmd
,
1938 "Disable link parameters on this interface\n")
1940 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1942 zlog_debug("MPLS-TE: disable TE link parameters on interface %s",
1945 if_link_params_free(ifp
);
1947 /* force protocols to update LINK STATE due to parameters change */
1948 if (if_is_operative(ifp
))
1949 zebra_interface_parameters_update(ifp
);
1954 /* STANDARD TE metrics */
1955 DEFUN (link_params_metric
,
1956 link_params_metric_cmd
,
1957 "metric (0-4294967295)",
1958 "Link metric for MPLS-TE purpose\n"
1959 "Metric value in decimal\n")
1962 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1963 struct if_link_params
*iflp
= if_link_params_get(ifp
);
1966 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1968 /* Update TE metric if needed */
1969 link_param_cmd_set_uint32(ifp
, &iflp
->te_metric
, LP_TE_METRIC
, metric
);
1974 DEFUN (no_link_params_metric
,
1975 no_link_params_metric_cmd
,
1978 "Disable Link Metric on this interface\n")
1980 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1982 /* Unset TE Metric */
1983 link_param_cmd_unset(ifp
, LP_TE_METRIC
);
1988 DEFUN (link_params_maxbw
,
1989 link_params_maxbw_cmd
,
1991 "Maximum bandwidth that can be used\n"
1992 "Bytes/second (IEEE floating point format)\n")
1994 int idx_bandwidth
= 1;
1995 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1996 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2000 if (sscanf(argv
[idx_bandwidth
]->arg
, "%g", &bw
) != 1) {
2001 vty_out(vty
, "link_params_maxbw: fscanf: %s\n",
2002 safe_strerror(errno
));
2003 return CMD_WARNING_CONFIG_FAILED
;
2006 /* Check that Maximum bandwidth is not lower than other bandwidth
2008 if ((bw
<= iflp
->max_rsv_bw
) || (bw
<= iflp
->unrsv_bw
[0])
2009 || (bw
<= iflp
->unrsv_bw
[1]) || (bw
<= iflp
->unrsv_bw
[2])
2010 || (bw
<= iflp
->unrsv_bw
[3]) || (bw
<= iflp
->unrsv_bw
[4])
2011 || (bw
<= iflp
->unrsv_bw
[5]) || (bw
<= iflp
->unrsv_bw
[6])
2012 || (bw
<= iflp
->unrsv_bw
[7]) || (bw
<= iflp
->ava_bw
)
2013 || (bw
<= iflp
->res_bw
) || (bw
<= iflp
->use_bw
)) {
2015 "Maximum Bandwidth could not be lower than others bandwidth\n");
2016 return CMD_WARNING_CONFIG_FAILED
;
2019 /* Update Maximum Bandwidth if needed */
2020 link_param_cmd_set_float(ifp
, &iflp
->max_bw
, LP_MAX_BW
, bw
);
2025 DEFUN (link_params_max_rsv_bw
,
2026 link_params_max_rsv_bw_cmd
,
2027 "max-rsv-bw BANDWIDTH",
2028 "Maximum bandwidth that may be reserved\n"
2029 "Bytes/second (IEEE floating point format)\n")
2031 int idx_bandwidth
= 1;
2032 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2033 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2036 if (sscanf(argv
[idx_bandwidth
]->arg
, "%g", &bw
) != 1) {
2037 vty_out(vty
, "link_params_max_rsv_bw: fscanf: %s\n",
2038 safe_strerror(errno
));
2039 return CMD_WARNING_CONFIG_FAILED
;
2042 /* Check that bandwidth is not greater than maximum bandwidth parameter
2044 if (bw
> iflp
->max_bw
) {
2046 "Maximum Reservable Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2048 return CMD_WARNING_CONFIG_FAILED
;
2051 /* Update Maximum Reservable Bandwidth if needed */
2052 link_param_cmd_set_float(ifp
, &iflp
->max_rsv_bw
, LP_MAX_RSV_BW
, bw
);
2057 DEFUN (link_params_unrsv_bw
,
2058 link_params_unrsv_bw_cmd
,
2059 "unrsv-bw (0-7) BANDWIDTH",
2060 "Unreserved bandwidth at each priority level\n"
2062 "Bytes/second (IEEE floating point format)\n")
2065 int idx_bandwidth
= 2;
2066 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2067 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2071 /* We don't have to consider about range check here. */
2072 if (sscanf(argv
[idx_number
]->arg
, "%d", &priority
) != 1) {
2073 vty_out(vty
, "link_params_unrsv_bw: fscanf: %s\n",
2074 safe_strerror(errno
));
2075 return CMD_WARNING_CONFIG_FAILED
;
2078 if (sscanf(argv
[idx_bandwidth
]->arg
, "%g", &bw
) != 1) {
2079 vty_out(vty
, "link_params_unrsv_bw: fscanf: %s\n",
2080 safe_strerror(errno
));
2081 return CMD_WARNING_CONFIG_FAILED
;
2084 /* Check that bandwidth is not greater than maximum bandwidth parameter
2086 if (bw
> iflp
->max_bw
) {
2088 "UnReserved Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2090 return CMD_WARNING_CONFIG_FAILED
;
2093 /* Update Unreserved Bandwidth if needed */
2094 link_param_cmd_set_float(ifp
, &iflp
->unrsv_bw
[priority
], LP_UNRSV_BW
,
2100 DEFUN (link_params_admin_grp
,
2101 link_params_admin_grp_cmd
,
2102 "admin-grp BITPATTERN",
2103 "Administrative group membership\n"
2104 "32-bit Hexadecimal value (e.g. 0xa1)\n")
2106 int idx_bitpattern
= 1;
2107 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2108 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2109 unsigned long value
;
2111 if (sscanf(argv
[idx_bitpattern
]->arg
, "0x%lx", &value
) != 1) {
2112 vty_out(vty
, "link_params_admin_grp: fscanf: %s\n",
2113 safe_strerror(errno
));
2114 return CMD_WARNING_CONFIG_FAILED
;
2117 /* Update Administrative Group if needed */
2118 link_param_cmd_set_uint32(ifp
, &iflp
->admin_grp
, LP_ADM_GRP
, value
);
2123 DEFUN (no_link_params_admin_grp
,
2124 no_link_params_admin_grp_cmd
,
2127 "Disable Administrative group membership on this interface\n")
2129 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2131 /* Unset Admin Group */
2132 link_param_cmd_unset(ifp
, LP_ADM_GRP
);
2137 /* RFC5392 & RFC5316: INTER-AS */
2138 DEFUN (link_params_inter_as
,
2139 link_params_inter_as_cmd
,
2140 "neighbor A.B.C.D as (1-4294967295)",
2141 "Configure remote ASBR information (Neighbor IP address and AS number)\n"
2142 "Remote IP address in dot decimal A.B.C.D\n"
2143 "Remote AS number\n"
2144 "AS number in the range <1-4294967295>\n")
2149 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2150 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2151 struct in_addr addr
;
2154 if (!inet_aton(argv
[idx_ipv4
]->arg
, &addr
)) {
2155 vty_out(vty
, "Please specify Router-Addr by A.B.C.D\n");
2156 return CMD_WARNING_CONFIG_FAILED
;
2159 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2161 /* Update Remote IP and Remote AS fields if needed */
2162 if (IS_PARAM_UNSET(iflp
, LP_RMT_AS
) || iflp
->rmt_as
!= as
2163 || iflp
->rmt_ip
.s_addr
!= addr
.s_addr
) {
2166 iflp
->rmt_ip
.s_addr
= addr
.s_addr
;
2167 SET_PARAM(iflp
, LP_RMT_AS
);
2169 /* force protocols to update LINK STATE due to parameters change
2171 if (if_is_operative(ifp
))
2172 zebra_interface_parameters_update(ifp
);
2177 DEFUN (no_link_params_inter_as
,
2178 no_link_params_inter_as_cmd
,
2181 "Remove Neighbor IP address and AS number for Inter-AS TE\n")
2183 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2184 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2186 /* Reset Remote IP and AS neighbor */
2188 iflp
->rmt_ip
.s_addr
= 0;
2189 UNSET_PARAM(iflp
, LP_RMT_AS
);
2191 /* force protocols to update LINK STATE due to parameters change */
2192 if (if_is_operative(ifp
))
2193 zebra_interface_parameters_update(ifp
);
2198 /* RFC7471: OSPF Traffic Engineering (TE) Metric extensions &
2199 * draft-ietf-isis-metric-extensions-07.txt */
2200 DEFUN (link_params_delay
,
2201 link_params_delay_cmd
,
2202 "delay (0-16777215) [min (0-16777215) max (0-16777215)]",
2203 "Unidirectional Average Link Delay\n"
2204 "Average delay in micro-second as decimal (0...16777215)\n"
2206 "Minimum delay in micro-second as decimal (0...16777215)\n"
2208 "Maximum delay in micro-second as decimal (0...16777215)\n")
2210 /* Get and Check new delay values */
2211 uint32_t delay
= 0, low
= 0, high
= 0;
2212 delay
= strtoul(argv
[1]->arg
, NULL
, 10);
2214 low
= strtoul(argv
[3]->arg
, NULL
, 10);
2215 high
= strtoul(argv
[5]->arg
, NULL
, 10);
2218 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2219 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2223 /* Check new delay value against old Min and Max delays if set
2225 if (IS_PARAM_SET(iflp
, LP_MM_DELAY
)
2226 && (delay
<= iflp
->min_delay
|| delay
>= iflp
->max_delay
)) {
2228 "Average delay should be comprise between Min (%d) and Max (%d) delay\n",
2229 iflp
->min_delay
, iflp
->max_delay
);
2230 return CMD_WARNING_CONFIG_FAILED
;
2232 /* Update delay if value is not set or change */
2233 if (IS_PARAM_UNSET(iflp
, LP_DELAY
) || iflp
->av_delay
!= delay
) {
2234 iflp
->av_delay
= delay
;
2235 SET_PARAM(iflp
, LP_DELAY
);
2238 /* Unset Min and Max delays if already set */
2239 if (IS_PARAM_SET(iflp
, LP_MM_DELAY
)) {
2240 iflp
->min_delay
= 0;
2241 iflp
->max_delay
= 0;
2242 UNSET_PARAM(iflp
, LP_MM_DELAY
);
2246 /* Check new delays value coherency */
2247 if (delay
<= low
|| delay
>= high
) {
2249 "Average delay should be comprise between Min (%d) and Max (%d) delay\n",
2251 return CMD_WARNING_CONFIG_FAILED
;
2253 /* Update Delays if needed */
2254 if (IS_PARAM_UNSET(iflp
, LP_DELAY
)
2255 || IS_PARAM_UNSET(iflp
, LP_MM_DELAY
)
2256 || iflp
->av_delay
!= delay
|| iflp
->min_delay
!= low
2257 || iflp
->max_delay
!= high
) {
2258 iflp
->av_delay
= delay
;
2259 SET_PARAM(iflp
, LP_DELAY
);
2260 iflp
->min_delay
= low
;
2261 iflp
->max_delay
= high
;
2262 SET_PARAM(iflp
, LP_MM_DELAY
);
2267 /* force protocols to update LINK STATE due to parameters change */
2268 if (update
== 1 && if_is_operative(ifp
))
2269 zebra_interface_parameters_update(ifp
);
2274 DEFUN (no_link_params_delay
,
2275 no_link_params_delay_cmd
,
2278 "Disable Unidirectional Average, Min & Max Link Delay on this interface\n")
2280 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2281 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2285 UNSET_PARAM(iflp
, LP_DELAY
);
2286 iflp
->min_delay
= 0;
2287 iflp
->max_delay
= 0;
2288 UNSET_PARAM(iflp
, LP_MM_DELAY
);
2290 /* force protocols to update LINK STATE due to parameters change */
2291 if (if_is_operative(ifp
))
2292 zebra_interface_parameters_update(ifp
);
2297 DEFUN (link_params_delay_var
,
2298 link_params_delay_var_cmd
,
2299 "delay-variation (0-16777215)",
2300 "Unidirectional Link Delay Variation\n"
2301 "delay variation in micro-second as decimal (0...16777215)\n")
2304 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2305 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2308 value
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2310 /* Update Delay Variation if needed */
2311 link_param_cmd_set_uint32(ifp
, &iflp
->delay_var
, LP_DELAY_VAR
, value
);
2316 DEFUN (no_link_params_delay_var
,
2317 no_link_params_delay_var_cmd
,
2318 "no delay-variation",
2320 "Disable Unidirectional Delay Variation on this interface\n")
2322 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2324 /* Unset Delay Variation */
2325 link_param_cmd_unset(ifp
, LP_DELAY_VAR
);
2330 DEFUN (link_params_pkt_loss
,
2331 link_params_pkt_loss_cmd
,
2332 "packet-loss PERCENTAGE",
2333 "Unidirectional Link Packet Loss\n"
2334 "percentage of total traffic by 0.000003% step and less than 50.331642%\n")
2336 int idx_percentage
= 1;
2337 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2338 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2341 if (sscanf(argv
[idx_percentage
]->arg
, "%g", &fval
) != 1) {
2342 vty_out(vty
, "link_params_pkt_loss: fscanf: %s\n",
2343 safe_strerror(errno
));
2344 return CMD_WARNING_CONFIG_FAILED
;
2347 if (fval
> MAX_PKT_LOSS
)
2348 fval
= MAX_PKT_LOSS
;
2350 /* Update Packet Loss if needed */
2351 link_param_cmd_set_float(ifp
, &iflp
->pkt_loss
, LP_PKT_LOSS
, fval
);
2356 DEFUN (no_link_params_pkt_loss
,
2357 no_link_params_pkt_loss_cmd
,
2360 "Disable Unidirectional Link Packet Loss on this interface\n")
2362 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2364 /* Unset Packet Loss */
2365 link_param_cmd_unset(ifp
, LP_PKT_LOSS
);
2370 DEFUN (link_params_res_bw
,
2371 link_params_res_bw_cmd
,
2373 "Unidirectional Residual Bandwidth\n"
2374 "Bytes/second (IEEE floating point format)\n")
2376 int idx_bandwidth
= 1;
2377 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2378 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2381 if (sscanf(argv
[idx_bandwidth
]->arg
, "%g", &bw
) != 1) {
2382 vty_out(vty
, "link_params_res_bw: fscanf: %s\n",
2383 safe_strerror(errno
));
2384 return CMD_WARNING_CONFIG_FAILED
;
2387 /* Check that bandwidth is not greater than maximum bandwidth parameter
2389 if (bw
> iflp
->max_bw
) {
2391 "Residual Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2393 return CMD_WARNING_CONFIG_FAILED
;
2396 /* Update Residual Bandwidth if needed */
2397 link_param_cmd_set_float(ifp
, &iflp
->res_bw
, LP_RES_BW
, bw
);
2402 DEFUN (no_link_params_res_bw
,
2403 no_link_params_res_bw_cmd
,
2406 "Disable Unidirectional Residual Bandwidth on this interface\n")
2408 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2410 /* Unset Residual Bandwidth */
2411 link_param_cmd_unset(ifp
, LP_RES_BW
);
2416 DEFUN (link_params_ava_bw
,
2417 link_params_ava_bw_cmd
,
2419 "Unidirectional Available Bandwidth\n"
2420 "Bytes/second (IEEE floating point format)\n")
2422 int idx_bandwidth
= 1;
2423 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2424 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2427 if (sscanf(argv
[idx_bandwidth
]->arg
, "%g", &bw
) != 1) {
2428 vty_out(vty
, "link_params_ava_bw: fscanf: %s\n",
2429 safe_strerror(errno
));
2430 return CMD_WARNING_CONFIG_FAILED
;
2433 /* Check that bandwidth is not greater than maximum bandwidth parameter
2435 if (bw
> iflp
->max_bw
) {
2437 "Available Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2439 return CMD_WARNING_CONFIG_FAILED
;
2442 /* Update Residual Bandwidth if needed */
2443 link_param_cmd_set_float(ifp
, &iflp
->ava_bw
, LP_AVA_BW
, bw
);
2448 DEFUN (no_link_params_ava_bw
,
2449 no_link_params_ava_bw_cmd
,
2452 "Disable Unidirectional Available Bandwidth on this interface\n")
2454 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2456 /* Unset Available Bandwidth */
2457 link_param_cmd_unset(ifp
, LP_AVA_BW
);
2462 DEFUN (link_params_use_bw
,
2463 link_params_use_bw_cmd
,
2465 "Unidirectional Utilised Bandwidth\n"
2466 "Bytes/second (IEEE floating point format)\n")
2468 int idx_bandwidth
= 1;
2469 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2470 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2473 if (sscanf(argv
[idx_bandwidth
]->arg
, "%g", &bw
) != 1) {
2474 vty_out(vty
, "link_params_use_bw: fscanf: %s\n",
2475 safe_strerror(errno
));
2476 return CMD_WARNING_CONFIG_FAILED
;
2479 /* Check that bandwidth is not greater than maximum bandwidth parameter
2481 if (bw
> iflp
->max_bw
) {
2483 "Utilised Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2485 return CMD_WARNING_CONFIG_FAILED
;
2488 /* Update Utilized Bandwidth if needed */
2489 link_param_cmd_set_float(ifp
, &iflp
->use_bw
, LP_USE_BW
, bw
);
2494 DEFUN (no_link_params_use_bw
,
2495 no_link_params_use_bw_cmd
,
2498 "Disable Unidirectional Utilised Bandwidth on this interface\n")
2500 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2502 /* Unset Utilised Bandwidth */
2503 link_param_cmd_unset(ifp
, LP_USE_BW
);
2508 static int ip_address_install(struct vty
*vty
, struct interface
*ifp
,
2509 const char *addr_str
, const char *peer_str
,
2512 struct zebra_if
*if_data
;
2513 struct prefix_ipv4 lp
, pp
;
2514 struct connected
*ifc
;
2515 struct prefix_ipv4
*p
;
2518 if_data
= ifp
->info
;
2520 ret
= str2prefix_ipv4(addr_str
, &lp
);
2522 vty_out(vty
, "%% Malformed address \n");
2523 return CMD_WARNING_CONFIG_FAILED
;
2526 if (ipv4_martian(&lp
.prefix
)) {
2527 vty_out(vty
, "%% Invalid address\n");
2528 return CMD_WARNING_CONFIG_FAILED
;
2532 if (lp
.prefixlen
!= 32) {
2534 "%% Local prefix length for P-t-P address must be /32\n");
2535 return CMD_WARNING_CONFIG_FAILED
;
2538 ret
= str2prefix_ipv4(peer_str
, &pp
);
2540 vty_out(vty
, "%% Malformed peer address\n");
2541 return CMD_WARNING_CONFIG_FAILED
;
2545 ifc
= connected_check_ptp(ifp
, &lp
, peer_str
? &pp
: NULL
);
2547 ifc
= connected_new();
2551 p
= prefix_ipv4_new();
2553 ifc
->address
= (struct prefix
*)p
;
2556 SET_FLAG(ifc
->flags
, ZEBRA_IFA_PEER
);
2557 p
= prefix_ipv4_new();
2559 ifc
->destination
= (struct prefix
*)p
;
2560 } else if (p
->prefixlen
<= IPV4_MAX_PREFIXLEN
- 2) {
2561 p
= prefix_ipv4_new();
2563 p
->prefix
.s_addr
= ipv4_broadcast_addr(p
->prefix
.s_addr
,
2565 ifc
->destination
= (struct prefix
*)p
;
2570 ifc
->label
= XSTRDUP(MTYPE_CONNECTED_LABEL
, label
);
2572 /* Add to linked list. */
2573 listnode_add(ifp
->connected
, ifc
);
2576 /* This address is configured from zebra. */
2577 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
2578 SET_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
2580 /* In case of this route need to install kernel. */
2581 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)
2582 && CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)
2583 && !(if_data
&& if_data
->shutdown
== IF_ZEBRA_SHUTDOWN_ON
)) {
2584 /* Some system need to up the interface to set IP address. */
2585 if (!if_is_up(ifp
)) {
2586 if_set_flags(ifp
, IFF_UP
| IFF_RUNNING
);
2590 ret
= if_set_prefix(ifp
, ifc
);
2592 vty_out(vty
, "%% Can't set interface IP address: %s.\n",
2593 safe_strerror(errno
));
2594 return CMD_WARNING_CONFIG_FAILED
;
2597 SET_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
);
2598 /* The address will be advertised to zebra clients when the
2600 * from the kernel has been received.
2601 * It will also be added to the subnet chain list, then. */
2607 static int ip_address_uninstall(struct vty
*vty
, struct interface
*ifp
,
2608 const char *addr_str
, const char *peer_str
,
2611 struct prefix_ipv4 lp
, pp
;
2612 struct connected
*ifc
;
2615 /* Convert to prefix structure. */
2616 ret
= str2prefix_ipv4(addr_str
, &lp
);
2618 vty_out(vty
, "%% Malformed address \n");
2619 return CMD_WARNING_CONFIG_FAILED
;
2623 if (lp
.prefixlen
!= 32) {
2625 "%% Local prefix length for P-t-P address must be /32\n");
2626 return CMD_WARNING_CONFIG_FAILED
;
2629 ret
= str2prefix_ipv4(peer_str
, &pp
);
2631 vty_out(vty
, "%% Malformed peer address\n");
2632 return CMD_WARNING_CONFIG_FAILED
;
2636 /* Check current interface address. */
2637 ifc
= connected_check_ptp(ifp
, &lp
, peer_str
? &pp
: NULL
);
2639 vty_out(vty
, "%% Can't find address\n");
2640 return CMD_WARNING_CONFIG_FAILED
;
2643 /* This is not configured address. */
2644 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
2645 return CMD_WARNING_CONFIG_FAILED
;
2647 UNSET_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
2649 /* This is not real address or interface is not active. */
2650 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)
2651 || !CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
2652 listnode_delete(ifp
->connected
, ifc
);
2653 connected_free(ifc
);
2654 return CMD_WARNING_CONFIG_FAILED
;
2657 /* This is real route. */
2658 ret
= if_unset_prefix(ifp
, ifc
);
2660 vty_out(vty
, "%% Can't unset interface IP address: %s.\n",
2661 safe_strerror(errno
));
2662 return CMD_WARNING_CONFIG_FAILED
;
2664 UNSET_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
);
2665 /* we will receive a kernel notification about this route being removed.
2666 * this will trigger its removal from the connected list. */
2672 "ip address A.B.C.D/M",
2673 "Interface Internet Protocol config commands\n"
2674 "Set the IP address of an interface\n"
2675 "IP address (e.g. 10.0.0.1/8)\n")
2677 int idx_ipv4_prefixlen
= 2;
2678 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2679 return ip_address_install(vty
, ifp
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
,
2683 DEFUN (no_ip_address
,
2685 "no ip address A.B.C.D/M",
2687 "Interface Internet Protocol config commands\n"
2688 "Set the IP address of an interface\n"
2689 "IP Address (e.g. 10.0.0.1/8)\n")
2691 int idx_ipv4_prefixlen
= 3;
2692 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2693 return ip_address_uninstall(vty
, ifp
, argv
[idx_ipv4_prefixlen
]->arg
,
2697 DEFUN(ip_address_peer
,
2698 ip_address_peer_cmd
,
2699 "ip address A.B.C.D peer A.B.C.D/M",
2700 "Interface Internet Protocol config commands\n"
2701 "Set the IP address of an interface\n"
2702 "Local IP (e.g. 10.0.0.1) for P-t-P address\n"
2703 "Specify P-t-P address\n"
2704 "Peer IP address (e.g. 10.0.0.1/8)\n")
2706 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2707 return ip_address_install(vty
, ifp
, argv
[2]->arg
, argv
[4]->arg
, NULL
);
2710 DEFUN(no_ip_address_peer
,
2711 no_ip_address_peer_cmd
,
2712 "no ip address A.B.C.D peer A.B.C.D/M",
2714 "Interface Internet Protocol config commands\n"
2715 "Set the IP address of an interface\n"
2716 "Local IP (e.g. 10.0.0.1) for P-t-P address\n"
2717 "Specify P-t-P address\n"
2718 "Peer IP address (e.g. 10.0.0.1/8)\n")
2720 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2721 return ip_address_uninstall(vty
, ifp
, argv
[3]->arg
, argv
[5]->arg
, NULL
);
2725 DEFUN (ip_address_label
,
2726 ip_address_label_cmd
,
2727 "ip address A.B.C.D/M label LINE",
2728 "Interface Internet Protocol config commands\n"
2729 "Set the IP address of an interface\n"
2730 "IP address (e.g. 10.0.0.1/8)\n"
2731 "Label of this address\n"
2734 int idx_ipv4_prefixlen
= 2;
2736 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2737 return ip_address_install(vty
, ifp
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
,
2738 argv
[idx_line
]->arg
);
2741 DEFUN (no_ip_address_label
,
2742 no_ip_address_label_cmd
,
2743 "no ip address A.B.C.D/M label LINE",
2745 "Interface Internet Protocol config commands\n"
2746 "Set the IP address of an interface\n"
2747 "IP address (e.g. 10.0.0.1/8)\n"
2748 "Label of this address\n"
2751 int idx_ipv4_prefixlen
= 3;
2753 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2754 return ip_address_uninstall(vty
, ifp
, argv
[idx_ipv4_prefixlen
]->arg
,
2755 NULL
, argv
[idx_line
]->arg
);
2757 #endif /* HAVE_NETLINK */
2759 static int ipv6_address_install(struct vty
*vty
, struct interface
*ifp
,
2760 const char *addr_str
, const char *peer_str
,
2763 struct zebra_if
*if_data
;
2764 struct prefix_ipv6 cp
;
2765 struct connected
*ifc
;
2766 struct prefix_ipv6
*p
;
2769 if_data
= ifp
->info
;
2771 ret
= str2prefix_ipv6(addr_str
, &cp
);
2773 vty_out(vty
, "%% Malformed address \n");
2774 return CMD_WARNING_CONFIG_FAILED
;
2777 if (ipv6_martian(&cp
.prefix
)) {
2778 vty_out(vty
, "%% Invalid address\n");
2779 return CMD_WARNING_CONFIG_FAILED
;
2782 ifc
= connected_check(ifp
, (struct prefix
*)&cp
);
2784 ifc
= connected_new();
2788 p
= prefix_ipv6_new();
2790 ifc
->address
= (struct prefix
*)p
;
2794 ifc
->label
= XSTRDUP(MTYPE_CONNECTED_LABEL
, label
);
2796 /* Add to linked list. */
2797 listnode_add(ifp
->connected
, ifc
);
2800 /* This address is configured from zebra. */
2801 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
2802 SET_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
2804 /* In case of this route need to install kernel. */
2805 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)
2806 && CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)
2807 && !(if_data
&& if_data
->shutdown
== IF_ZEBRA_SHUTDOWN_ON
)) {
2808 /* Some system need to up the interface to set IP address. */
2809 if (!if_is_up(ifp
)) {
2810 if_set_flags(ifp
, IFF_UP
| IFF_RUNNING
);
2814 ret
= if_prefix_add_ipv6(ifp
, ifc
);
2817 vty_out(vty
, "%% Can't set interface IP address: %s.\n",
2818 safe_strerror(errno
));
2819 return CMD_WARNING_CONFIG_FAILED
;
2822 SET_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
);
2823 /* The address will be advertised to zebra clients when the
2825 * from the kernel has been received. */
2831 /* Return true if an ipv6 address is configured on ifp */
2832 int ipv6_address_configured(struct interface
*ifp
)
2834 struct connected
*connected
;
2835 struct listnode
*node
;
2837 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, node
, connected
))
2838 if (CHECK_FLAG(connected
->conf
, ZEBRA_IFC_REAL
)
2839 && (connected
->address
->family
== AF_INET6
))
2845 static int ipv6_address_uninstall(struct vty
*vty
, struct interface
*ifp
,
2846 const char *addr_str
, const char *peer_str
,
2849 struct prefix_ipv6 cp
;
2850 struct connected
*ifc
;
2853 /* Convert to prefix structure. */
2854 ret
= str2prefix_ipv6(addr_str
, &cp
);
2856 vty_out(vty
, "%% Malformed address \n");
2857 return CMD_WARNING_CONFIG_FAILED
;
2860 /* Check current interface address. */
2861 ifc
= connected_check(ifp
, (struct prefix
*)&cp
);
2863 vty_out(vty
, "%% Can't find address\n");
2864 return CMD_WARNING_CONFIG_FAILED
;
2867 /* This is not configured address. */
2868 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
2869 return CMD_WARNING_CONFIG_FAILED
;
2871 UNSET_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
2873 /* This is not real address or interface is not active. */
2874 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)
2875 || !CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
2876 listnode_delete(ifp
->connected
, ifc
);
2877 connected_free(ifc
);
2878 return CMD_WARNING_CONFIG_FAILED
;
2881 /* This is real route. */
2882 ret
= if_prefix_delete_ipv6(ifp
, ifc
);
2884 vty_out(vty
, "%% Can't unset interface IP address: %s.\n",
2885 safe_strerror(errno
));
2886 return CMD_WARNING_CONFIG_FAILED
;
2889 UNSET_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
);
2890 /* This information will be propagated to the zclients when the
2891 * kernel notification is received. */
2895 DEFUN (ipv6_address
,
2897 "ipv6 address X:X::X:X/M",
2898 "Interface IPv6 config commands\n"
2899 "Set the IP address of an interface\n"
2900 "IPv6 address (e.g. 3ffe:506::1/48)\n")
2902 int idx_ipv6_prefixlen
= 2;
2903 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2904 return ipv6_address_install(vty
, ifp
, argv
[idx_ipv6_prefixlen
]->arg
,
2908 DEFUN (no_ipv6_address
,
2909 no_ipv6_address_cmd
,
2910 "no ipv6 address X:X::X:X/M",
2912 "Interface IPv6 config commands\n"
2913 "Set the IP address of an interface\n"
2914 "IPv6 address (e.g. 3ffe:506::1/48)\n")
2916 int idx_ipv6_prefixlen
= 3;
2917 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2918 return ipv6_address_uninstall(vty
, ifp
, argv
[idx_ipv6_prefixlen
]->arg
,
2922 static int link_params_config_write(struct vty
*vty
, struct interface
*ifp
)
2926 if ((ifp
== NULL
) || !HAS_LINK_PARAMS(ifp
))
2929 struct if_link_params
*iflp
= ifp
->link_params
;
2931 vty_out(vty
, " link-params\n");
2932 vty_out(vty
, " enable\n");
2933 if (IS_PARAM_SET(iflp
, LP_TE_METRIC
) && iflp
->te_metric
!= ifp
->metric
)
2934 vty_out(vty
, " metric %u\n", iflp
->te_metric
);
2935 if (IS_PARAM_SET(iflp
, LP_MAX_BW
) && iflp
->max_bw
!= iflp
->default_bw
)
2936 vty_out(vty
, " max-bw %g\n", iflp
->max_bw
);
2937 if (IS_PARAM_SET(iflp
, LP_MAX_RSV_BW
)
2938 && iflp
->max_rsv_bw
!= iflp
->default_bw
)
2939 vty_out(vty
, " max-rsv-bw %g\n", iflp
->max_rsv_bw
);
2940 if (IS_PARAM_SET(iflp
, LP_UNRSV_BW
)) {
2941 for (i
= 0; i
< 8; i
++)
2942 if (iflp
->unrsv_bw
[i
] != iflp
->default_bw
)
2943 vty_out(vty
, " unrsv-bw %d %g\n", i
,
2946 if (IS_PARAM_SET(iflp
, LP_ADM_GRP
))
2947 vty_out(vty
, " admin-grp 0x%x\n", iflp
->admin_grp
);
2948 if (IS_PARAM_SET(iflp
, LP_DELAY
)) {
2949 vty_out(vty
, " delay %u", iflp
->av_delay
);
2950 if (IS_PARAM_SET(iflp
, LP_MM_DELAY
)) {
2951 vty_out(vty
, " min %u", iflp
->min_delay
);
2952 vty_out(vty
, " max %u", iflp
->max_delay
);
2956 if (IS_PARAM_SET(iflp
, LP_DELAY_VAR
))
2957 vty_out(vty
, " delay-variation %u\n", iflp
->delay_var
);
2958 if (IS_PARAM_SET(iflp
, LP_PKT_LOSS
))
2959 vty_out(vty
, " packet-loss %g\n", iflp
->pkt_loss
);
2960 if (IS_PARAM_SET(iflp
, LP_AVA_BW
))
2961 vty_out(vty
, " ava-bw %g\n", iflp
->ava_bw
);
2962 if (IS_PARAM_SET(iflp
, LP_RES_BW
))
2963 vty_out(vty
, " res-bw %g\n", iflp
->res_bw
);
2964 if (IS_PARAM_SET(iflp
, LP_USE_BW
))
2965 vty_out(vty
, " use-bw %g\n", iflp
->use_bw
);
2966 if (IS_PARAM_SET(iflp
, LP_RMT_AS
))
2967 vty_out(vty
, " neighbor %s as %u\n", inet_ntoa(iflp
->rmt_ip
),
2969 vty_out(vty
, " exit-link-params\n");
2973 static int if_config_write(struct vty
*vty
)
2976 struct interface
*ifp
;
2978 zebra_ptm_write(vty
);
2980 RB_FOREACH (vrf0
, vrf_name_head
, &vrfs_by_name
)
2981 FOR_ALL_INTERFACES (vrf0
, ifp
) {
2982 struct zebra_if
*if_data
;
2983 struct listnode
*addrnode
;
2984 struct connected
*ifc
;
2988 if_data
= ifp
->info
;
2989 vrf
= vrf_lookup_by_id(ifp
->vrf_id
);
2991 if (ifp
->vrf_id
== VRF_DEFAULT
)
2992 vty_frame(vty
, "interface %s\n", ifp
->name
);
2994 vty_frame(vty
, "interface %s vrf %s\n",
2995 ifp
->name
, vrf
->name
);
2998 if (if_data
->shutdown
== IF_ZEBRA_SHUTDOWN_ON
)
2999 vty_out(vty
, " shutdown\n");
3001 zebra_ptm_if_write(vty
, if_data
);
3005 vty_out(vty
, " description %s\n", ifp
->desc
);
3007 /* Assign bandwidth here to avoid unnecessary interface
3009 while processing config script */
3010 if (ifp
->bandwidth
!= 0)
3011 vty_out(vty
, " bandwidth %u\n", ifp
->bandwidth
);
3013 if (!CHECK_FLAG(ifp
->status
,
3014 ZEBRA_INTERFACE_LINKDETECTION
))
3015 vty_out(vty
, " no link-detect\n");
3017 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, addrnode
,
3019 if (CHECK_FLAG(ifc
->conf
,
3020 ZEBRA_IFC_CONFIGURED
)) {
3021 char buf
[INET6_ADDRSTRLEN
];
3023 vty_out(vty
, " ip%s address %s",
3024 p
->family
== AF_INET
? ""
3026 inet_ntop(p
->family
,
3029 if (CONNECTED_PEER(ifc
)) {
3030 p
= ifc
->destination
;
3031 vty_out(vty
, " peer %s",
3032 inet_ntop(p
->family
,
3037 vty_out(vty
, "/%d", p
->prefixlen
);
3040 vty_out(vty
, " label %s",
3048 if (if_data
->multicast
3049 != IF_ZEBRA_MULTICAST_UNSPEC
)
3050 vty_out(vty
, " %smulticast\n",
3052 == IF_ZEBRA_MULTICAST_ON
3057 hook_call(zebra_if_config_wr
, vty
, ifp
);
3059 link_params_config_write(vty
, ifp
);
3061 vty_endframe(vty
, "!\n");
3066 /* Allocate and initialize interface vector. */
3067 void zebra_if_init(void)
3069 /* Initialize interface and new hook. */
3070 hook_register_prio(if_add
, 0, if_zebra_new_hook
);
3071 hook_register_prio(if_del
, 0, if_zebra_delete_hook
);
3073 /* Install configuration write function. */
3074 install_node(&interface_node
, if_config_write
);
3075 install_node(&link_params_node
, NULL
);
3078 install_element(VIEW_NODE
, &show_interface_cmd
);
3079 install_element(VIEW_NODE
, &show_interface_vrf_all_cmd
);
3080 install_element(VIEW_NODE
, &show_interface_name_vrf_cmd
);
3081 install_element(VIEW_NODE
, &show_interface_name_vrf_all_cmd
);
3083 install_element(ENABLE_NODE
, &show_interface_desc_cmd
);
3084 install_element(ENABLE_NODE
, &show_interface_desc_vrf_all_cmd
);
3085 install_element(INTERFACE_NODE
, &multicast_cmd
);
3086 install_element(INTERFACE_NODE
, &no_multicast_cmd
);
3087 install_element(INTERFACE_NODE
, &linkdetect_cmd
);
3088 install_element(INTERFACE_NODE
, &no_linkdetect_cmd
);
3089 install_element(INTERFACE_NODE
, &shutdown_if_cmd
);
3090 install_element(INTERFACE_NODE
, &no_shutdown_if_cmd
);
3091 install_element(INTERFACE_NODE
, &bandwidth_if_cmd
);
3092 install_element(INTERFACE_NODE
, &no_bandwidth_if_cmd
);
3093 install_element(INTERFACE_NODE
, &ip_address_cmd
);
3094 install_element(INTERFACE_NODE
, &no_ip_address_cmd
);
3095 install_element(INTERFACE_NODE
, &ip_address_peer_cmd
);
3096 install_element(INTERFACE_NODE
, &no_ip_address_peer_cmd
);
3097 install_element(INTERFACE_NODE
, &ipv6_address_cmd
);
3098 install_element(INTERFACE_NODE
, &no_ipv6_address_cmd
);
3100 install_element(INTERFACE_NODE
, &ip_address_label_cmd
);
3101 install_element(INTERFACE_NODE
, &no_ip_address_label_cmd
);
3102 #endif /* HAVE_NETLINK */
3103 install_element(INTERFACE_NODE
, &link_params_cmd
);
3104 install_default(LINK_PARAMS_NODE
);
3105 install_element(LINK_PARAMS_NODE
, &link_params_enable_cmd
);
3106 install_element(LINK_PARAMS_NODE
, &no_link_params_enable_cmd
);
3107 install_element(LINK_PARAMS_NODE
, &link_params_metric_cmd
);
3108 install_element(LINK_PARAMS_NODE
, &no_link_params_metric_cmd
);
3109 install_element(LINK_PARAMS_NODE
, &link_params_maxbw_cmd
);
3110 install_element(LINK_PARAMS_NODE
, &link_params_max_rsv_bw_cmd
);
3111 install_element(LINK_PARAMS_NODE
, &link_params_unrsv_bw_cmd
);
3112 install_element(LINK_PARAMS_NODE
, &link_params_admin_grp_cmd
);
3113 install_element(LINK_PARAMS_NODE
, &no_link_params_admin_grp_cmd
);
3114 install_element(LINK_PARAMS_NODE
, &link_params_inter_as_cmd
);
3115 install_element(LINK_PARAMS_NODE
, &no_link_params_inter_as_cmd
);
3116 install_element(LINK_PARAMS_NODE
, &link_params_delay_cmd
);
3117 install_element(LINK_PARAMS_NODE
, &no_link_params_delay_cmd
);
3118 install_element(LINK_PARAMS_NODE
, &link_params_delay_var_cmd
);
3119 install_element(LINK_PARAMS_NODE
, &no_link_params_delay_var_cmd
);
3120 install_element(LINK_PARAMS_NODE
, &link_params_pkt_loss_cmd
);
3121 install_element(LINK_PARAMS_NODE
, &no_link_params_pkt_loss_cmd
);
3122 install_element(LINK_PARAMS_NODE
, &link_params_ava_bw_cmd
);
3123 install_element(LINK_PARAMS_NODE
, &no_link_params_ava_bw_cmd
);
3124 install_element(LINK_PARAMS_NODE
, &link_params_res_bw_cmd
);
3125 install_element(LINK_PARAMS_NODE
, &no_link_params_res_bw_cmd
);
3126 install_element(LINK_PARAMS_NODE
, &link_params_use_bw_cmd
);
3127 install_element(LINK_PARAMS_NODE
, &no_link_params_use_bw_cmd
);
3128 install_element(LINK_PARAMS_NODE
, &exit_link_params_cmd
);