3 * Copyright (C) 1997, 1999 Kunihiro Ishiguro
5 * This file is part of GNU Zebra.
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27 #include "sockunion.h"
32 #include "connected.h"
36 #include "zebra/interface.h"
37 #include "zebra/rtadv.h"
38 #include "zebra/rib.h"
39 #include "zebra/zserv.h"
40 #include "zebra/redistribute.h"
41 #include "zebra/debug.h"
42 #include "zebra/irdp.h"
45 /* Called when new interface is added. */
47 if_zebra_new_hook (struct interface
*ifp
)
49 struct zebra_if
*zebra_if
;
51 zebra_if
= XMALLOC (MTYPE_TMP
, sizeof (struct zebra_if
));
52 memset (zebra_if
, 0, sizeof (struct zebra_if
));
54 zebra_if
->multicast
= IF_ZEBRA_MULTICAST_UNSPEC
;
55 zebra_if
->shutdown
= IF_ZEBRA_SHUTDOWN_UNSPEC
;
59 /* Set default router advertise values. */
60 struct rtadvconf
*rtadv
;
62 rtadv
= &zebra_if
->rtadv
;
64 rtadv
->AdvSendAdvertisements
= 0;
65 rtadv
->MaxRtrAdvInterval
= RTADV_MAX_RTR_ADV_INTERVAL
;
66 rtadv
->MinRtrAdvInterval
= RTADV_MIN_RTR_ADV_INTERVAL
;
67 rtadv
->AdvIntervalTimer
= 0;
68 rtadv
->AdvManagedFlag
= 0;
69 rtadv
->AdvOtherConfigFlag
= 0;
70 rtadv
->AdvHomeAgentFlag
= 0;
71 rtadv
->AdvLinkMTU
= 0;
72 rtadv
->AdvReachableTime
= 0;
73 rtadv
->AdvRetransTimer
= 0;
74 rtadv
->AdvCurHopLimit
= 0;
75 rtadv
->AdvDefaultLifetime
= RTADV_ADV_DEFAULT_LIFETIME
;
76 rtadv
->HomeAgentPreference
= 0;
77 rtadv
->HomeAgentLifetime
= RTADV_ADV_DEFAULT_LIFETIME
;
78 rtadv
->AdvIntervalOption
= 0;
80 rtadv
->AdvPrefixList
= list_new ();
84 /* Initialize installed address chains tree. */
85 zebra_if
->ipv4_subnets
= route_table_init ();
91 /* Called when interface is deleted. */
93 if_zebra_delete_hook (struct interface
*ifp
)
95 struct zebra_if
*zebra_if
;
101 /* Free installed address chains tree. */
102 if (zebra_if
->ipv4_subnets
)
103 route_table_finish (zebra_if
->ipv4_subnets
);
105 XFREE (MTYPE_TMP
, zebra_if
);
111 /* Tie an interface address to its derived subnet list of addresses. */
113 if_subnet_add (struct interface
*ifp
, struct connected
*ifc
)
115 struct route_node
*rn
;
116 struct zebra_if
*zebra_if
;
118 struct list
*addr_list
;
120 assert (ifp
&& ifp
->info
&& ifc
);
121 zebra_if
= ifp
->info
;
123 /* Get address derived subnet node and associated address list, while marking
124 address secondary attribute appropriately. */
127 rn
= route_node_get (zebra_if
->ipv4_subnets
, &cp
);
129 if ((addr_list
= rn
->info
))
130 SET_FLAG (ifc
->flags
, ZEBRA_IFA_SECONDARY
);
133 UNSET_FLAG (ifc
->flags
, ZEBRA_IFA_SECONDARY
);
134 rn
->info
= addr_list
= list_new ();
135 route_lock_node (rn
);
138 /* Tie address at the tail of address list. */
139 listnode_add (addr_list
, ifc
);
141 /* Return list element count. */
142 return (addr_list
->count
);
145 /* Untie an interface address from its derived subnet list of addresses. */
147 if_subnet_delete (struct interface
*ifp
, struct connected
*ifc
)
149 struct route_node
*rn
;
150 struct zebra_if
*zebra_if
;
151 struct list
*addr_list
;
153 assert (ifp
&& ifp
->info
&& ifc
);
154 zebra_if
= ifp
->info
;
156 /* Get address derived subnet node. */
157 rn
= route_node_lookup (zebra_if
->ipv4_subnets
, ifc
->address
);
158 if (! (rn
&& rn
->info
))
160 route_unlock_node (rn
);
162 /* Untie address from subnet's address list. */
163 addr_list
= rn
->info
;
164 listnode_delete (addr_list
, ifc
);
165 route_unlock_node (rn
);
167 /* Return list element count, if not empty. */
168 if (addr_list
->count
)
170 /* If deleted address is primary, mark subsequent one as such and distribute. */
171 if (! CHECK_FLAG (ifc
->flags
, ZEBRA_IFA_SECONDARY
))
173 ifc
= listgetdata (listhead (addr_list
));
174 zebra_interface_address_delete_update (ifp
, ifc
);
175 UNSET_FLAG (ifc
->flags
, ZEBRA_IFA_SECONDARY
);
176 zebra_interface_address_add_update (ifp
, ifc
);
179 return addr_list
->count
;
182 /* Otherwise, free list and route node. */
183 list_free (addr_list
);
185 route_unlock_node (rn
);
190 /* if_flags_mangle: A place for hacks that require mangling
191 * or tweaking the interface flags.
193 * ******************** Solaris flags hacks **************************
195 * Solaris IFF_UP flag reflects only the primary interface as the
196 * routing socket only sends IFINFO for the primary interface. Hence
197 * ~IFF_UP does not per se imply all the logical interfaces are also
198 * down - which we only know of as addresses. Instead we must determine
199 * whether the interface really is up or not according to how many
200 * addresses are still attached. (Solaris always sends RTM_DELADDR if
201 * an interface, logical or not, goes ~IFF_UP).
203 * Ie, we mangle IFF_UP to *additionally* reflect whether or not there
204 * are addresses left in struct connected, not just the actual underlying
207 * We must hence remember the real state of IFF_UP, which we do in
208 * struct zebra_if.primary_state.
210 * Setting IFF_UP within zebra to administratively shutdown the
211 * interface will affect only the primary interface/address on Solaris.
212 ************************End Solaris flags hacks ***********************
215 if_flags_mangle (struct interface
*ifp
, uint64_t *newflags
)
218 struct zebra_if
*zif
= ifp
->info
;
220 zif
->primary_state
= *newflags
& (IFF_UP
& 0xff);
222 if (CHECK_FLAG (zif
->primary_state
, IFF_UP
)
223 || listcount(ifp
->connected
) > 0)
224 SET_FLAG (*newflags
, IFF_UP
);
226 UNSET_FLAG (*newflags
, IFF_UP
);
230 /* Update the flags field of the ifp with the new flag set provided.
231 * Take whatever actions are required for any changes in flags we care
234 * newflags should be the raw value, as obtained from the OS.
237 if_flags_update (struct interface
*ifp
, uint64_t newflags
)
239 if_flags_mangle (ifp
, &newflags
);
241 if (if_is_operative (ifp
))
243 /* operative -> inoperative? */
244 ifp
->flags
= newflags
;
245 if (!if_is_operative (ifp
))
250 /* inoperative -> operative? */
251 ifp
->flags
= newflags
;
252 if (if_is_operative (ifp
))
257 /* Wake up configured address if it is not in current kernel
260 if_addr_wakeup (struct interface
*ifp
)
262 struct listnode
*node
, *nnode
;
263 struct connected
*ifc
;
267 for (ALL_LIST_ELEMENTS (ifp
->connected
, node
, nnode
, ifc
))
271 if (CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
)
272 && ! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
))
275 if (p
->family
== AF_INET
)
277 if (! if_is_up (ifp
))
279 /* XXX: WTF is it trying to set flags here?
280 * caller has just gotten a new interface, has been
281 * handed the flags already. This code has no business
282 * trying to override administrative status of the interface.
283 * The only call path to here which doesn't originate from
284 * kernel event is irdp - what on earth is it trying to do?
286 * further RUNNING is not a settable flag on any system
287 * I (paulj) am aware of.
289 if_set_flags (ifp
, IFF_UP
| IFF_RUNNING
);
293 ret
= if_set_prefix (ifp
, ifc
);
296 zlog_warn ("Can't set interface's address: %s",
297 safe_strerror(errno
));
301 /* Add to subnet chain list. */
302 if_subnet_add (ifp
, ifc
);
304 SET_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
);
306 zebra_interface_address_add_update (ifp
, ifc
);
308 if (if_is_operative(ifp
))
309 connected_up_ipv4 (ifp
, ifc
);
312 if (p
->family
== AF_INET6
)
314 if (! if_is_up (ifp
))
316 /* XXX: See long comment above */
317 if_set_flags (ifp
, IFF_UP
| IFF_RUNNING
);
321 ret
= if_prefix_add_ipv6 (ifp
, ifc
);
324 zlog_warn ("Can't set interface's address: %s",
325 safe_strerror(errno
));
328 SET_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
);
330 zebra_interface_address_add_update (ifp
, ifc
);
332 if (if_is_operative(ifp
))
333 connected_up_ipv6 (ifp
, ifc
);
335 #endif /* HAVE_IPV6 */
340 /* Handle interface addition */
342 if_add_update (struct interface
*ifp
)
344 struct zebra_if
*if_data
;
347 if (if_data
->multicast
== IF_ZEBRA_MULTICAST_ON
)
348 if_set_flags (ifp
, IFF_MULTICAST
);
349 else if (if_data
->multicast
== IF_ZEBRA_MULTICAST_OFF
)
350 if_unset_flags (ifp
, IFF_MULTICAST
);
352 zebra_interface_add_update (ifp
);
354 if (! CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
356 SET_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
);
358 if_addr_wakeup (ifp
);
360 if (IS_ZEBRA_DEBUG_KERNEL
)
361 zlog_debug ("interface %s index %d becomes active.",
362 ifp
->name
, ifp
->ifindex
);
366 if (IS_ZEBRA_DEBUG_KERNEL
)
367 zlog_debug ("interface %s index %d is added.", ifp
->name
, ifp
->ifindex
);
371 /* Handle an interface delete event */
373 if_delete_update (struct interface
*ifp
)
375 struct connected
*ifc
;
377 struct route_node
*rn
;
378 struct zebra_if
*zebra_if
;
380 zebra_if
= ifp
->info
;
384 zlog_err ("interface %s index %d is still up while being deleted.",
385 ifp
->name
, ifp
->ifindex
);
389 /* Mark interface as inactive */
390 UNSET_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
);
392 if (IS_ZEBRA_DEBUG_KERNEL
)
393 zlog_debug ("interface %s index %d is now inactive.",
394 ifp
->name
, ifp
->ifindex
);
396 /* Delete connected routes from the kernel. */
399 struct listnode
*node
;
400 struct listnode
*last
= NULL
;
402 while ((node
= (last
? last
->next
: listhead (ifp
->connected
))))
404 ifc
= listgetdata (node
);
407 if (p
->family
== AF_INET
408 && (rn
= route_node_lookup (zebra_if
->ipv4_subnets
, p
)))
410 struct listnode
*anode
;
411 struct listnode
*next
;
412 struct listnode
*first
;
413 struct list
*addr_list
;
415 route_unlock_node (rn
);
416 addr_list
= (struct list
*) rn
->info
;
418 /* Remove addresses, secondaries first. */
419 first
= listhead (addr_list
);
420 for (anode
= first
->next
; anode
|| first
; anode
= next
)
429 ifc
= listgetdata (anode
);
432 connected_down_ipv4 (ifp
, ifc
);
434 zebra_interface_address_delete_update (ifp
, ifc
);
436 UNSET_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
);
438 /* Remove from subnet chain. */
439 list_delete_node (addr_list
, anode
);
440 route_unlock_node (rn
);
442 /* Remove from interface address list (unconditionally). */
443 if (!CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
445 listnode_delete (ifp
->connected
, ifc
);
446 connected_free (ifc
);
452 /* Free chain list and respective route node. */
453 list_delete (addr_list
);
455 route_unlock_node (rn
);
458 else if (p
->family
== AF_INET6
)
460 connected_down_ipv6 (ifp
, ifc
);
462 zebra_interface_address_delete_update (ifp
, ifc
);
464 UNSET_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
);
466 if (CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
470 listnode_delete (ifp
->connected
, ifc
);
471 connected_free (ifc
);
474 #endif /* HAVE_IPV6 */
477 zebra_interface_delete_update (ifp
);
479 /* Update ifindex after distributing the delete message. This is in
480 case any client needs to have the old value of ifindex available
481 while processing the deletion. Each client daemon is responsible
482 for setting ifindex to IFINDEX_INTERNAL after processing the
483 interface deletion message. */
484 ifp
->ifindex
= IFINDEX_INTERNAL
;
487 /* Interface is up. */
489 if_up (struct interface
*ifp
)
491 struct listnode
*node
;
492 struct listnode
*next
;
493 struct connected
*ifc
;
496 /* Notify the protocol daemons. */
497 zebra_interface_up_update (ifp
);
499 /* Install connected routes to the kernel. */
502 for (ALL_LIST_ELEMENTS (ifp
->connected
, node
, next
, ifc
))
506 if (p
->family
== AF_INET
)
507 connected_up_ipv4 (ifp
, ifc
);
509 else if (p
->family
== AF_INET6
)
510 connected_up_ipv6 (ifp
, ifc
);
511 #endif /* HAVE_IPV6 */
515 /* Examine all static routes. */
519 /* Interface goes down. We have to manage different behavior of based
522 if_down (struct interface
*ifp
)
524 struct listnode
*node
;
525 struct listnode
*next
;
526 struct connected
*ifc
;
529 /* Notify to the protocol daemons. */
530 zebra_interface_down_update (ifp
);
532 /* Delete connected routes from the kernel. */
535 for (ALL_LIST_ELEMENTS (ifp
->connected
, node
, next
, ifc
))
539 if (p
->family
== AF_INET
)
540 connected_down_ipv4 (ifp
, ifc
);
542 else if (p
->family
== AF_INET6
)
543 connected_down_ipv6 (ifp
, ifc
);
544 #endif /* HAVE_IPV6 */
548 /* Examine all static routes which direct to the interface. */
553 if_refresh (struct interface
*ifp
)
558 /* Output prefix string to vty. */
560 prefix_vty_out (struct vty
*vty
, struct prefix
*p
)
562 char str
[INET6_ADDRSTRLEN
];
564 inet_ntop (p
->family
, &p
->u
.prefix
, str
, sizeof (str
));
565 vty_out (vty
, "%s", str
);
569 /* Dump if address information to vty. */
571 connected_dump_vty (struct vty
*vty
, struct connected
*connected
)
575 /* Print interface address. */
576 p
= connected
->address
;
577 vty_out (vty
, " %s ", prefix_family_str (p
));
578 prefix_vty_out (vty
, p
);
579 vty_out (vty
, "/%d", p
->prefixlen
);
581 /* If there is destination address, print it. */
582 if (connected
->destination
)
584 vty_out (vty
, (CONNECTED_PEER(connected
) ? " peer " : " broadcast "));
585 prefix_vty_out (vty
, connected
->destination
);
588 if (CHECK_FLAG (connected
->flags
, ZEBRA_IFA_SECONDARY
))
589 vty_out (vty
, " secondary");
591 if (connected
->label
)
592 vty_out (vty
, " %s", connected
->label
);
594 vty_out (vty
, "%s", VTY_NEWLINE
);
598 /* Dump interface ND information to vty. */
600 nd_dump_vty (struct vty
*vty
, struct interface
*ifp
)
602 struct zebra_if
*zif
;
603 struct rtadvconf
*rtadv
;
606 zif
= (struct zebra_if
*) ifp
->info
;
609 if (rtadv
->AdvSendAdvertisements
)
611 vty_out (vty
, " ND advertised reachable time is %d milliseconds%s",
612 rtadv
->AdvReachableTime
, VTY_NEWLINE
);
613 vty_out (vty
, " ND advertised retransmit interval is %d milliseconds%s",
614 rtadv
->AdvRetransTimer
, VTY_NEWLINE
);
615 interval
= rtadv
->MaxRtrAdvInterval
;
617 vty_out (vty
, " ND router advertisements are sent every "
618 "%d milliseconds%s", interval
,
621 vty_out (vty
, " ND router advertisements are sent every "
622 "%d seconds%s", interval
/ 1000,
624 vty_out (vty
, " ND router advertisements live for %d seconds%s",
625 rtadv
->AdvDefaultLifetime
, VTY_NEWLINE
);
626 if (rtadv
->AdvManagedFlag
)
627 vty_out (vty
, " Hosts use DHCP to obtain routable addresses.%s",
630 vty_out (vty
, " Hosts use stateless autoconfig for addresses.%s",
632 if (rtadv
->AdvHomeAgentFlag
)
633 vty_out (vty
, " ND router advertisements with "
634 "Home Agent flag bit set.%s",
636 if (rtadv
->AdvIntervalOption
)
637 vty_out (vty
, " ND router advertisements with Adv. Interval option.%s",
643 /* Interface's information print out to vty interface. */
645 if_dump_vty (struct vty
*vty
, struct interface
*ifp
)
647 #ifdef HAVE_STRUCT_SOCKADDR_DL
648 struct sockaddr_dl
*sdl
;
649 #endif /* HAVE_STRUCT_SOCKADDR_DL */
650 struct connected
*connected
;
651 struct listnode
*node
;
652 struct route_node
*rn
;
653 struct zebra_if
*zebra_if
;
655 zebra_if
= ifp
->info
;
657 vty_out (vty
, "Interface %s is ", ifp
->name
);
659 vty_out (vty
, "up, line protocol ");
661 if (CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
)) {
662 if (if_is_running(ifp
))
663 vty_out (vty
, "is up%s", VTY_NEWLINE
);
665 vty_out (vty
, "is down%s", VTY_NEWLINE
);
667 vty_out (vty
, "detection is disabled%s", VTY_NEWLINE
);
670 vty_out (vty
, "down%s", VTY_NEWLINE
);
674 vty_out (vty
, " Description: %s%s", ifp
->desc
,
676 if (ifp
->ifindex
== IFINDEX_INTERNAL
)
678 vty_out(vty
, " pseudo interface%s", VTY_NEWLINE
);
681 else if (! CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
683 vty_out(vty
, " index %d inactive interface%s",
689 vty_out (vty
, " index %d metric %d mtu %d ",
690 ifp
->ifindex
, ifp
->metric
, ifp
->mtu
);
692 if (ifp
->mtu6
!= ifp
->mtu
)
693 vty_out (vty
, "mtu6 %d ", ifp
->mtu6
);
695 vty_out (vty
, "%s flags: %s%s", VTY_NEWLINE
,
696 if_flag_dump (ifp
->flags
), VTY_NEWLINE
);
698 /* Hardware address. */
699 #ifdef HAVE_STRUCT_SOCKADDR_DL
701 if (sdl
!= NULL
&& sdl
->sdl_alen
!= 0)
706 vty_out (vty
, " HWaddr: ");
707 for (i
= 0, ptr
= (u_char
*)LLADDR (sdl
); i
< sdl
->sdl_alen
; i
++, ptr
++)
708 vty_out (vty
, "%s%02x", i
== 0 ? "" : ":", *ptr
);
709 vty_out (vty
, "%s", VTY_NEWLINE
);
712 if (ifp
->hw_addr_len
!= 0)
716 vty_out (vty
, " HWaddr: ");
717 for (i
= 0; i
< ifp
->hw_addr_len
; i
++)
718 vty_out (vty
, "%s%02x", i
== 0 ? "" : ":", ifp
->hw_addr
[i
]);
719 vty_out (vty
, "%s", VTY_NEWLINE
);
721 #endif /* HAVE_STRUCT_SOCKADDR_DL */
723 /* Bandwidth in kbps */
724 if (ifp
->bandwidth
!= 0)
726 vty_out(vty
, " bandwidth %u kbps", ifp
->bandwidth
);
727 vty_out(vty
, "%s", VTY_NEWLINE
);
730 for (rn
= route_top (zebra_if
->ipv4_subnets
); rn
; rn
= route_next (rn
))
735 for (ALL_LIST_ELEMENTS_RO ((struct list
*)rn
->info
, node
, connected
))
736 connected_dump_vty (vty
, connected
);
739 for (ALL_LIST_ELEMENTS_RO (ifp
->connected
, node
, connected
))
741 if (CHECK_FLAG (connected
->conf
, ZEBRA_IFC_REAL
) &&
742 (connected
->address
->family
== AF_INET6
))
743 connected_dump_vty (vty
, connected
);
747 nd_dump_vty (vty
, ifp
);
750 #ifdef HAVE_PROC_NET_DEV
751 /* Statistics print out using proc file system. */
752 vty_out (vty
, " %lu input packets (%lu multicast), %lu bytes, "
754 ifp
->stats
.rx_packets
, ifp
->stats
.rx_multicast
,
755 ifp
->stats
.rx_bytes
, ifp
->stats
.rx_dropped
, VTY_NEWLINE
);
757 vty_out (vty
, " %lu input errors, %lu length, %lu overrun,"
758 " %lu CRC, %lu frame%s",
759 ifp
->stats
.rx_errors
, ifp
->stats
.rx_length_errors
,
760 ifp
->stats
.rx_over_errors
, ifp
->stats
.rx_crc_errors
,
761 ifp
->stats
.rx_frame_errors
, VTY_NEWLINE
);
763 vty_out (vty
, " %lu fifo, %lu missed%s", ifp
->stats
.rx_fifo_errors
,
764 ifp
->stats
.rx_missed_errors
, VTY_NEWLINE
);
766 vty_out (vty
, " %lu output packets, %lu bytes, %lu dropped%s",
767 ifp
->stats
.tx_packets
, ifp
->stats
.tx_bytes
,
768 ifp
->stats
.tx_dropped
, VTY_NEWLINE
);
770 vty_out (vty
, " %lu output errors, %lu aborted, %lu carrier,"
771 " %lu fifo, %lu heartbeat%s",
772 ifp
->stats
.tx_errors
, ifp
->stats
.tx_aborted_errors
,
773 ifp
->stats
.tx_carrier_errors
, ifp
->stats
.tx_fifo_errors
,
774 ifp
->stats
.tx_heartbeat_errors
, VTY_NEWLINE
);
776 vty_out (vty
, " %lu window, %lu collisions%s",
777 ifp
->stats
.tx_window_errors
, ifp
->stats
.collisions
, VTY_NEWLINE
);
778 #endif /* HAVE_PROC_NET_DEV */
780 #ifdef HAVE_NET_RT_IFLIST
781 #if defined (__bsdi__) || defined (__NetBSD__)
782 /* Statistics print out using sysctl (). */
783 vty_out (vty
, " input packets %qu, bytes %qu, dropped %qu,"
784 " multicast packets %qu%s",
785 ifp
->stats
.ifi_ipackets
, ifp
->stats
.ifi_ibytes
,
786 ifp
->stats
.ifi_iqdrops
, ifp
->stats
.ifi_imcasts
,
789 vty_out (vty
, " input errors %qu%s",
790 ifp
->stats
.ifi_ierrors
, VTY_NEWLINE
);
792 vty_out (vty
, " output packets %qu, bytes %qu, multicast packets %qu%s",
793 ifp
->stats
.ifi_opackets
, ifp
->stats
.ifi_obytes
,
794 ifp
->stats
.ifi_omcasts
, VTY_NEWLINE
);
796 vty_out (vty
, " output errors %qu%s",
797 ifp
->stats
.ifi_oerrors
, VTY_NEWLINE
);
799 vty_out (vty
, " collisions %qu%s",
800 ifp
->stats
.ifi_collisions
, VTY_NEWLINE
);
802 /* Statistics print out using sysctl (). */
803 vty_out (vty
, " input packets %lu, bytes %lu, dropped %lu,"
804 " multicast packets %lu%s",
805 ifp
->stats
.ifi_ipackets
, ifp
->stats
.ifi_ibytes
,
806 ifp
->stats
.ifi_iqdrops
, ifp
->stats
.ifi_imcasts
,
809 vty_out (vty
, " input errors %lu%s",
810 ifp
->stats
.ifi_ierrors
, VTY_NEWLINE
);
812 vty_out (vty
, " output packets %lu, bytes %lu, multicast packets %lu%s",
813 ifp
->stats
.ifi_opackets
, ifp
->stats
.ifi_obytes
,
814 ifp
->stats
.ifi_omcasts
, VTY_NEWLINE
);
816 vty_out (vty
, " output errors %lu%s",
817 ifp
->stats
.ifi_oerrors
, VTY_NEWLINE
);
819 vty_out (vty
, " collisions %lu%s",
820 ifp
->stats
.ifi_collisions
, VTY_NEWLINE
);
821 #endif /* __bsdi__ || __NetBSD__ */
822 #endif /* HAVE_NET_RT_IFLIST */
825 /* Check supported address family. */
827 if_supported_family (int family
)
829 if (family
== AF_INET
)
832 if (family
== AF_INET6
)
834 #endif /* HAVE_IPV6 */
838 /* Wrapper hook point for zebra daemon so that ifindex can be set
839 * DEFUN macro not used as extract.pl HAS to ignore this
840 * See also interface_cmd in lib/if.c
842 DEFUN_NOSH (zebra_interface
,
845 "Select an interface to configure\n"
846 "Interface's name\n")
849 struct interface
* ifp
;
851 /* Call lib interface() */
852 if ((ret
= interface_cmd
.func (self
, vty
, argc
, argv
)) != CMD_SUCCESS
)
857 if (ifp
->ifindex
== IFINDEX_INTERNAL
)
858 /* Is this really necessary? Shouldn't status be initialized to 0
860 UNSET_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
);
865 struct cmd_node interface_node
=
872 /* Show all or specified interface to vty. */
873 DEFUN (show_interface
, show_interface_cmd
,
874 "show interface [IFNAME]",
876 "Interface status and configuration\n"
879 struct listnode
*node
;
880 struct interface
*ifp
;
882 #ifdef HAVE_PROC_NET_DEV
883 /* If system has interface statistics via proc file system, update
885 ifstat_update_proc ();
886 #endif /* HAVE_PROC_NET_DEV */
887 #ifdef HAVE_NET_RT_IFLIST
888 ifstat_update_sysctl ();
889 #endif /* HAVE_NET_RT_IFLIST */
891 /* Specified interface print. */
894 ifp
= if_lookup_by_name (argv
[0]);
897 vty_out (vty
, "%% Can't find interface %s%s", argv
[0],
901 if_dump_vty (vty
, ifp
);
905 /* All interface print. */
906 for (ALL_LIST_ELEMENTS_RO (iflist
, node
, ifp
))
907 if_dump_vty (vty
, ifp
);
912 DEFUN (show_interface_desc
,
913 show_interface_desc_cmd
,
914 "show interface description",
916 "Interface status and configuration\n"
917 "Interface description\n")
919 struct listnode
*node
;
920 struct interface
*ifp
;
922 vty_out (vty
, "Interface Status Protocol Description%s", VTY_NEWLINE
);
923 for (ALL_LIST_ELEMENTS_RO (iflist
, node
, ifp
))
927 len
= vty_out (vty
, "%s", ifp
->name
);
928 vty_out (vty
, "%*s", (16 - len
), " ");
932 vty_out (vty
, "up ");
933 if (CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
))
935 if (if_is_running(ifp
))
936 vty_out (vty
, "up ");
938 vty_out (vty
, "down ");
942 vty_out (vty
, "unknown ");
947 vty_out (vty
, "down down ");
951 vty_out (vty
, "%s", ifp
->desc
);
952 vty_out (vty
, "%s", VTY_NEWLINE
);
960 "Set multicast flag to interface\n")
963 struct interface
*ifp
;
964 struct zebra_if
*if_data
;
966 ifp
= (struct interface
*) vty
->index
;
967 if (CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
969 ret
= if_set_flags (ifp
, IFF_MULTICAST
);
972 vty_out (vty
, "Can't set multicast flag%s", VTY_NEWLINE
);
978 if_data
->multicast
= IF_ZEBRA_MULTICAST_ON
;
987 "Unset multicast flag to interface\n")
990 struct interface
*ifp
;
991 struct zebra_if
*if_data
;
993 ifp
= (struct interface
*) vty
->index
;
994 if (CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
996 ret
= if_unset_flags (ifp
, IFF_MULTICAST
);
999 vty_out (vty
, "Can't unset multicast flag%s", VTY_NEWLINE
);
1004 if_data
= ifp
->info
;
1005 if_data
->multicast
= IF_ZEBRA_MULTICAST_OFF
;
1013 "Enable link detection on interface\n")
1015 struct interface
*ifp
;
1016 int if_was_operative
;
1018 ifp
= (struct interface
*) vty
->index
;
1019 if_was_operative
= if_is_operative(ifp
);
1020 SET_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
);
1022 /* When linkdetection is enabled, if might come down */
1023 if (!if_is_operative(ifp
) && if_was_operative
) if_down(ifp
);
1025 /* FIXME: Will defer status change forwarding if interface
1026 does not come down! */
1032 DEFUN (no_linkdetect
,
1036 "Disable link detection on interface\n")
1038 struct interface
*ifp
;
1039 int if_was_operative
;
1041 ifp
= (struct interface
*) vty
->index
;
1042 if_was_operative
= if_is_operative(ifp
);
1043 UNSET_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
);
1045 /* Interface may come up after disabling link detection */
1046 if (if_is_operative(ifp
) && !if_was_operative
) if_up(ifp
);
1048 /* FIXME: see linkdetect_cmd */
1056 "Shutdown the selected interface\n")
1059 struct interface
*ifp
;
1060 struct zebra_if
*if_data
;
1062 ifp
= (struct interface
*) vty
->index
;
1063 ret
= if_unset_flags (ifp
, IFF_UP
);
1066 vty_out (vty
, "Can't shutdown interface%s", VTY_NEWLINE
);
1070 if_data
= ifp
->info
;
1071 if_data
->shutdown
= IF_ZEBRA_SHUTDOWN_ON
;
1076 DEFUN (no_shutdown_if
,
1080 "Shutdown the selected interface\n")
1083 struct interface
*ifp
;
1084 struct zebra_if
*if_data
;
1086 ifp
= (struct interface
*) vty
->index
;
1087 ret
= if_set_flags (ifp
, IFF_UP
| IFF_RUNNING
);
1090 vty_out (vty
, "Can't up interface%s", VTY_NEWLINE
);
1094 if_data
= ifp
->info
;
1095 if_data
->shutdown
= IF_ZEBRA_SHUTDOWN_OFF
;
1100 DEFUN (bandwidth_if
,
1102 "bandwidth <1-10000000>",
1103 "Set bandwidth informational parameter\n"
1104 "Bandwidth in kilobits\n")
1106 struct interface
*ifp
;
1107 unsigned int bandwidth
;
1109 ifp
= (struct interface
*) vty
->index
;
1110 bandwidth
= strtol(argv
[0], NULL
, 10);
1112 /* bandwidth range is <1-10000000> */
1113 if (bandwidth
< 1 || bandwidth
> 10000000)
1115 vty_out (vty
, "Bandwidth is invalid%s", VTY_NEWLINE
);
1119 ifp
->bandwidth
= bandwidth
;
1121 /* force protocols to recalculate routes due to cost change */
1122 if (if_is_operative (ifp
))
1123 zebra_interface_up_update (ifp
);
1128 DEFUN (no_bandwidth_if
,
1129 no_bandwidth_if_cmd
,
1132 "Set bandwidth informational parameter\n")
1134 struct interface
*ifp
;
1136 ifp
= (struct interface
*) vty
->index
;
1140 /* force protocols to recalculate routes due to cost change */
1141 if (if_is_operative (ifp
))
1142 zebra_interface_up_update (ifp
);
1147 ALIAS (no_bandwidth_if
,
1148 no_bandwidth_if_val_cmd
,
1149 "no bandwidth <1-10000000>",
1151 "Set bandwidth informational parameter\n"
1152 "Bandwidth in kilobits\n")
1155 ip_address_install (struct vty
*vty
, struct interface
*ifp
,
1156 const char *addr_str
, const char *peer_str
,
1159 struct prefix_ipv4 cp
;
1160 struct connected
*ifc
;
1161 struct prefix_ipv4
*p
;
1164 ret
= str2prefix_ipv4 (addr_str
, &cp
);
1167 vty_out (vty
, "%% Malformed address %s", VTY_NEWLINE
);
1171 ifc
= connected_check (ifp
, (struct prefix
*) &cp
);
1174 ifc
= connected_new ();
1178 p
= prefix_ipv4_new ();
1180 ifc
->address
= (struct prefix
*) p
;
1183 if (p
->prefixlen
<= IPV4_MAX_PREFIXLEN
-2)
1185 p
= prefix_ipv4_new ();
1187 p
->prefix
.s_addr
= ipv4_broadcast_addr(p
->prefix
.s_addr
,p
->prefixlen
);
1188 ifc
->destination
= (struct prefix
*) p
;
1193 ifc
->label
= XSTRDUP (MTYPE_CONNECTED_LABEL
, label
);
1195 /* Add to linked list. */
1196 listnode_add (ifp
->connected
, ifc
);
1199 /* This address is configured from zebra. */
1200 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
1201 SET_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
1203 /* In case of this route need to install kernel. */
1204 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
)
1205 && CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
1207 /* Some system need to up the interface to set IP address. */
1208 if (! if_is_up (ifp
))
1210 if_set_flags (ifp
, IFF_UP
| IFF_RUNNING
);
1214 ret
= if_set_prefix (ifp
, ifc
);
1217 vty_out (vty
, "%% Can't set interface IP address: %s.%s",
1218 safe_strerror(errno
), VTY_NEWLINE
);
1222 /* Add to subnet chain list (while marking secondary attribute). */
1223 if_subnet_add (ifp
, ifc
);
1225 /* IP address propery set. */
1226 SET_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
);
1228 /* Update interface address information to protocol daemon. */
1229 zebra_interface_address_add_update (ifp
, ifc
);
1231 /* If interface is up register connected route. */
1232 if (if_is_operative(ifp
))
1233 connected_up_ipv4 (ifp
, ifc
);
1240 ip_address_uninstall (struct vty
*vty
, struct interface
*ifp
,
1241 const char *addr_str
, const char *peer_str
,
1244 struct prefix_ipv4 cp
;
1245 struct connected
*ifc
;
1248 /* Convert to prefix structure. */
1249 ret
= str2prefix_ipv4 (addr_str
, &cp
);
1252 vty_out (vty
, "%% Malformed address %s", VTY_NEWLINE
);
1256 /* Check current interface address. */
1257 ifc
= connected_check (ifp
, (struct prefix
*) &cp
);
1260 vty_out (vty
, "%% Can't find address%s", VTY_NEWLINE
);
1264 /* This is not configured address. */
1265 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
1268 UNSET_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
1270 /* This is not real address or interface is not active. */
1271 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
)
1272 || ! CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
1274 listnode_delete (ifp
->connected
, ifc
);
1275 connected_free (ifc
);
1279 /* This is real route. */
1280 ret
= if_unset_prefix (ifp
, ifc
);
1283 vty_out (vty
, "%% Can't unset interface IP address: %s.%s",
1284 safe_strerror(errno
), VTY_NEWLINE
);
1289 /* Redistribute this information. */
1290 zebra_interface_address_delete_update (ifp
, ifc
);
1292 /* Remove connected route. */
1293 connected_down_ipv4 (ifp
, ifc
);
1295 /* Free address information. */
1296 listnode_delete (ifp
->connected
, ifc
);
1297 connected_free (ifc
);
1305 "ip address A.B.C.D/M",
1306 "Interface Internet Protocol config commands\n"
1307 "Set the IP address of an interface\n"
1308 "IP address (e.g. 10.0.0.1/8)\n")
1310 return ip_address_install (vty
, vty
->index
, argv
[0], NULL
, NULL
);
1313 DEFUN (no_ip_address
,
1315 "no ip address A.B.C.D/M",
1317 "Interface Internet Protocol config commands\n"
1318 "Set the IP address of an interface\n"
1319 "IP Address (e.g. 10.0.0.1/8)")
1321 return ip_address_uninstall (vty
, vty
->index
, argv
[0], NULL
, NULL
);
1325 DEFUN (ip_address_label
,
1326 ip_address_label_cmd
,
1327 "ip address A.B.C.D/M label LINE",
1328 "Interface Internet Protocol config commands\n"
1329 "Set the IP address of an interface\n"
1330 "IP address (e.g. 10.0.0.1/8)\n"
1331 "Label of this address\n"
1334 return ip_address_install (vty
, vty
->index
, argv
[0], NULL
, argv
[1]);
1337 DEFUN (no_ip_address_label
,
1338 no_ip_address_label_cmd
,
1339 "no ip address A.B.C.D/M label LINE",
1341 "Interface Internet Protocol config commands\n"
1342 "Set the IP address of an interface\n"
1343 "IP address (e.g. 10.0.0.1/8)\n"
1344 "Label of this address\n"
1347 return ip_address_uninstall (vty
, vty
->index
, argv
[0], NULL
, argv
[1]);
1349 #endif /* HAVE_NETLINK */
1353 ipv6_address_install (struct vty
*vty
, struct interface
*ifp
,
1354 const char *addr_str
, const char *peer_str
,
1355 const char *label
, int secondary
)
1357 struct prefix_ipv6 cp
;
1358 struct connected
*ifc
;
1359 struct prefix_ipv6
*p
;
1362 ret
= str2prefix_ipv6 (addr_str
, &cp
);
1365 vty_out (vty
, "%% Malformed address %s", VTY_NEWLINE
);
1369 ifc
= connected_check (ifp
, (struct prefix
*) &cp
);
1372 ifc
= connected_new ();
1376 p
= prefix_ipv6_new ();
1378 ifc
->address
= (struct prefix
*) p
;
1382 SET_FLAG (ifc
->flags
, ZEBRA_IFA_SECONDARY
);
1386 ifc
->label
= XSTRDUP (MTYPE_CONNECTED_LABEL
, label
);
1388 /* Add to linked list. */
1389 listnode_add (ifp
->connected
, ifc
);
1392 /* This address is configured from zebra. */
1393 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
1394 SET_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
);
1396 /* In case of this route need to install kernel. */
1397 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
)
1398 && CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
1400 /* Some system need to up the interface to set IP address. */
1401 if (! if_is_up (ifp
))
1403 if_set_flags (ifp
, IFF_UP
| IFF_RUNNING
);
1407 ret
= if_prefix_add_ipv6 (ifp
, ifc
);
1411 vty_out (vty
, "%% Can't set interface IP address: %s.%s",
1412 safe_strerror(errno
), VTY_NEWLINE
);
1416 /* IP address propery set. */
1417 SET_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
);
1419 /* Update interface address information to protocol daemon. */
1420 zebra_interface_address_add_update (ifp
, ifc
);
1422 /* If interface is up register connected route. */
1423 if (if_is_operative(ifp
))
1424 connected_up_ipv6 (ifp
, ifc
);
1431 ipv6_address_uninstall (struct vty
*vty
, struct interface
*ifp
,
1432 const char *addr_str
, const char *peer_str
,
1433 const char *label
, int secondry
)
1435 struct prefix_ipv6 cp
;
1436 struct connected
*ifc
;
1439 /* Convert to prefix structure. */
1440 ret
= str2prefix_ipv6 (addr_str
, &cp
);
1443 vty_out (vty
, "%% Malformed address %s", VTY_NEWLINE
);
1447 /* Check current interface address. */
1448 ifc
= connected_check (ifp
, (struct prefix
*) &cp
);
1451 vty_out (vty
, "%% Can't find address%s", VTY_NEWLINE
);
1455 /* This is not configured address. */
1456 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
1459 /* This is not real address or interface is not active. */
1460 if (! CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_REAL
)
1461 || ! CHECK_FLAG (ifp
->status
, ZEBRA_INTERFACE_ACTIVE
))
1463 listnode_delete (ifp
->connected
, ifc
);
1464 connected_free (ifc
);
1468 /* This is real route. */
1469 ret
= if_prefix_delete_ipv6 (ifp
, ifc
);
1472 vty_out (vty
, "%% Can't unset interface IP address: %s.%s",
1473 safe_strerror(errno
), VTY_NEWLINE
);
1477 /* Redistribute this information. */
1478 zebra_interface_address_delete_update (ifp
, ifc
);
1480 /* Remove connected route. */
1481 connected_down_ipv6 (ifp
, ifc
);
1483 /* Free address information. */
1484 listnode_delete (ifp
->connected
, ifc
);
1485 connected_free (ifc
);
1490 DEFUN (ipv6_address
,
1492 "ipv6 address X:X::X:X/M",
1493 "Interface IPv6 config commands\n"
1494 "Set the IP address of an interface\n"
1495 "IPv6 address (e.g. 3ffe:506::1/48)\n")
1497 return ipv6_address_install (vty
, vty
->index
, argv
[0], NULL
, NULL
, 0);
1500 DEFUN (no_ipv6_address
,
1501 no_ipv6_address_cmd
,
1502 "no ipv6 address X:X::X:X/M",
1504 "Interface IPv6 config commands\n"
1505 "Set the IP address of an interface\n"
1506 "IPv6 address (e.g. 3ffe:506::1/48)\n")
1508 return ipv6_address_uninstall (vty
, vty
->index
, argv
[0], NULL
, NULL
, 0);
1510 #endif /* HAVE_IPV6 */
1513 if_config_write (struct vty
*vty
)
1515 struct listnode
*node
;
1516 struct interface
*ifp
;
1519 for (ALL_LIST_ELEMENTS_RO (iflist
, node
, ifp
))
1521 struct zebra_if
*if_data
;
1522 struct listnode
*addrnode
;
1523 struct connected
*ifc
;
1526 if_data
= ifp
->info
;
1528 vty_out (vty
, "interface %s%s", ifp
->name
,
1532 vty_out (vty
, " description %s%s", ifp
->desc
,
1535 /* Assign bandwidth here to avoid unnecessary interface flap
1536 while processing config script */
1537 if (ifp
->bandwidth
!= 0)
1538 vty_out(vty
, " bandwidth %u%s", ifp
->bandwidth
, VTY_NEWLINE
);
1540 if (CHECK_FLAG(ifp
->status
, ZEBRA_INTERFACE_LINKDETECTION
))
1541 vty_out(vty
, " link-detect%s", VTY_NEWLINE
);
1543 for (ALL_LIST_ELEMENTS_RO (ifp
->connected
, addrnode
, ifc
))
1545 if (CHECK_FLAG (ifc
->conf
, ZEBRA_IFC_CONFIGURED
))
1548 vty_out (vty
, " ip%s address %s/%d",
1549 p
->family
== AF_INET
? "" : "v6",
1550 inet_ntop (p
->family
, &p
->u
.prefix
, buf
, BUFSIZ
),
1554 vty_out (vty
, " label %s", ifc
->label
);
1556 vty_out (vty
, "%s", VTY_NEWLINE
);
1562 if (if_data
->shutdown
== IF_ZEBRA_SHUTDOWN_ON
)
1563 vty_out (vty
, " shutdown%s", VTY_NEWLINE
);
1565 if (if_data
->multicast
!= IF_ZEBRA_MULTICAST_UNSPEC
)
1566 vty_out (vty
, " %smulticast%s",
1567 if_data
->multicast
== IF_ZEBRA_MULTICAST_ON
? "" : "no ",
1572 rtadv_config_write (vty
, ifp
);
1576 irdp_config_write (vty
, ifp
);
1579 vty_out (vty
, "!%s", VTY_NEWLINE
);
1584 /* Allocate and initialize interface vector. */
1586 zebra_if_init (void)
1588 /* Initialize interface and new hook. */
1590 if_add_hook (IF_NEW_HOOK
, if_zebra_new_hook
);
1591 if_add_hook (IF_DELETE_HOOK
, if_zebra_delete_hook
);
1593 /* Install configuration write function. */
1594 install_node (&interface_node
, if_config_write
);
1596 install_element (VIEW_NODE
, &show_interface_cmd
);
1597 install_element (ENABLE_NODE
, &show_interface_cmd
);
1598 install_element (ENABLE_NODE
, &show_interface_desc_cmd
);
1599 install_element (CONFIG_NODE
, &zebra_interface_cmd
);
1600 install_element (CONFIG_NODE
, &no_interface_cmd
);
1601 install_default (INTERFACE_NODE
);
1602 install_element (INTERFACE_NODE
, &interface_desc_cmd
);
1603 install_element (INTERFACE_NODE
, &no_interface_desc_cmd
);
1604 install_element (INTERFACE_NODE
, &multicast_cmd
);
1605 install_element (INTERFACE_NODE
, &no_multicast_cmd
);
1606 install_element (INTERFACE_NODE
, &linkdetect_cmd
);
1607 install_element (INTERFACE_NODE
, &no_linkdetect_cmd
);
1608 install_element (INTERFACE_NODE
, &shutdown_if_cmd
);
1609 install_element (INTERFACE_NODE
, &no_shutdown_if_cmd
);
1610 install_element (INTERFACE_NODE
, &bandwidth_if_cmd
);
1611 install_element (INTERFACE_NODE
, &no_bandwidth_if_cmd
);
1612 install_element (INTERFACE_NODE
, &no_bandwidth_if_val_cmd
);
1613 install_element (INTERFACE_NODE
, &ip_address_cmd
);
1614 install_element (INTERFACE_NODE
, &no_ip_address_cmd
);
1616 install_element (INTERFACE_NODE
, &ipv6_address_cmd
);
1617 install_element (INTERFACE_NODE
, &no_ipv6_address_cmd
);
1618 #endif /* HAVE_IPV6 */
1620 install_element (INTERFACE_NODE
, &ip_address_label_cmd
);
1621 install_element (INTERFACE_NODE
, &no_ip_address_label_cmd
);
1622 #endif /* HAVE_NETLINK */