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 static bool mac_is_same(char *mac1
, char *mac2
)
811 if (mac1
[0] == mac2
[0] &&
812 mac1
[1] == mac2
[1] &&
813 mac1
[2] == mac2
[2] &&
814 mac1
[3] == mac2
[3] &&
815 mac1
[4] == mac2
[4] &&
822 void if_nbr_mac_to_ipv4ll_neigh_update(struct interface
*ifp
,
824 struct in6_addr
*address
,
827 struct zebra_vrf
*zvrf
= vrf_info_lookup(ifp
->vrf_id
);
828 struct zebra_if
*zif
= ifp
->info
;
829 char buf
[16] = "169.254.0.1";
830 struct in_addr ipv4_ll
;
833 inet_pton(AF_INET
, buf
, &ipv4_ll
);
835 ns_id
= zvrf
->zns
->ns_id
;
838 * Remove existed arp record for the interface as netlink
839 * protocol does not have update message types
841 * supported message types are RTM_NEWNEIGH and RTM_DELNEIGH
843 if (!mac_is_same(zif
->neigh_mac
, mac
)) {
844 kernel_neigh_update(0, ifp
->ifindex
, ipv4_ll
.s_addr
,
848 kernel_neigh_update(add
, ifp
->ifindex
, ipv4_ll
.s_addr
,
852 memcpy(&zif
->neigh_mac
[0], &mac
[0], 6);
855 * We need to note whether or not we originated a v6
856 * neighbor entry for this interface. So that when
857 * someone unwisely accidently deletes this entry
858 * we can shove it back in.
860 zif
->v6_2_v4_ll_neigh_entry
= !!add
;
861 memcpy(&zif
->v6_2_v4_ll_addr6
, address
, sizeof(*address
));
863 zvrf
->neigh_updates
++;
866 void if_nbr_ipv6ll_to_ipv4ll_neigh_update(struct interface
*ifp
,
867 struct in6_addr
*address
, int add
)
872 ipv6_ll_address_to_mac(address
, (uint8_t *)mac
);
873 if_nbr_mac_to_ipv4ll_neigh_update(ifp
, mac
, address
, add
);
876 static void if_nbr_ipv6ll_to_ipv4ll_neigh_add_all(struct interface
*ifp
)
878 if (listhead(ifp
->nbr_connected
)) {
879 struct nbr_connected
*nbr_connected
;
880 struct listnode
*node
;
882 for (ALL_LIST_ELEMENTS_RO(ifp
->nbr_connected
, node
,
884 if_nbr_ipv6ll_to_ipv4ll_neigh_update(
885 ifp
, &nbr_connected
->address
->u
.prefix6
, 1);
889 void if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(struct interface
*ifp
)
891 if (listhead(ifp
->nbr_connected
)) {
892 struct nbr_connected
*nbr_connected
;
893 struct listnode
*node
;
895 for (ALL_LIST_ELEMENTS_RO(ifp
->nbr_connected
, node
,
897 if_nbr_ipv6ll_to_ipv4ll_neigh_update(
898 ifp
, &nbr_connected
->address
->u
.prefix6
, 0);
902 static void if_down_del_nbr_connected(struct interface
*ifp
)
904 struct nbr_connected
*nbr_connected
;
905 struct listnode
*node
, *nnode
;
907 for (ALL_LIST_ELEMENTS(ifp
->nbr_connected
, node
, nnode
,
909 listnode_delete(ifp
->nbr_connected
, nbr_connected
);
910 nbr_connected_free(nbr_connected
);
914 /* Interface is up. */
915 void if_up(struct interface
*ifp
)
917 struct zebra_if
*zif
;
918 struct interface
*link_if
;
919 struct zebra_vrf
*zvrf
= vrf_info_lookup(ifp
->vrf_id
);
923 quagga_timestamp(2, zif
->up_last
, sizeof(zif
->up_last
));
925 /* Notify the protocol daemons. */
926 if (ifp
->ptm_enable
&& (ifp
->ptm_status
== ZEBRA_PTM_STATUS_DOWN
)) {
927 flog_warn(EC_ZEBRA_PTM_NOT_READY
,
928 "%s: interface %s hasn't passed ptm check\n",
929 __func__
, ifp
->name
);
932 zebra_interface_up_update(ifp
);
934 if_nbr_ipv6ll_to_ipv4ll_neigh_add_all(ifp
);
936 #if defined(HAVE_RTADV)
937 /* Enable fast tx of RA if enabled && RA interval is not in msecs */
938 if (zif
->rtadv
.AdvSendAdvertisements
939 && (zif
->rtadv
.MaxRtrAdvInterval
>= 1000)) {
940 zif
->rtadv
.inFastRexmit
= 1;
941 zif
->rtadv
.NumFastReXmitsRemain
= RTADV_NUM_FAST_REXMITS
;
945 /* Install connected routes to the kernel. */
946 if_install_connected(ifp
);
948 if (IS_ZEBRA_DEBUG_RIB_DETAILED
)
949 zlog_debug("%u: IF %s up, scheduling RIB processing",
950 ifp
->vrf_id
, ifp
->name
);
951 rib_update(ifp
->vrf_id
, RIB_UPDATE_IF_CHANGE
);
953 /* Handle interface up for specific types for EVPN. Non-VxLAN interfaces
954 * are checked to see if (remote) neighbor entries need to be installed
955 * on them for ARP suppression.
957 if (IS_ZEBRA_IF_VXLAN(ifp
))
958 zebra_vxlan_if_up(ifp
);
959 else if (IS_ZEBRA_IF_BRIDGE(ifp
)) {
961 zebra_vxlan_svi_up(ifp
, link_if
);
962 } else if (IS_ZEBRA_IF_VLAN(ifp
)) {
963 link_if
= if_lookup_by_index_per_ns(zvrf
->zns
,
966 zebra_vxlan_svi_up(ifp
, link_if
);
970 /* Interface goes down. We have to manage different behavior of based
972 void if_down(struct interface
*ifp
)
974 struct zebra_if
*zif
;
975 struct interface
*link_if
;
976 struct zebra_vrf
*zvrf
= vrf_info_lookup(ifp
->vrf_id
);
980 quagga_timestamp(2, zif
->down_last
, sizeof(zif
->down_last
));
982 /* Handle interface down for specific types for EVPN. Non-VxLAN
984 * are checked to see if (remote) neighbor entries need to be purged
985 * for ARP suppression.
987 if (IS_ZEBRA_IF_VXLAN(ifp
))
988 zebra_vxlan_if_down(ifp
);
989 else if (IS_ZEBRA_IF_BRIDGE(ifp
)) {
991 zebra_vxlan_svi_down(ifp
, link_if
);
992 } else if (IS_ZEBRA_IF_VLAN(ifp
)) {
993 link_if
= if_lookup_by_index_per_ns(zvrf
->zns
,
996 zebra_vxlan_svi_down(ifp
, link_if
);
1000 /* Notify to the protocol daemons. */
1001 zebra_interface_down_update(ifp
);
1003 /* Uninstall connected routes from the kernel. */
1004 if_uninstall_connected(ifp
);
1006 if (IS_ZEBRA_DEBUG_RIB_DETAILED
)
1007 zlog_debug("%u: IF %s down, scheduling RIB processing",
1008 ifp
->vrf_id
, ifp
->name
);
1009 rib_update(ifp
->vrf_id
, RIB_UPDATE_IF_CHANGE
);
1011 if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(ifp
);
1013 /* Delete all neighbor addresses learnt through IPv6 RA */
1014 if_down_del_nbr_connected(ifp
);
1017 void if_refresh(struct interface
*ifp
)
1022 void zebra_if_update_link(struct interface
*ifp
, ifindex_t link_ifindex
,
1025 struct zebra_if
*zif
;
1027 if (IS_ZEBRA_IF_VETH(ifp
))
1029 zif
= (struct zebra_if
*)ifp
->info
;
1030 zif
->link_ifindex
= link_ifindex
;
1031 zif
->link
= if_lookup_by_index_per_ns(zebra_ns_lookup(ns_id
),
1036 * during initial link dump kernel does not order lower devices before
1037 * upper devices so we need to fixup link dependencies at the end of dump
1039 void zebra_if_update_all_links(void)
1041 struct route_node
*rn
;
1042 struct interface
*ifp
;
1043 struct zebra_if
*zif
;
1044 struct zebra_ns
*ns
;
1046 if (IS_ZEBRA_DEBUG_KERNEL
)
1047 zlog_info("fixup link dependencies");
1049 ns
= zebra_ns_lookup(NS_DEFAULT
);
1050 for (rn
= route_top(ns
->if_table
); rn
; rn
= route_next(rn
)) {
1051 ifp
= (struct interface
*)rn
->info
;
1055 if ((zif
->link_ifindex
!= IFINDEX_INTERNAL
) && !zif
->link
) {
1056 zif
->link
= if_lookup_by_index_per_ns(ns
,
1058 if (IS_ZEBRA_DEBUG_KERNEL
)
1059 zlog_debug("interface %s/%d's lower fixup to %s/%d",
1060 ifp
->name
, ifp
->ifindex
,
1061 zif
->link
?zif
->link
->name
:"unk",
1069 /* Output prefix string to vty. */
1070 static int prefix_vty_out(struct vty
*vty
, struct prefix
*p
)
1072 char str
[INET6_ADDRSTRLEN
];
1074 inet_ntop(p
->family
, &p
->u
.prefix
, str
, sizeof(str
));
1075 vty_out(vty
, "%s", str
);
1079 /* Dump if address information to vty. */
1080 static void connected_dump_vty(struct vty
*vty
, struct connected
*connected
)
1084 /* Print interface address. */
1085 p
= connected
->address
;
1086 vty_out(vty
, " %s ", prefix_family_str(p
));
1087 prefix_vty_out(vty
, p
);
1088 vty_out(vty
, "/%d", p
->prefixlen
);
1090 /* If there is destination address, print it. */
1091 if (connected
->destination
) {
1093 (CONNECTED_PEER(connected
) ? " peer " : " broadcast "));
1094 prefix_vty_out(vty
, connected
->destination
);
1095 if (CONNECTED_PEER(connected
))
1096 vty_out(vty
, "/%d", connected
->destination
->prefixlen
);
1099 if (CHECK_FLAG(connected
->flags
, ZEBRA_IFA_SECONDARY
))
1100 vty_out(vty
, " secondary");
1102 if (CHECK_FLAG(connected
->flags
, ZEBRA_IFA_UNNUMBERED
))
1103 vty_out(vty
, " unnumbered");
1105 if (connected
->label
)
1106 vty_out(vty
, " %s", connected
->label
);
1111 /* Dump interface neighbor address information to vty. */
1112 static void nbr_connected_dump_vty(struct vty
*vty
,
1113 struct nbr_connected
*connected
)
1117 /* Print interface address. */
1118 p
= connected
->address
;
1119 vty_out(vty
, " %s ", prefix_family_str(p
));
1120 prefix_vty_out(vty
, p
);
1121 vty_out(vty
, "/%d", p
->prefixlen
);
1126 static const char *zebra_ziftype_2str(zebra_iftype_t zif_type
)
1129 case ZEBRA_IF_OTHER
:
1133 case ZEBRA_IF_BRIDGE
:
1141 case ZEBRA_IF_VXLAN
:
1156 case ZEBRA_IF_BOND_SLAVE
:
1157 return "bond_slave";
1159 case ZEBRA_IF_MACVLAN
:
1168 /* Interface's information print out to vty interface. */
1169 static void if_dump_vty(struct vty
*vty
, struct interface
*ifp
)
1171 struct connected
*connected
;
1172 struct nbr_connected
*nbr_connected
;
1173 struct listnode
*node
;
1174 struct route_node
*rn
;
1175 struct zebra_if
*zebra_if
;
1178 zebra_if
= ifp
->info
;
1180 vty_out(vty
, "Interface %s is ", ifp
->name
);
1181 if (if_is_up(ifp
)) {
1182 vty_out(vty
, "up, line protocol ");
1184 if (CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
)) {
1185 if (if_is_running(ifp
))
1186 vty_out(vty
, "is up\n");
1188 vty_out(vty
, "is down\n");
1190 vty_out(vty
, "detection is disabled\n");
1193 vty_out(vty
, "down\n");
1196 vty_out(vty
, " Link ups: %5u last: %s\n", zebra_if
->up_count
,
1197 zebra_if
->up_last
[0] ? zebra_if
->up_last
: "(never)");
1198 vty_out(vty
, " Link downs: %5u last: %s\n", zebra_if
->down_count
,
1199 zebra_if
->down_last
[0] ? zebra_if
->down_last
: "(never)");
1201 zebra_ptm_show_status(vty
, ifp
);
1203 vrf
= vrf_lookup_by_id(ifp
->vrf_id
);
1204 vty_out(vty
, " vrf: %s\n", vrf
->name
);
1207 vty_out(vty
, " Description: %s\n", ifp
->desc
);
1208 if (ifp
->ifindex
== IFINDEX_INTERNAL
) {
1209 vty_out(vty
, " pseudo interface\n");
1211 } else if (!CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
1212 vty_out(vty
, " index %d inactive interface\n", ifp
->ifindex
);
1216 vty_out(vty
, " index %d metric %d mtu %d speed %u ", ifp
->ifindex
,
1217 ifp
->metric
, ifp
->mtu
, ifp
->speed
);
1218 if (ifp
->mtu6
!= ifp
->mtu
)
1219 vty_out(vty
, "mtu6 %d ", ifp
->mtu6
);
1220 vty_out(vty
, "\n flags: %s\n", if_flag_dump(ifp
->flags
));
1222 /* Hardware address. */
1223 vty_out(vty
, " Type: %s\n", if_link_type_str(ifp
->ll_type
));
1224 if (ifp
->hw_addr_len
!= 0) {
1227 vty_out(vty
, " HWaddr: ");
1228 for (i
= 0; i
< ifp
->hw_addr_len
; i
++)
1229 vty_out(vty
, "%s%02x", i
== 0 ? "" : ":",
1234 /* Bandwidth in Mbps */
1235 if (ifp
->bandwidth
!= 0) {
1236 vty_out(vty
, " bandwidth %u Mbps", ifp
->bandwidth
);
1240 for (rn
= route_top(zebra_if
->ipv4_subnets
); rn
; rn
= route_next(rn
)) {
1244 for (ALL_LIST_ELEMENTS_RO((struct list
*)rn
->info
, node
,
1246 connected_dump_vty(vty
, connected
);
1249 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, node
, connected
)) {
1250 if (CHECK_FLAG(connected
->conf
, ZEBRA_IFC_REAL
)
1251 && (connected
->address
->family
== AF_INET6
))
1252 connected_dump_vty(vty
, connected
);
1255 vty_out(vty
, " Interface Type %s\n",
1256 zebra_ziftype_2str(zebra_if
->zif_type
));
1257 if (IS_ZEBRA_IF_BRIDGE(ifp
)) {
1258 struct zebra_l2info_bridge
*bridge_info
;
1260 bridge_info
= &zebra_if
->l2info
.br
;
1261 vty_out(vty
, " Bridge VLAN-aware: %s\n",
1262 bridge_info
->vlan_aware
? "yes" : "no");
1263 } else if (IS_ZEBRA_IF_VLAN(ifp
)) {
1264 struct zebra_l2info_vlan
*vlan_info
;
1266 vlan_info
= &zebra_if
->l2info
.vl
;
1267 vty_out(vty
, " VLAN Id %u\n", vlan_info
->vid
);
1268 } else if (IS_ZEBRA_IF_VXLAN(ifp
)) {
1269 struct zebra_l2info_vxlan
*vxlan_info
;
1271 vxlan_info
= &zebra_if
->l2info
.vxl
;
1272 vty_out(vty
, " VxLAN Id %u", vxlan_info
->vni
);
1273 if (vxlan_info
->vtep_ip
.s_addr
!= INADDR_ANY
)
1274 vty_out(vty
, " VTEP IP: %s",
1275 inet_ntoa(vxlan_info
->vtep_ip
));
1276 if (vxlan_info
->access_vlan
)
1277 vty_out(vty
, " Access VLAN Id %u",
1278 vxlan_info
->access_vlan
);
1282 if (IS_ZEBRA_IF_BRIDGE_SLAVE(ifp
)) {
1283 struct zebra_l2info_brslave
*br_slave
;
1285 br_slave
= &zebra_if
->brslave_info
;
1286 if (br_slave
->bridge_ifindex
!= IFINDEX_INTERNAL
)
1287 vty_out(vty
, " Master (bridge) ifindex %u\n",
1288 br_slave
->bridge_ifindex
);
1291 if (IS_ZEBRA_IF_BOND_SLAVE(ifp
)) {
1292 struct zebra_l2info_bondslave
*bond_slave
;
1294 bond_slave
= &zebra_if
->bondslave_info
;
1295 if (bond_slave
->bond_ifindex
!= IFINDEX_INTERNAL
)
1296 vty_out(vty
, " Master (bond) ifindex %u\n",
1297 bond_slave
->bond_ifindex
);
1300 if (zebra_if
->link_ifindex
!= IFINDEX_INTERNAL
) {
1301 vty_out(vty
, " Link ifindex %u", zebra_if
->link_ifindex
);
1303 vty_out(vty
, "(%s)\n", zebra_if
->link
->name
);
1305 vty_out(vty
, "(Unknown)\n");
1308 if (HAS_LINK_PARAMS(ifp
)) {
1310 struct if_link_params
*iflp
= ifp
->link_params
;
1311 vty_out(vty
, " Traffic Engineering Link Parameters:\n");
1312 if (IS_PARAM_SET(iflp
, LP_TE_METRIC
))
1313 vty_out(vty
, " TE metric %u\n", iflp
->te_metric
);
1314 if (IS_PARAM_SET(iflp
, LP_MAX_BW
))
1315 vty_out(vty
, " Maximum Bandwidth %g (Byte/s)\n",
1317 if (IS_PARAM_SET(iflp
, LP_MAX_RSV_BW
))
1319 " Maximum Reservable Bandwidth %g (Byte/s)\n",
1321 if (IS_PARAM_SET(iflp
, LP_UNRSV_BW
)) {
1323 " Unreserved Bandwidth per Class Type in Byte/s:\n");
1324 for (i
= 0; i
< MAX_CLASS_TYPE
; i
+= 2)
1326 " [%d]: %g (Bytes/sec),\t[%d]: %g (Bytes/sec)\n",
1327 i
, iflp
->unrsv_bw
[i
], i
+ 1,
1328 iflp
->unrsv_bw
[i
+ 1]);
1331 if (IS_PARAM_SET(iflp
, LP_ADM_GRP
))
1332 vty_out(vty
, " Administrative Group:%u\n",
1334 if (IS_PARAM_SET(iflp
, LP_DELAY
)) {
1335 vty_out(vty
, " Link Delay Average: %u (micro-sec.)",
1337 if (IS_PARAM_SET(iflp
, LP_MM_DELAY
)) {
1338 vty_out(vty
, " Min: %u (micro-sec.)",
1340 vty_out(vty
, " Max: %u (micro-sec.)",
1345 if (IS_PARAM_SET(iflp
, LP_DELAY_VAR
))
1347 " Link Delay Variation %u (micro-sec.)\n",
1349 if (IS_PARAM_SET(iflp
, LP_PKT_LOSS
))
1350 vty_out(vty
, " Link Packet Loss %g (in %%)\n",
1352 if (IS_PARAM_SET(iflp
, LP_AVA_BW
))
1353 vty_out(vty
, " Available Bandwidth %g (Byte/s)\n",
1355 if (IS_PARAM_SET(iflp
, LP_RES_BW
))
1356 vty_out(vty
, " Residual Bandwidth %g (Byte/s)\n",
1358 if (IS_PARAM_SET(iflp
, LP_USE_BW
))
1359 vty_out(vty
, " Utilized Bandwidth %g (Byte/s)\n",
1361 if (IS_PARAM_SET(iflp
, LP_RMT_AS
))
1362 vty_out(vty
, " Neighbor ASBR IP: %s AS: %u \n",
1363 inet_ntoa(iflp
->rmt_ip
), iflp
->rmt_as
);
1366 hook_call(zebra_if_extra_info
, vty
, ifp
);
1368 if (listhead(ifp
->nbr_connected
))
1369 vty_out(vty
, " Neighbor address(s):\n");
1370 for (ALL_LIST_ELEMENTS_RO(ifp
->nbr_connected
, node
, nbr_connected
))
1371 nbr_connected_dump_vty(vty
, nbr_connected
);
1373 #ifdef HAVE_PROC_NET_DEV
1374 /* Statistics print out using proc file system. */
1376 " %lu input packets (%lu multicast), %lu bytes, "
1378 ifp
->stats
.rx_packets
, ifp
->stats
.rx_multicast
,
1379 ifp
->stats
.rx_bytes
, ifp
->stats
.rx_dropped
);
1382 " %lu input errors, %lu length, %lu overrun,"
1383 " %lu CRC, %lu frame\n",
1384 ifp
->stats
.rx_errors
, ifp
->stats
.rx_length_errors
,
1385 ifp
->stats
.rx_over_errors
, ifp
->stats
.rx_crc_errors
,
1386 ifp
->stats
.rx_frame_errors
);
1388 vty_out(vty
, " %lu fifo, %lu missed\n", ifp
->stats
.rx_fifo_errors
,
1389 ifp
->stats
.rx_missed_errors
);
1391 vty_out(vty
, " %lu output packets, %lu bytes, %lu dropped\n",
1392 ifp
->stats
.tx_packets
, ifp
->stats
.tx_bytes
,
1393 ifp
->stats
.tx_dropped
);
1396 " %lu output errors, %lu aborted, %lu carrier,"
1397 " %lu fifo, %lu heartbeat\n",
1398 ifp
->stats
.tx_errors
, ifp
->stats
.tx_aborted_errors
,
1399 ifp
->stats
.tx_carrier_errors
, ifp
->stats
.tx_fifo_errors
,
1400 ifp
->stats
.tx_heartbeat_errors
);
1402 vty_out(vty
, " %lu window, %lu collisions\n",
1403 ifp
->stats
.tx_window_errors
, ifp
->stats
.collisions
);
1404 #endif /* HAVE_PROC_NET_DEV */
1406 #ifdef HAVE_NET_RT_IFLIST
1407 #if defined(__bsdi__) || defined(__NetBSD__)
1408 /* Statistics print out using sysctl (). */
1410 " input packets %llu, bytes %llu, dropped %llu,"
1411 " multicast packets %llu\n",
1412 (unsigned long long)ifp
->stats
.ifi_ipackets
,
1413 (unsigned long long)ifp
->stats
.ifi_ibytes
,
1414 (unsigned long long)ifp
->stats
.ifi_iqdrops
,
1415 (unsigned long long)ifp
->stats
.ifi_imcasts
);
1417 vty_out(vty
, " input errors %llu\n",
1418 (unsigned long long)ifp
->stats
.ifi_ierrors
);
1421 " output packets %llu, bytes %llu,"
1422 " multicast packets %llu\n",
1423 (unsigned long long)ifp
->stats
.ifi_opackets
,
1424 (unsigned long long)ifp
->stats
.ifi_obytes
,
1425 (unsigned long long)ifp
->stats
.ifi_omcasts
);
1427 vty_out(vty
, " output errors %llu\n",
1428 (unsigned long long)ifp
->stats
.ifi_oerrors
);
1430 vty_out(vty
, " collisions %llu\n",
1431 (unsigned long long)ifp
->stats
.ifi_collisions
);
1433 /* Statistics print out using sysctl (). */
1435 " input packets %lu, bytes %lu, dropped %lu,"
1436 " multicast packets %lu\n",
1437 ifp
->stats
.ifi_ipackets
, ifp
->stats
.ifi_ibytes
,
1438 ifp
->stats
.ifi_iqdrops
, ifp
->stats
.ifi_imcasts
);
1440 vty_out(vty
, " input errors %lu\n", ifp
->stats
.ifi_ierrors
);
1443 " output packets %lu, bytes %lu, multicast packets %lu\n",
1444 ifp
->stats
.ifi_opackets
, ifp
->stats
.ifi_obytes
,
1445 ifp
->stats
.ifi_omcasts
);
1447 vty_out(vty
, " output errors %lu\n", ifp
->stats
.ifi_oerrors
);
1449 vty_out(vty
, " collisions %lu\n", ifp
->stats
.ifi_collisions
);
1450 #endif /* __bsdi__ || __NetBSD__ */
1451 #endif /* HAVE_NET_RT_IFLIST */
1454 static void interface_update_stats(void)
1456 #ifdef HAVE_PROC_NET_DEV
1457 /* If system has interface statistics via proc file system, update
1459 ifstat_update_proc();
1460 #endif /* HAVE_PROC_NET_DEV */
1461 #ifdef HAVE_NET_RT_IFLIST
1462 ifstat_update_sysctl();
1463 #endif /* HAVE_NET_RT_IFLIST */
1466 struct cmd_node interface_node
= {INTERFACE_NODE
, "%s(config-if)# ", 1};
1468 /* Show all interfaces to vty. */
1469 DEFUN (show_interface
,
1471 "show interface [vrf NAME]",
1473 "Interface status and configuration\n"
1477 struct interface
*ifp
;
1478 vrf_id_t vrf_id
= VRF_DEFAULT
;
1480 interface_update_stats();
1483 VRF_GET_ID(vrf_id
, argv
[3]->arg
, false);
1485 /* All interface print. */
1486 vrf
= vrf_lookup_by_id(vrf_id
);
1487 FOR_ALL_INTERFACES (vrf
, ifp
)
1488 if_dump_vty(vty
, ifp
);
1494 /* Show all interfaces to vty. */
1495 DEFUN (show_interface_vrf_all
,
1496 show_interface_vrf_all_cmd
,
1497 "show interface vrf all",
1499 "Interface status and configuration\n"
1500 VRF_ALL_CMD_HELP_STR
)
1503 struct interface
*ifp
;
1505 interface_update_stats();
1507 /* All interface print. */
1508 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
)
1509 FOR_ALL_INTERFACES (vrf
, ifp
)
1510 if_dump_vty(vty
, ifp
);
1515 /* Show specified interface to vty. */
1517 DEFUN (show_interface_name_vrf
,
1518 show_interface_name_vrf_cmd
,
1519 "show interface IFNAME vrf NAME",
1521 "Interface status and configuration\n"
1527 struct interface
*ifp
;
1530 interface_update_stats();
1532 VRF_GET_ID(vrf_id
, argv
[idx_name
]->arg
, false);
1534 /* Specified interface print. */
1535 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf_id
);
1537 vty_out(vty
, "%% Can't find interface %s\n",
1538 argv
[idx_ifname
]->arg
);
1541 if_dump_vty(vty
, ifp
);
1546 /* Show specified interface to vty. */
1547 DEFUN (show_interface_name_vrf_all
,
1548 show_interface_name_vrf_all_cmd
,
1549 "show interface IFNAME [vrf all]",
1551 "Interface status and configuration\n"
1553 VRF_ALL_CMD_HELP_STR
)
1557 struct interface
*ifp
;
1560 interface_update_stats();
1562 /* All interface print. */
1563 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
1564 /* Specified interface print. */
1565 ifp
= if_lookup_by_name(argv
[idx_ifname
]->arg
, vrf
->vrf_id
);
1567 if_dump_vty(vty
, ifp
);
1573 vty_out(vty
, "%% Can't find interface %s\n",
1574 argv
[idx_ifname
]->arg
);
1582 static void if_show_description(struct vty
*vty
, vrf_id_t vrf_id
)
1584 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
1585 struct interface
*ifp
;
1587 vty_out(vty
, "Interface Status Protocol Description\n");
1588 FOR_ALL_INTERFACES (vrf
, ifp
) {
1591 len
= vty_out(vty
, "%s", ifp
->name
);
1592 vty_out(vty
, "%*s", (16 - len
), " ");
1594 if (if_is_up(ifp
)) {
1595 vty_out(vty
, "up ");
1596 if (CHECK_FLAG(ifp
->status
,
1597 ZEBRA_INTERFACE_LINKDETECTION
)) {
1598 if (if_is_running(ifp
))
1599 vty_out(vty
, "up ");
1601 vty_out(vty
, "down ");
1603 vty_out(vty
, "unknown ");
1606 vty_out(vty
, "down down ");
1610 vty_out(vty
, "%s", ifp
->desc
);
1615 DEFUN (show_interface_desc
,
1616 show_interface_desc_cmd
,
1617 "show interface description [vrf NAME]",
1619 "Interface status and configuration\n"
1620 "Interface description\n"
1623 vrf_id_t vrf_id
= VRF_DEFAULT
;
1626 VRF_GET_ID(vrf_id
, argv
[4]->arg
, false);
1628 if_show_description(vty
, vrf_id
);
1634 DEFUN (show_interface_desc_vrf_all
,
1635 show_interface_desc_vrf_all_cmd
,
1636 "show interface description vrf all",
1638 "Interface status and configuration\n"
1639 "Interface description\n"
1640 VRF_ALL_CMD_HELP_STR
)
1644 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
)
1645 if (!RB_EMPTY(if_name_head
, &vrf
->ifaces_by_name
)) {
1646 vty_out(vty
, "\n\tVRF %u\n\n", vrf
->vrf_id
);
1647 if_show_description(vty
, vrf
->vrf_id
);
1656 "Set multicast flag to interface\n")
1658 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1660 struct zebra_if
*if_data
;
1662 if (CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
1663 ret
= if_set_flags(ifp
, IFF_MULTICAST
);
1665 vty_out(vty
, "Can't set multicast flag\n");
1666 return CMD_WARNING_CONFIG_FAILED
;
1670 if_data
= ifp
->info
;
1671 if_data
->multicast
= IF_ZEBRA_MULTICAST_ON
;
1676 DEFUN (no_multicast
,
1680 "Unset multicast flag to interface\n")
1682 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1684 struct zebra_if
*if_data
;
1686 if (CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
1687 ret
= if_unset_flags(ifp
, IFF_MULTICAST
);
1689 vty_out(vty
, "Can't unset multicast flag\n");
1690 return CMD_WARNING_CONFIG_FAILED
;
1694 if_data
= ifp
->info
;
1695 if_data
->multicast
= IF_ZEBRA_MULTICAST_OFF
;
1703 "Enable link detection on interface\n")
1705 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1706 int if_was_operative
;
1708 if_was_operative
= if_is_no_ptm_operative(ifp
);
1709 SET_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
);
1711 /* When linkdetection is enabled, if might come down */
1712 if (!if_is_no_ptm_operative(ifp
) && if_was_operative
)
1715 /* FIXME: Will defer status change forwarding if interface
1716 does not come down! */
1722 DEFUN (no_linkdetect
,
1726 "Disable link detection on interface\n")
1728 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1729 int if_was_operative
;
1731 if_was_operative
= if_is_no_ptm_operative(ifp
);
1732 UNSET_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
);
1734 /* Interface may come up after disabling link detection */
1735 if (if_is_operative(ifp
) && !if_was_operative
)
1738 /* FIXME: see linkdetect_cmd */
1746 "Shutdown the selected interface\n")
1748 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1750 struct zebra_if
*if_data
;
1752 if (ifp
->ifindex
!= IFINDEX_INTERNAL
) {
1753 ret
= if_unset_flags(ifp
, IFF_UP
);
1755 vty_out(vty
, "Can't shutdown interface\n");
1756 return CMD_WARNING_CONFIG_FAILED
;
1760 if_data
= ifp
->info
;
1761 if_data
->shutdown
= IF_ZEBRA_SHUTDOWN_ON
;
1766 DEFUN (no_shutdown_if
,
1770 "Shutdown the selected interface\n")
1772 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1774 struct zebra_if
*if_data
;
1776 if (ifp
->ifindex
!= IFINDEX_INTERNAL
) {
1777 ret
= if_set_flags(ifp
, IFF_UP
| IFF_RUNNING
);
1779 vty_out(vty
, "Can't up interface\n");
1780 return CMD_WARNING_CONFIG_FAILED
;
1784 /* Some addresses (in particular, IPv6 addresses on Linux) get
1785 * removed when the interface goes down. They need to be
1788 if_addr_wakeup(ifp
);
1791 if_data
= ifp
->info
;
1792 if_data
->shutdown
= IF_ZEBRA_SHUTDOWN_OFF
;
1797 DEFUN (bandwidth_if
,
1799 "bandwidth (1-100000)",
1800 "Set bandwidth informational parameter\n"
1801 "Bandwidth in megabits\n")
1804 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1805 unsigned int bandwidth
;
1807 bandwidth
= strtol(argv
[idx_number
]->arg
, NULL
, 10);
1809 /* bandwidth range is <1-100000> */
1810 if (bandwidth
< 1 || bandwidth
> 100000) {
1811 vty_out(vty
, "Bandwidth is invalid\n");
1812 return CMD_WARNING_CONFIG_FAILED
;
1815 ifp
->bandwidth
= bandwidth
;
1817 /* force protocols to recalculate routes due to cost change */
1818 if (if_is_operative(ifp
))
1819 zebra_interface_up_update(ifp
);
1824 DEFUN (no_bandwidth_if
,
1825 no_bandwidth_if_cmd
,
1826 "no bandwidth [(1-100000)]",
1828 "Set bandwidth informational parameter\n"
1829 "Bandwidth in megabits\n")
1831 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1835 /* force protocols to recalculate routes due to cost change */
1836 if (if_is_operative(ifp
))
1837 zebra_interface_up_update(ifp
);
1843 struct cmd_node link_params_node
= {
1844 LINK_PARAMS_NODE
, "%s(config-link-params)# ", 1,
1847 static void link_param_cmd_set_uint32(struct interface
*ifp
, uint32_t *field
,
1848 uint32_t type
, uint32_t value
)
1850 /* Update field as needed */
1851 if (IS_PARAM_UNSET(ifp
->link_params
, type
) || *field
!= value
) {
1853 SET_PARAM(ifp
->link_params
, type
);
1855 /* force protocols to update LINK STATE due to parameters change
1857 if (if_is_operative(ifp
))
1858 zebra_interface_parameters_update(ifp
);
1861 static void link_param_cmd_set_float(struct interface
*ifp
, float *field
,
1862 uint32_t type
, float value
)
1865 /* Update field as needed */
1866 if (IS_PARAM_UNSET(ifp
->link_params
, type
) || *field
!= value
) {
1868 SET_PARAM(ifp
->link_params
, type
);
1870 /* force protocols to update LINK STATE due to parameters change
1872 if (if_is_operative(ifp
))
1873 zebra_interface_parameters_update(ifp
);
1877 static void link_param_cmd_unset(struct interface
*ifp
, uint32_t type
)
1879 if (ifp
->link_params
== NULL
)
1883 UNSET_PARAM(ifp
->link_params
, type
);
1885 /* force protocols to update LINK STATE due to parameters change */
1886 if (if_is_operative(ifp
))
1887 zebra_interface_parameters_update(ifp
);
1890 DEFUN_NOSH (link_params
,
1895 /* vty->qobj_index stays the same @ interface pointer */
1896 vty
->node
= LINK_PARAMS_NODE
;
1901 DEFUN_NOSH (exit_link_params
,
1902 exit_link_params_cmd
,
1904 "Exit from Link Params configuration mode\n")
1906 if (vty
->node
== LINK_PARAMS_NODE
)
1907 vty
->node
= INTERFACE_NODE
;
1911 /* Specific Traffic Engineering parameters commands */
1912 DEFUN (link_params_enable
,
1913 link_params_enable_cmd
,
1915 "Activate link parameters on this interface\n")
1917 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1919 /* This command could be issue at startup, when activate MPLS TE */
1920 /* on a new interface or after a ON / OFF / ON toggle */
1921 /* In all case, TE parameters are reset to their default factory */
1922 if (IS_ZEBRA_DEBUG_EVENT
)
1924 "Link-params: enable TE link parameters on interface %s",
1927 if (!if_link_params_get(ifp
)) {
1928 if (IS_ZEBRA_DEBUG_EVENT
)
1930 "Link-params: failed to init TE link parameters %s",
1933 return CMD_WARNING_CONFIG_FAILED
;
1936 /* force protocols to update LINK STATE due to parameters change */
1937 if (if_is_operative(ifp
))
1938 zebra_interface_parameters_update(ifp
);
1943 DEFUN (no_link_params_enable
,
1944 no_link_params_enable_cmd
,
1947 "Disable link parameters on this interface\n")
1949 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1951 zlog_debug("MPLS-TE: disable TE link parameters on interface %s",
1954 if_link_params_free(ifp
);
1956 /* force protocols to update LINK STATE due to parameters change */
1957 if (if_is_operative(ifp
))
1958 zebra_interface_parameters_update(ifp
);
1963 /* STANDARD TE metrics */
1964 DEFUN (link_params_metric
,
1965 link_params_metric_cmd
,
1966 "metric (0-4294967295)",
1967 "Link metric for MPLS-TE purpose\n"
1968 "Metric value in decimal\n")
1971 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1972 struct if_link_params
*iflp
= if_link_params_get(ifp
);
1975 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1977 /* Update TE metric if needed */
1978 link_param_cmd_set_uint32(ifp
, &iflp
->te_metric
, LP_TE_METRIC
, metric
);
1983 DEFUN (no_link_params_metric
,
1984 no_link_params_metric_cmd
,
1987 "Disable Link Metric on this interface\n")
1989 VTY_DECLVAR_CONTEXT(interface
, ifp
);
1991 /* Unset TE Metric */
1992 link_param_cmd_unset(ifp
, LP_TE_METRIC
);
1997 DEFUN (link_params_maxbw
,
1998 link_params_maxbw_cmd
,
2000 "Maximum bandwidth that can be used\n"
2001 "Bytes/second (IEEE floating point format)\n")
2003 int idx_bandwidth
= 1;
2004 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2005 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2009 if (sscanf(argv
[idx_bandwidth
]->arg
, "%g", &bw
) != 1) {
2010 vty_out(vty
, "link_params_maxbw: fscanf: %s\n",
2011 safe_strerror(errno
));
2012 return CMD_WARNING_CONFIG_FAILED
;
2015 /* Check that Maximum bandwidth is not lower than other bandwidth
2017 if ((bw
<= iflp
->max_rsv_bw
) || (bw
<= iflp
->unrsv_bw
[0])
2018 || (bw
<= iflp
->unrsv_bw
[1]) || (bw
<= iflp
->unrsv_bw
[2])
2019 || (bw
<= iflp
->unrsv_bw
[3]) || (bw
<= iflp
->unrsv_bw
[4])
2020 || (bw
<= iflp
->unrsv_bw
[5]) || (bw
<= iflp
->unrsv_bw
[6])
2021 || (bw
<= iflp
->unrsv_bw
[7]) || (bw
<= iflp
->ava_bw
)
2022 || (bw
<= iflp
->res_bw
) || (bw
<= iflp
->use_bw
)) {
2024 "Maximum Bandwidth could not be lower than others bandwidth\n");
2025 return CMD_WARNING_CONFIG_FAILED
;
2028 /* Update Maximum Bandwidth if needed */
2029 link_param_cmd_set_float(ifp
, &iflp
->max_bw
, LP_MAX_BW
, bw
);
2034 DEFUN (link_params_max_rsv_bw
,
2035 link_params_max_rsv_bw_cmd
,
2036 "max-rsv-bw BANDWIDTH",
2037 "Maximum bandwidth that may be reserved\n"
2038 "Bytes/second (IEEE floating point format)\n")
2040 int idx_bandwidth
= 1;
2041 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2042 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2045 if (sscanf(argv
[idx_bandwidth
]->arg
, "%g", &bw
) != 1) {
2046 vty_out(vty
, "link_params_max_rsv_bw: fscanf: %s\n",
2047 safe_strerror(errno
));
2048 return CMD_WARNING_CONFIG_FAILED
;
2051 /* Check that bandwidth is not greater than maximum bandwidth parameter
2053 if (bw
> iflp
->max_bw
) {
2055 "Maximum Reservable Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2057 return CMD_WARNING_CONFIG_FAILED
;
2060 /* Update Maximum Reservable Bandwidth if needed */
2061 link_param_cmd_set_float(ifp
, &iflp
->max_rsv_bw
, LP_MAX_RSV_BW
, bw
);
2066 DEFUN (link_params_unrsv_bw
,
2067 link_params_unrsv_bw_cmd
,
2068 "unrsv-bw (0-7) BANDWIDTH",
2069 "Unreserved bandwidth at each priority level\n"
2071 "Bytes/second (IEEE floating point format)\n")
2074 int idx_bandwidth
= 2;
2075 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2076 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2080 /* We don't have to consider about range check here. */
2081 if (sscanf(argv
[idx_number
]->arg
, "%d", &priority
) != 1) {
2082 vty_out(vty
, "link_params_unrsv_bw: fscanf: %s\n",
2083 safe_strerror(errno
));
2084 return CMD_WARNING_CONFIG_FAILED
;
2087 if (sscanf(argv
[idx_bandwidth
]->arg
, "%g", &bw
) != 1) {
2088 vty_out(vty
, "link_params_unrsv_bw: fscanf: %s\n",
2089 safe_strerror(errno
));
2090 return CMD_WARNING_CONFIG_FAILED
;
2093 /* Check that bandwidth is not greater than maximum bandwidth parameter
2095 if (bw
> iflp
->max_bw
) {
2097 "UnReserved Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2099 return CMD_WARNING_CONFIG_FAILED
;
2102 /* Update Unreserved Bandwidth if needed */
2103 link_param_cmd_set_float(ifp
, &iflp
->unrsv_bw
[priority
], LP_UNRSV_BW
,
2109 DEFUN (link_params_admin_grp
,
2110 link_params_admin_grp_cmd
,
2111 "admin-grp BITPATTERN",
2112 "Administrative group membership\n"
2113 "32-bit Hexadecimal value (e.g. 0xa1)\n")
2115 int idx_bitpattern
= 1;
2116 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2117 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2118 unsigned long value
;
2120 if (sscanf(argv
[idx_bitpattern
]->arg
, "0x%lx", &value
) != 1) {
2121 vty_out(vty
, "link_params_admin_grp: fscanf: %s\n",
2122 safe_strerror(errno
));
2123 return CMD_WARNING_CONFIG_FAILED
;
2126 /* Update Administrative Group if needed */
2127 link_param_cmd_set_uint32(ifp
, &iflp
->admin_grp
, LP_ADM_GRP
, value
);
2132 DEFUN (no_link_params_admin_grp
,
2133 no_link_params_admin_grp_cmd
,
2136 "Disable Administrative group membership on this interface\n")
2138 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2140 /* Unset Admin Group */
2141 link_param_cmd_unset(ifp
, LP_ADM_GRP
);
2146 /* RFC5392 & RFC5316: INTER-AS */
2147 DEFUN (link_params_inter_as
,
2148 link_params_inter_as_cmd
,
2149 "neighbor A.B.C.D as (1-4294967295)",
2150 "Configure remote ASBR information (Neighbor IP address and AS number)\n"
2151 "Remote IP address in dot decimal A.B.C.D\n"
2152 "Remote AS number\n"
2153 "AS number in the range <1-4294967295>\n")
2158 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2159 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2160 struct in_addr addr
;
2163 if (!inet_aton(argv
[idx_ipv4
]->arg
, &addr
)) {
2164 vty_out(vty
, "Please specify Router-Addr by A.B.C.D\n");
2165 return CMD_WARNING_CONFIG_FAILED
;
2168 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2170 /* Update Remote IP and Remote AS fields if needed */
2171 if (IS_PARAM_UNSET(iflp
, LP_RMT_AS
) || iflp
->rmt_as
!= as
2172 || iflp
->rmt_ip
.s_addr
!= addr
.s_addr
) {
2175 iflp
->rmt_ip
.s_addr
= addr
.s_addr
;
2176 SET_PARAM(iflp
, LP_RMT_AS
);
2178 /* force protocols to update LINK STATE due to parameters change
2180 if (if_is_operative(ifp
))
2181 zebra_interface_parameters_update(ifp
);
2186 DEFUN (no_link_params_inter_as
,
2187 no_link_params_inter_as_cmd
,
2190 "Remove Neighbor IP address and AS number for Inter-AS TE\n")
2192 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2193 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2195 /* Reset Remote IP and AS neighbor */
2197 iflp
->rmt_ip
.s_addr
= 0;
2198 UNSET_PARAM(iflp
, LP_RMT_AS
);
2200 /* force protocols to update LINK STATE due to parameters change */
2201 if (if_is_operative(ifp
))
2202 zebra_interface_parameters_update(ifp
);
2207 /* RFC7471: OSPF Traffic Engineering (TE) Metric extensions &
2208 * draft-ietf-isis-metric-extensions-07.txt */
2209 DEFUN (link_params_delay
,
2210 link_params_delay_cmd
,
2211 "delay (0-16777215) [min (0-16777215) max (0-16777215)]",
2212 "Unidirectional Average Link Delay\n"
2213 "Average delay in micro-second as decimal (0...16777215)\n"
2215 "Minimum delay in micro-second as decimal (0...16777215)\n"
2217 "Maximum delay in micro-second as decimal (0...16777215)\n")
2219 /* Get and Check new delay values */
2220 uint32_t delay
= 0, low
= 0, high
= 0;
2221 delay
= strtoul(argv
[1]->arg
, NULL
, 10);
2223 low
= strtoul(argv
[3]->arg
, NULL
, 10);
2224 high
= strtoul(argv
[5]->arg
, NULL
, 10);
2227 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2228 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2232 /* Check new delay value against old Min and Max delays if set
2234 if (IS_PARAM_SET(iflp
, LP_MM_DELAY
)
2235 && (delay
<= iflp
->min_delay
|| delay
>= iflp
->max_delay
)) {
2237 "Average delay should be comprise between Min (%d) and Max (%d) delay\n",
2238 iflp
->min_delay
, iflp
->max_delay
);
2239 return CMD_WARNING_CONFIG_FAILED
;
2241 /* Update delay if value is not set or change */
2242 if (IS_PARAM_UNSET(iflp
, LP_DELAY
) || iflp
->av_delay
!= delay
) {
2243 iflp
->av_delay
= delay
;
2244 SET_PARAM(iflp
, LP_DELAY
);
2247 /* Unset Min and Max delays if already set */
2248 if (IS_PARAM_SET(iflp
, LP_MM_DELAY
)) {
2249 iflp
->min_delay
= 0;
2250 iflp
->max_delay
= 0;
2251 UNSET_PARAM(iflp
, LP_MM_DELAY
);
2255 /* Check new delays value coherency */
2256 if (delay
<= low
|| delay
>= high
) {
2258 "Average delay should be comprise between Min (%d) and Max (%d) delay\n",
2260 return CMD_WARNING_CONFIG_FAILED
;
2262 /* Update Delays if needed */
2263 if (IS_PARAM_UNSET(iflp
, LP_DELAY
)
2264 || IS_PARAM_UNSET(iflp
, LP_MM_DELAY
)
2265 || iflp
->av_delay
!= delay
|| iflp
->min_delay
!= low
2266 || iflp
->max_delay
!= high
) {
2267 iflp
->av_delay
= delay
;
2268 SET_PARAM(iflp
, LP_DELAY
);
2269 iflp
->min_delay
= low
;
2270 iflp
->max_delay
= high
;
2271 SET_PARAM(iflp
, LP_MM_DELAY
);
2276 /* force protocols to update LINK STATE due to parameters change */
2277 if (update
== 1 && if_is_operative(ifp
))
2278 zebra_interface_parameters_update(ifp
);
2283 DEFUN (no_link_params_delay
,
2284 no_link_params_delay_cmd
,
2287 "Disable Unidirectional Average, Min & Max Link Delay on this interface\n")
2289 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2290 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2294 UNSET_PARAM(iflp
, LP_DELAY
);
2295 iflp
->min_delay
= 0;
2296 iflp
->max_delay
= 0;
2297 UNSET_PARAM(iflp
, LP_MM_DELAY
);
2299 /* force protocols to update LINK STATE due to parameters change */
2300 if (if_is_operative(ifp
))
2301 zebra_interface_parameters_update(ifp
);
2306 DEFUN (link_params_delay_var
,
2307 link_params_delay_var_cmd
,
2308 "delay-variation (0-16777215)",
2309 "Unidirectional Link Delay Variation\n"
2310 "delay variation in micro-second as decimal (0...16777215)\n")
2313 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2314 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2317 value
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2319 /* Update Delay Variation if needed */
2320 link_param_cmd_set_uint32(ifp
, &iflp
->delay_var
, LP_DELAY_VAR
, value
);
2325 DEFUN (no_link_params_delay_var
,
2326 no_link_params_delay_var_cmd
,
2327 "no delay-variation",
2329 "Disable Unidirectional Delay Variation on this interface\n")
2331 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2333 /* Unset Delay Variation */
2334 link_param_cmd_unset(ifp
, LP_DELAY_VAR
);
2339 DEFUN (link_params_pkt_loss
,
2340 link_params_pkt_loss_cmd
,
2341 "packet-loss PERCENTAGE",
2342 "Unidirectional Link Packet Loss\n"
2343 "percentage of total traffic by 0.000003% step and less than 50.331642%\n")
2345 int idx_percentage
= 1;
2346 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2347 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2350 if (sscanf(argv
[idx_percentage
]->arg
, "%g", &fval
) != 1) {
2351 vty_out(vty
, "link_params_pkt_loss: fscanf: %s\n",
2352 safe_strerror(errno
));
2353 return CMD_WARNING_CONFIG_FAILED
;
2356 if (fval
> MAX_PKT_LOSS
)
2357 fval
= MAX_PKT_LOSS
;
2359 /* Update Packet Loss if needed */
2360 link_param_cmd_set_float(ifp
, &iflp
->pkt_loss
, LP_PKT_LOSS
, fval
);
2365 DEFUN (no_link_params_pkt_loss
,
2366 no_link_params_pkt_loss_cmd
,
2369 "Disable Unidirectional Link Packet Loss on this interface\n")
2371 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2373 /* Unset Packet Loss */
2374 link_param_cmd_unset(ifp
, LP_PKT_LOSS
);
2379 DEFUN (link_params_res_bw
,
2380 link_params_res_bw_cmd
,
2382 "Unidirectional Residual Bandwidth\n"
2383 "Bytes/second (IEEE floating point format)\n")
2385 int idx_bandwidth
= 1;
2386 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2387 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2390 if (sscanf(argv
[idx_bandwidth
]->arg
, "%g", &bw
) != 1) {
2391 vty_out(vty
, "link_params_res_bw: fscanf: %s\n",
2392 safe_strerror(errno
));
2393 return CMD_WARNING_CONFIG_FAILED
;
2396 /* Check that bandwidth is not greater than maximum bandwidth parameter
2398 if (bw
> iflp
->max_bw
) {
2400 "Residual Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2402 return CMD_WARNING_CONFIG_FAILED
;
2405 /* Update Residual Bandwidth if needed */
2406 link_param_cmd_set_float(ifp
, &iflp
->res_bw
, LP_RES_BW
, bw
);
2411 DEFUN (no_link_params_res_bw
,
2412 no_link_params_res_bw_cmd
,
2415 "Disable Unidirectional Residual Bandwidth on this interface\n")
2417 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2419 /* Unset Residual Bandwidth */
2420 link_param_cmd_unset(ifp
, LP_RES_BW
);
2425 DEFUN (link_params_ava_bw
,
2426 link_params_ava_bw_cmd
,
2428 "Unidirectional Available Bandwidth\n"
2429 "Bytes/second (IEEE floating point format)\n")
2431 int idx_bandwidth
= 1;
2432 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2433 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2436 if (sscanf(argv
[idx_bandwidth
]->arg
, "%g", &bw
) != 1) {
2437 vty_out(vty
, "link_params_ava_bw: fscanf: %s\n",
2438 safe_strerror(errno
));
2439 return CMD_WARNING_CONFIG_FAILED
;
2442 /* Check that bandwidth is not greater than maximum bandwidth parameter
2444 if (bw
> iflp
->max_bw
) {
2446 "Available Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2448 return CMD_WARNING_CONFIG_FAILED
;
2451 /* Update Residual Bandwidth if needed */
2452 link_param_cmd_set_float(ifp
, &iflp
->ava_bw
, LP_AVA_BW
, bw
);
2457 DEFUN (no_link_params_ava_bw
,
2458 no_link_params_ava_bw_cmd
,
2461 "Disable Unidirectional Available Bandwidth on this interface\n")
2463 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2465 /* Unset Available Bandwidth */
2466 link_param_cmd_unset(ifp
, LP_AVA_BW
);
2471 DEFUN (link_params_use_bw
,
2472 link_params_use_bw_cmd
,
2474 "Unidirectional Utilised Bandwidth\n"
2475 "Bytes/second (IEEE floating point format)\n")
2477 int idx_bandwidth
= 1;
2478 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2479 struct if_link_params
*iflp
= if_link_params_get(ifp
);
2482 if (sscanf(argv
[idx_bandwidth
]->arg
, "%g", &bw
) != 1) {
2483 vty_out(vty
, "link_params_use_bw: fscanf: %s\n",
2484 safe_strerror(errno
));
2485 return CMD_WARNING_CONFIG_FAILED
;
2488 /* Check that bandwidth is not greater than maximum bandwidth parameter
2490 if (bw
> iflp
->max_bw
) {
2492 "Utilised Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2494 return CMD_WARNING_CONFIG_FAILED
;
2497 /* Update Utilized Bandwidth if needed */
2498 link_param_cmd_set_float(ifp
, &iflp
->use_bw
, LP_USE_BW
, bw
);
2503 DEFUN (no_link_params_use_bw
,
2504 no_link_params_use_bw_cmd
,
2507 "Disable Unidirectional Utilised Bandwidth on this interface\n")
2509 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2511 /* Unset Utilised Bandwidth */
2512 link_param_cmd_unset(ifp
, LP_USE_BW
);
2517 static int ip_address_install(struct vty
*vty
, struct interface
*ifp
,
2518 const char *addr_str
, const char *peer_str
,
2521 struct zebra_if
*if_data
;
2522 struct prefix_ipv4 lp
, pp
;
2523 struct connected
*ifc
;
2524 struct prefix_ipv4
*p
;
2527 if_data
= ifp
->info
;
2529 ret
= str2prefix_ipv4(addr_str
, &lp
);
2531 vty_out(vty
, "%% Malformed address \n");
2532 return CMD_WARNING_CONFIG_FAILED
;
2535 if (ipv4_martian(&lp
.prefix
)) {
2536 vty_out(vty
, "%% Invalid address\n");
2537 return CMD_WARNING_CONFIG_FAILED
;
2541 if (lp
.prefixlen
!= 32) {
2543 "%% Local prefix length for P-t-P address must be /32\n");
2544 return CMD_WARNING_CONFIG_FAILED
;
2547 ret
= str2prefix_ipv4(peer_str
, &pp
);
2549 vty_out(vty
, "%% Malformed peer address\n");
2550 return CMD_WARNING_CONFIG_FAILED
;
2554 ifc
= connected_check_ptp(ifp
, &lp
, peer_str
? &pp
: NULL
);
2556 ifc
= connected_new();
2560 p
= prefix_ipv4_new();
2562 ifc
->address
= (struct prefix
*)p
;
2565 SET_FLAG(ifc
->flags
, ZEBRA_IFA_PEER
);
2566 p
= prefix_ipv4_new();
2568 ifc
->destination
= (struct prefix
*)p
;
2569 } else if (p
->prefixlen
<= IPV4_MAX_PREFIXLEN
- 2) {
2570 p
= prefix_ipv4_new();
2572 p
->prefix
.s_addr
= ipv4_broadcast_addr(p
->prefix
.s_addr
,
2574 ifc
->destination
= (struct prefix
*)p
;
2579 ifc
->label
= XSTRDUP(MTYPE_CONNECTED_LABEL
, label
);
2581 /* Add to linked list. */
2582 listnode_add(ifp
->connected
, ifc
);
2585 /* This address is configured from zebra. */
2586 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
2587 SET_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
2589 /* In case of this route need to install kernel. */
2590 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)
2591 && CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)
2592 && !(if_data
&& if_data
->shutdown
== IF_ZEBRA_SHUTDOWN_ON
)) {
2593 /* Some system need to up the interface to set IP address. */
2594 if (!if_is_up(ifp
)) {
2595 if_set_flags(ifp
, IFF_UP
| IFF_RUNNING
);
2599 ret
= if_set_prefix(ifp
, ifc
);
2601 vty_out(vty
, "%% Can't set interface IP address: %s.\n",
2602 safe_strerror(errno
));
2603 return CMD_WARNING_CONFIG_FAILED
;
2606 SET_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
);
2607 /* The address will be advertised to zebra clients when the
2609 * from the kernel has been received.
2610 * It will also be added to the subnet chain list, then. */
2616 static int ip_address_uninstall(struct vty
*vty
, struct interface
*ifp
,
2617 const char *addr_str
, const char *peer_str
,
2620 struct prefix_ipv4 lp
, pp
;
2621 struct connected
*ifc
;
2624 /* Convert to prefix structure. */
2625 ret
= str2prefix_ipv4(addr_str
, &lp
);
2627 vty_out(vty
, "%% Malformed address \n");
2628 return CMD_WARNING_CONFIG_FAILED
;
2632 if (lp
.prefixlen
!= 32) {
2634 "%% Local prefix length for P-t-P address must be /32\n");
2635 return CMD_WARNING_CONFIG_FAILED
;
2638 ret
= str2prefix_ipv4(peer_str
, &pp
);
2640 vty_out(vty
, "%% Malformed peer address\n");
2641 return CMD_WARNING_CONFIG_FAILED
;
2645 /* Check current interface address. */
2646 ifc
= connected_check_ptp(ifp
, &lp
, peer_str
? &pp
: NULL
);
2648 vty_out(vty
, "%% Can't find address\n");
2649 return CMD_WARNING_CONFIG_FAILED
;
2652 /* This is not configured address. */
2653 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
2654 return CMD_WARNING_CONFIG_FAILED
;
2656 UNSET_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
2658 /* This is not real address or interface is not active. */
2659 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)
2660 || !CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
2661 listnode_delete(ifp
->connected
, ifc
);
2662 connected_free(ifc
);
2663 return CMD_WARNING_CONFIG_FAILED
;
2666 /* This is real route. */
2667 ret
= if_unset_prefix(ifp
, ifc
);
2669 vty_out(vty
, "%% Can't unset interface IP address: %s.\n",
2670 safe_strerror(errno
));
2671 return CMD_WARNING_CONFIG_FAILED
;
2673 UNSET_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
);
2674 /* we will receive a kernel notification about this route being removed.
2675 * this will trigger its removal from the connected list. */
2681 "ip address A.B.C.D/M",
2682 "Interface Internet Protocol config commands\n"
2683 "Set the IP address of an interface\n"
2684 "IP address (e.g. 10.0.0.1/8)\n")
2686 int idx_ipv4_prefixlen
= 2;
2687 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2688 return ip_address_install(vty
, ifp
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
,
2692 DEFUN (no_ip_address
,
2694 "no ip address A.B.C.D/M",
2696 "Interface Internet Protocol config commands\n"
2697 "Set the IP address of an interface\n"
2698 "IP Address (e.g. 10.0.0.1/8)\n")
2700 int idx_ipv4_prefixlen
= 3;
2701 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2702 return ip_address_uninstall(vty
, ifp
, argv
[idx_ipv4_prefixlen
]->arg
,
2706 DEFUN(ip_address_peer
,
2707 ip_address_peer_cmd
,
2708 "ip address A.B.C.D peer A.B.C.D/M",
2709 "Interface Internet Protocol config commands\n"
2710 "Set the IP address of an interface\n"
2711 "Local IP (e.g. 10.0.0.1) for P-t-P address\n"
2712 "Specify P-t-P address\n"
2713 "Peer IP address (e.g. 10.0.0.1/8)\n")
2715 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2716 return ip_address_install(vty
, ifp
, argv
[2]->arg
, argv
[4]->arg
, NULL
);
2719 DEFUN(no_ip_address_peer
,
2720 no_ip_address_peer_cmd
,
2721 "no ip address A.B.C.D peer A.B.C.D/M",
2723 "Interface Internet Protocol config commands\n"
2724 "Set the IP address of an interface\n"
2725 "Local IP (e.g. 10.0.0.1) for P-t-P address\n"
2726 "Specify P-t-P address\n"
2727 "Peer IP address (e.g. 10.0.0.1/8)\n")
2729 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2730 return ip_address_uninstall(vty
, ifp
, argv
[3]->arg
, argv
[5]->arg
, NULL
);
2734 DEFUN (ip_address_label
,
2735 ip_address_label_cmd
,
2736 "ip address A.B.C.D/M label LINE",
2737 "Interface Internet Protocol config commands\n"
2738 "Set the IP address of an interface\n"
2739 "IP address (e.g. 10.0.0.1/8)\n"
2740 "Label of this address\n"
2743 int idx_ipv4_prefixlen
= 2;
2745 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2746 return ip_address_install(vty
, ifp
, argv
[idx_ipv4_prefixlen
]->arg
, NULL
,
2747 argv
[idx_line
]->arg
);
2750 DEFUN (no_ip_address_label
,
2751 no_ip_address_label_cmd
,
2752 "no ip address A.B.C.D/M label LINE",
2754 "Interface Internet Protocol config commands\n"
2755 "Set the IP address of an interface\n"
2756 "IP address (e.g. 10.0.0.1/8)\n"
2757 "Label of this address\n"
2760 int idx_ipv4_prefixlen
= 3;
2762 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2763 return ip_address_uninstall(vty
, ifp
, argv
[idx_ipv4_prefixlen
]->arg
,
2764 NULL
, argv
[idx_line
]->arg
);
2766 #endif /* HAVE_NETLINK */
2768 static int ipv6_address_install(struct vty
*vty
, struct interface
*ifp
,
2769 const char *addr_str
, const char *peer_str
,
2770 const char *label
, int secondary
)
2772 struct zebra_if
*if_data
;
2773 struct prefix_ipv6 cp
;
2774 struct connected
*ifc
;
2775 struct prefix_ipv6
*p
;
2778 if_data
= ifp
->info
;
2780 ret
= str2prefix_ipv6(addr_str
, &cp
);
2782 vty_out(vty
, "%% Malformed address \n");
2783 return CMD_WARNING_CONFIG_FAILED
;
2786 if (ipv6_martian(&cp
.prefix
)) {
2787 vty_out(vty
, "%% Invalid address\n");
2788 return CMD_WARNING_CONFIG_FAILED
;
2791 ifc
= connected_check(ifp
, (struct prefix
*)&cp
);
2793 ifc
= connected_new();
2797 p
= prefix_ipv6_new();
2799 ifc
->address
= (struct prefix
*)p
;
2803 SET_FLAG(ifc
->flags
, ZEBRA_IFA_SECONDARY
);
2807 ifc
->label
= XSTRDUP(MTYPE_CONNECTED_LABEL
, label
);
2809 /* Add to linked list. */
2810 listnode_add(ifp
->connected
, ifc
);
2813 /* This address is configured from zebra. */
2814 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
2815 SET_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
2817 /* In case of this route need to install kernel. */
2818 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)
2819 && CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)
2820 && !(if_data
&& if_data
->shutdown
== IF_ZEBRA_SHUTDOWN_ON
)) {
2821 /* Some system need to up the interface to set IP address. */
2822 if (!if_is_up(ifp
)) {
2823 if_set_flags(ifp
, IFF_UP
| IFF_RUNNING
);
2827 ret
= if_prefix_add_ipv6(ifp
, ifc
);
2830 vty_out(vty
, "%% Can't set interface IP address: %s.\n",
2831 safe_strerror(errno
));
2832 return CMD_WARNING_CONFIG_FAILED
;
2835 SET_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
);
2836 /* The address will be advertised to zebra clients when the
2838 * from the kernel has been received. */
2844 /* Return true if an ipv6 address is configured on ifp */
2845 int ipv6_address_configured(struct interface
*ifp
)
2847 struct connected
*connected
;
2848 struct listnode
*node
;
2850 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, node
, connected
))
2851 if (CHECK_FLAG(connected
->conf
, ZEBRA_IFC_REAL
)
2852 && (connected
->address
->family
== AF_INET6
))
2858 static int ipv6_address_uninstall(struct vty
*vty
, struct interface
*ifp
,
2859 const char *addr_str
, const char *peer_str
,
2860 const char *label
, int secondry
)
2862 struct prefix_ipv6 cp
;
2863 struct connected
*ifc
;
2866 /* Convert to prefix structure. */
2867 ret
= str2prefix_ipv6(addr_str
, &cp
);
2869 vty_out(vty
, "%% Malformed address \n");
2870 return CMD_WARNING_CONFIG_FAILED
;
2873 /* Check current interface address. */
2874 ifc
= connected_check(ifp
, (struct prefix
*)&cp
);
2876 vty_out(vty
, "%% Can't find address\n");
2877 return CMD_WARNING_CONFIG_FAILED
;
2880 /* This is not configured address. */
2881 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
2882 return CMD_WARNING_CONFIG_FAILED
;
2884 UNSET_FLAG(ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
2886 /* This is not real address or interface is not active. */
2887 if (!CHECK_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
)
2888 || !CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_ACTIVE
)) {
2889 listnode_delete(ifp
->connected
, ifc
);
2890 connected_free(ifc
);
2891 return CMD_WARNING_CONFIG_FAILED
;
2894 /* This is real route. */
2895 ret
= if_prefix_delete_ipv6(ifp
, ifc
);
2897 vty_out(vty
, "%% Can't unset interface IP address: %s.\n",
2898 safe_strerror(errno
));
2899 return CMD_WARNING_CONFIG_FAILED
;
2902 UNSET_FLAG(ifc
->conf
, ZEBRA_IFC_QUEUED
);
2903 /* This information will be propagated to the zclients when the
2904 * kernel notification is received. */
2908 DEFUN (ipv6_address
,
2910 "ipv6 address X:X::X:X/M",
2911 "Interface IPv6 config commands\n"
2912 "Set the IP address of an interface\n"
2913 "IPv6 address (e.g. 3ffe:506::1/48)\n")
2915 int idx_ipv6_prefixlen
= 2;
2916 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2917 return ipv6_address_install(vty
, ifp
, argv
[idx_ipv6_prefixlen
]->arg
,
2921 DEFUN (no_ipv6_address
,
2922 no_ipv6_address_cmd
,
2923 "no ipv6 address X:X::X:X/M",
2925 "Interface IPv6 config commands\n"
2926 "Set the IP address of an interface\n"
2927 "IPv6 address (e.g. 3ffe:506::1/48)\n")
2929 int idx_ipv6_prefixlen
= 3;
2930 VTY_DECLVAR_CONTEXT(interface
, ifp
);
2931 return ipv6_address_uninstall(vty
, ifp
, argv
[idx_ipv6_prefixlen
]->arg
,
2935 static int link_params_config_write(struct vty
*vty
, struct interface
*ifp
)
2939 if ((ifp
== NULL
) || !HAS_LINK_PARAMS(ifp
))
2942 struct if_link_params
*iflp
= ifp
->link_params
;
2944 vty_out(vty
, " link-params\n");
2945 vty_out(vty
, " enable\n");
2946 if (IS_PARAM_SET(iflp
, LP_TE_METRIC
) && iflp
->te_metric
!= ifp
->metric
)
2947 vty_out(vty
, " metric %u\n", iflp
->te_metric
);
2948 if (IS_PARAM_SET(iflp
, LP_MAX_BW
) && iflp
->max_bw
!= iflp
->default_bw
)
2949 vty_out(vty
, " max-bw %g\n", iflp
->max_bw
);
2950 if (IS_PARAM_SET(iflp
, LP_MAX_RSV_BW
)
2951 && iflp
->max_rsv_bw
!= iflp
->default_bw
)
2952 vty_out(vty
, " max-rsv-bw %g\n", iflp
->max_rsv_bw
);
2953 if (IS_PARAM_SET(iflp
, LP_UNRSV_BW
)) {
2954 for (i
= 0; i
< 8; i
++)
2955 if (iflp
->unrsv_bw
[i
] != iflp
->default_bw
)
2956 vty_out(vty
, " unrsv-bw %d %g\n", i
,
2959 if (IS_PARAM_SET(iflp
, LP_ADM_GRP
))
2960 vty_out(vty
, " admin-grp 0x%x\n", iflp
->admin_grp
);
2961 if (IS_PARAM_SET(iflp
, LP_DELAY
)) {
2962 vty_out(vty
, " delay %u", iflp
->av_delay
);
2963 if (IS_PARAM_SET(iflp
, LP_MM_DELAY
)) {
2964 vty_out(vty
, " min %u", iflp
->min_delay
);
2965 vty_out(vty
, " max %u", iflp
->max_delay
);
2969 if (IS_PARAM_SET(iflp
, LP_DELAY_VAR
))
2970 vty_out(vty
, " delay-variation %u\n", iflp
->delay_var
);
2971 if (IS_PARAM_SET(iflp
, LP_PKT_LOSS
))
2972 vty_out(vty
, " packet-loss %g\n", iflp
->pkt_loss
);
2973 if (IS_PARAM_SET(iflp
, LP_AVA_BW
))
2974 vty_out(vty
, " ava-bw %g\n", iflp
->ava_bw
);
2975 if (IS_PARAM_SET(iflp
, LP_RES_BW
))
2976 vty_out(vty
, " res-bw %g\n", iflp
->res_bw
);
2977 if (IS_PARAM_SET(iflp
, LP_USE_BW
))
2978 vty_out(vty
, " use-bw %g\n", iflp
->use_bw
);
2979 if (IS_PARAM_SET(iflp
, LP_RMT_AS
))
2980 vty_out(vty
, " neighbor %s as %u\n", inet_ntoa(iflp
->rmt_ip
),
2982 vty_out(vty
, " exit-link-params\n");
2986 static int if_config_write(struct vty
*vty
)
2989 struct interface
*ifp
;
2991 zebra_ptm_write(vty
);
2993 RB_FOREACH (vrf0
, vrf_name_head
, &vrfs_by_name
)
2994 FOR_ALL_INTERFACES (vrf0
, ifp
) {
2995 struct zebra_if
*if_data
;
2996 struct listnode
*addrnode
;
2997 struct connected
*ifc
;
3001 if_data
= ifp
->info
;
3002 vrf
= vrf_lookup_by_id(ifp
->vrf_id
);
3004 if (ifp
->vrf_id
== VRF_DEFAULT
)
3005 vty_frame(vty
, "interface %s\n", ifp
->name
);
3007 vty_frame(vty
, "interface %s vrf %s\n",
3008 ifp
->name
, vrf
->name
);
3011 if (if_data
->shutdown
== IF_ZEBRA_SHUTDOWN_ON
)
3012 vty_out(vty
, " shutdown\n");
3014 zebra_ptm_if_write(vty
, if_data
);
3018 vty_out(vty
, " description %s\n", ifp
->desc
);
3020 /* Assign bandwidth here to avoid unnecessary interface
3022 while processing config script */
3023 if (ifp
->bandwidth
!= 0)
3024 vty_out(vty
, " bandwidth %u\n", ifp
->bandwidth
);
3026 if (!CHECK_FLAG(ifp
->status
,
3027 ZEBRA_INTERFACE_LINKDETECTION
))
3028 vty_out(vty
, " no link-detect\n");
3030 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, addrnode
,
3032 if (CHECK_FLAG(ifc
->conf
,
3033 ZEBRA_IFC_CONFIGURED
)) {
3034 char buf
[INET6_ADDRSTRLEN
];
3036 vty_out(vty
, " ip%s address %s",
3037 p
->family
== AF_INET
? ""
3039 inet_ntop(p
->family
,
3042 if (CONNECTED_PEER(ifc
)) {
3043 p
= ifc
->destination
;
3044 vty_out(vty
, " peer %s",
3045 inet_ntop(p
->family
,
3050 vty_out(vty
, "/%d", p
->prefixlen
);
3053 vty_out(vty
, " label %s",
3061 if (if_data
->multicast
3062 != IF_ZEBRA_MULTICAST_UNSPEC
)
3063 vty_out(vty
, " %smulticast\n",
3065 == IF_ZEBRA_MULTICAST_ON
3070 hook_call(zebra_if_config_wr
, vty
, ifp
);
3072 link_params_config_write(vty
, ifp
);
3074 vty_endframe(vty
, "!\n");
3079 /* Allocate and initialize interface vector. */
3080 void zebra_if_init(void)
3082 /* Initialize interface and new hook. */
3083 hook_register_prio(if_add
, 0, if_zebra_new_hook
);
3084 hook_register_prio(if_del
, 0, if_zebra_delete_hook
);
3086 /* Install configuration write function. */
3087 install_node(&interface_node
, if_config_write
);
3088 install_node(&link_params_node
, NULL
);
3091 install_element(VIEW_NODE
, &show_interface_cmd
);
3092 install_element(VIEW_NODE
, &show_interface_vrf_all_cmd
);
3093 install_element(VIEW_NODE
, &show_interface_name_vrf_cmd
);
3094 install_element(VIEW_NODE
, &show_interface_name_vrf_all_cmd
);
3096 install_element(ENABLE_NODE
, &show_interface_desc_cmd
);
3097 install_element(ENABLE_NODE
, &show_interface_desc_vrf_all_cmd
);
3098 install_element(INTERFACE_NODE
, &multicast_cmd
);
3099 install_element(INTERFACE_NODE
, &no_multicast_cmd
);
3100 install_element(INTERFACE_NODE
, &linkdetect_cmd
);
3101 install_element(INTERFACE_NODE
, &no_linkdetect_cmd
);
3102 install_element(INTERFACE_NODE
, &shutdown_if_cmd
);
3103 install_element(INTERFACE_NODE
, &no_shutdown_if_cmd
);
3104 install_element(INTERFACE_NODE
, &bandwidth_if_cmd
);
3105 install_element(INTERFACE_NODE
, &no_bandwidth_if_cmd
);
3106 install_element(INTERFACE_NODE
, &ip_address_cmd
);
3107 install_element(INTERFACE_NODE
, &no_ip_address_cmd
);
3108 install_element(INTERFACE_NODE
, &ip_address_peer_cmd
);
3109 install_element(INTERFACE_NODE
, &no_ip_address_peer_cmd
);
3110 install_element(INTERFACE_NODE
, &ipv6_address_cmd
);
3111 install_element(INTERFACE_NODE
, &no_ipv6_address_cmd
);
3113 install_element(INTERFACE_NODE
, &ip_address_label_cmd
);
3114 install_element(INTERFACE_NODE
, &no_ip_address_label_cmd
);
3115 #endif /* HAVE_NETLINK */
3116 install_element(INTERFACE_NODE
, &link_params_cmd
);
3117 install_default(LINK_PARAMS_NODE
);
3118 install_element(LINK_PARAMS_NODE
, &link_params_enable_cmd
);
3119 install_element(LINK_PARAMS_NODE
, &no_link_params_enable_cmd
);
3120 install_element(LINK_PARAMS_NODE
, &link_params_metric_cmd
);
3121 install_element(LINK_PARAMS_NODE
, &no_link_params_metric_cmd
);
3122 install_element(LINK_PARAMS_NODE
, &link_params_maxbw_cmd
);
3123 install_element(LINK_PARAMS_NODE
, &link_params_max_rsv_bw_cmd
);
3124 install_element(LINK_PARAMS_NODE
, &link_params_unrsv_bw_cmd
);
3125 install_element(LINK_PARAMS_NODE
, &link_params_admin_grp_cmd
);
3126 install_element(LINK_PARAMS_NODE
, &no_link_params_admin_grp_cmd
);
3127 install_element(LINK_PARAMS_NODE
, &link_params_inter_as_cmd
);
3128 install_element(LINK_PARAMS_NODE
, &no_link_params_inter_as_cmd
);
3129 install_element(LINK_PARAMS_NODE
, &link_params_delay_cmd
);
3130 install_element(LINK_PARAMS_NODE
, &no_link_params_delay_cmd
);
3131 install_element(LINK_PARAMS_NODE
, &link_params_delay_var_cmd
);
3132 install_element(LINK_PARAMS_NODE
, &no_link_params_delay_var_cmd
);
3133 install_element(LINK_PARAMS_NODE
, &link_params_pkt_loss_cmd
);
3134 install_element(LINK_PARAMS_NODE
, &no_link_params_pkt_loss_cmd
);
3135 install_element(LINK_PARAMS_NODE
, &link_params_ava_bw_cmd
);
3136 install_element(LINK_PARAMS_NODE
, &no_link_params_ava_bw_cmd
);
3137 install_element(LINK_PARAMS_NODE
, &link_params_res_bw_cmd
);
3138 install_element(LINK_PARAMS_NODE
, &no_link_params_res_bw_cmd
);
3139 install_element(LINK_PARAMS_NODE
, &link_params_use_bw_cmd
);
3140 install_element(LINK_PARAMS_NODE
, &no_link_params_use_bw_cmd
);
3141 install_element(LINK_PARAMS_NODE
, &exit_link_params_cmd
);