]> git.proxmox.com Git - mirror_frr.git/blob - zebra/interface.c
Merge pull request #2788 from ton31337/fix/print_ipv6_route_if_afi
[mirror_frr.git] / zebra / interface.c
1 /*
2 * Interface function.
3 * Copyright (C) 1997, 1999 Kunihiro Ishiguro
4 *
5 * This file is part of GNU Zebra.
6 *
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
10 * later version.
11 *
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.
16 *
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
20 */
21
22 #include <zebra.h>
23
24 #include "if.h"
25 #include "vty.h"
26 #include "sockunion.h"
27 #include "prefix.h"
28 #include "command.h"
29 #include "memory.h"
30 #include "zebra_memory.h"
31 #include "ioctl.h"
32 #include "connected.h"
33 #include "log.h"
34 #include "zclient.h"
35 #include "vrf.h"
36
37 #include "zebra/rtadv.h"
38 #include "zebra_ns.h"
39 #include "zebra_vrf.h"
40 #include "zebra/interface.h"
41 #include "zebra/rib.h"
42 #include "zebra/rt.h"
43 #include "zebra/zserv.h"
44 #include "zebra/redistribute.h"
45 #include "zebra/debug.h"
46 #include "zebra/irdp.h"
47 #include "zebra/zebra_ptm.h"
48 #include "zebra/rt_netlink.h"
49 #include "zebra/interface.h"
50 #include "zebra/zebra_vxlan.h"
51 #include "zebra/zebra_static.h"
52
53 #define ZEBRA_PTM_SUPPORT
54
55 DEFINE_HOOK(zebra_if_extra_info, (struct vty * vty, struct interface *ifp),
56 (vty, ifp))
57 DEFINE_HOOK(zebra_if_config_wr, (struct vty * vty, struct interface *ifp),
58 (vty, ifp))
59
60
61 static void if_down_del_nbr_connected(struct interface *ifp);
62
63 static int if_zebra_speed_update(struct thread *thread)
64 {
65 struct interface *ifp = THREAD_ARG(thread);
66 struct zebra_if *zif = ifp->info;
67 uint32_t new_speed;
68
69 zif->speed_update = NULL;
70
71 new_speed = kernel_get_speed(ifp);
72 if (new_speed != ifp->speed) {
73 zlog_info("%s: %s old speed: %u new speed: %u",
74 __PRETTY_FUNCTION__, ifp->name, ifp->speed,
75 new_speed);
76 ifp->speed = new_speed;
77 if_add_update(ifp);
78 }
79
80 return 1;
81 }
82
83 static void zebra_if_node_destroy(route_table_delegate_t *delegate,
84 struct route_table *table,
85 struct route_node *node)
86 {
87 if (node->info)
88 list_delete_and_null((struct list **)&node->info);
89 route_node_destroy(delegate, table, node);
90 }
91
92 route_table_delegate_t zebra_if_table_delegate = {
93 .create_node = route_node_create,
94 .destroy_node = zebra_if_node_destroy};
95
96 /* Called when new interface is added. */
97 static int if_zebra_new_hook(struct interface *ifp)
98 {
99 struct zebra_if *zebra_if;
100
101 zebra_if = XCALLOC(MTYPE_TMP, sizeof(struct zebra_if));
102
103 zebra_if->multicast = IF_ZEBRA_MULTICAST_UNSPEC;
104 zebra_if->shutdown = IF_ZEBRA_SHUTDOWN_OFF;
105 zebra_ptm_if_init(zebra_if);
106
107 ifp->ptm_enable = zebra_ptm_get_enable_state();
108 #if defined(HAVE_RTADV)
109 {
110 /* Set default router advertise values. */
111 struct rtadvconf *rtadv;
112
113 rtadv = &zebra_if->rtadv;
114
115 rtadv->AdvSendAdvertisements = 0;
116 rtadv->MaxRtrAdvInterval = RTADV_MAX_RTR_ADV_INTERVAL;
117 rtadv->MinRtrAdvInterval = RTADV_MIN_RTR_ADV_INTERVAL;
118 rtadv->AdvIntervalTimer = 0;
119 rtadv->AdvManagedFlag = 0;
120 rtadv->AdvOtherConfigFlag = 0;
121 rtadv->AdvHomeAgentFlag = 0;
122 rtadv->AdvLinkMTU = 0;
123 rtadv->AdvReachableTime = 0;
124 rtadv->AdvRetransTimer = 0;
125 rtadv->AdvCurHopLimit = 0;
126 rtadv->AdvDefaultLifetime =
127 -1; /* derive from MaxRtrAdvInterval */
128 rtadv->HomeAgentPreference = 0;
129 rtadv->HomeAgentLifetime =
130 -1; /* derive from AdvDefaultLifetime */
131 rtadv->AdvIntervalOption = 0;
132 rtadv->DefaultPreference = RTADV_PREF_MEDIUM;
133
134 rtadv->AdvPrefixList = list_new();
135 }
136 #endif /* HAVE_RTADV */
137
138 /* Initialize installed address chains tree. */
139 zebra_if->ipv4_subnets =
140 route_table_init_with_delegate(&zebra_if_table_delegate);
141
142 ifp->info = zebra_if;
143
144 /*
145 * Some platforms are telling us that the interface is
146 * up and ready to go. When we check the speed we
147 * sometimes get the wrong value. Wait a couple
148 * of seconds and ask again. Hopefully it's all settled
149 * down upon startup.
150 */
151 thread_add_timer(zebrad.master, if_zebra_speed_update, ifp, 15,
152 &zebra_if->speed_update);
153 return 0;
154 }
155
156 /* Called when interface is deleted. */
157 static int if_zebra_delete_hook(struct interface *ifp)
158 {
159 struct zebra_if *zebra_if;
160
161 if (ifp->info) {
162 zebra_if = ifp->info;
163
164 /* Free installed address chains tree. */
165 if (zebra_if->ipv4_subnets)
166 route_table_finish(zebra_if->ipv4_subnets);
167 #if defined(HAVE_RTADV)
168
169 struct rtadvconf *rtadv;
170
171 rtadv = &zebra_if->rtadv;
172 list_delete_and_null(&rtadv->AdvPrefixList);
173 #endif /* HAVE_RTADV */
174
175 THREAD_OFF(zebra_if->speed_update);
176
177 XFREE(MTYPE_TMP, zebra_if);
178 }
179
180 return 0;
181 }
182
183 /* Build the table key */
184 static void if_build_key(uint32_t ifindex, struct prefix *p)
185 {
186 p->family = AF_INET;
187 p->prefixlen = IPV4_MAX_BITLEN;
188 p->u.prefix4.s_addr = ifindex;
189 }
190
191 /* Link an interface in a per NS interface tree */
192 struct interface *if_link_per_ns(struct zebra_ns *ns, struct interface *ifp)
193 {
194 struct prefix p;
195 struct route_node *rn;
196
197 if (ifp->ifindex == IFINDEX_INTERNAL)
198 return NULL;
199
200 if_build_key(ifp->ifindex, &p);
201 rn = route_node_get(ns->if_table, &p);
202 if (rn->info) {
203 ifp = (struct interface *)rn->info;
204 route_unlock_node(rn); /* get */
205 ifp->node = rn;
206 return ifp;
207 }
208
209 rn->info = ifp;
210 ifp->node = rn;
211
212 return ifp;
213 }
214
215 /* Delete a VRF. This is called in vrf_terminate(). */
216 void if_unlink_per_ns(struct interface *ifp)
217 {
218 ifp->node->info = NULL;
219 route_unlock_node(ifp->node);
220 ifp->node = NULL;
221 }
222
223 /* Look up an interface by identifier within a NS */
224 struct interface *if_lookup_by_index_per_ns(struct zebra_ns *ns,
225 uint32_t ifindex)
226 {
227 struct prefix p;
228 struct route_node *rn;
229 struct interface *ifp = NULL;
230
231 if_build_key(ifindex, &p);
232 rn = route_node_lookup(ns->if_table, &p);
233 if (rn) {
234 ifp = (struct interface *)rn->info;
235 route_unlock_node(rn); /* lookup */
236 }
237 return ifp;
238 }
239
240 /* Look up an interface by name within a NS */
241 struct interface *if_lookup_by_name_per_ns(struct zebra_ns *ns,
242 const char *ifname)
243 {
244 struct route_node *rn;
245 struct interface *ifp;
246
247 for (rn = route_top(ns->if_table); rn; rn = route_next(rn)) {
248 ifp = (struct interface *)rn->info;
249 if (ifp && strcmp(ifp->name, ifname) == 0)
250 return (ifp);
251 }
252
253 return NULL;
254 }
255
256 /* this function must be used only if the vrf backend
257 * is a netns backend
258 */
259 struct interface *if_lookup_by_name_not_ns(ns_id_t ns_id,
260 const char *ifname)
261 {
262 struct interface *ifp;
263 struct ns *ns;
264
265 RB_FOREACH (ns, ns_head, &ns_tree) {
266 if (ns->ns_id == ns_id)
267 continue;
268 /* if_delete_update has removed interface
269 * from zns->if_table
270 * so to look for interface, use the vrf list
271 */
272 ifp = if_lookup_by_name(ifname, (vrf_id_t)ns->ns_id);
273 if (!ifp)
274 continue;
275 return ifp;
276 }
277 return NULL;
278 }
279
280 const char *ifindex2ifname_per_ns(struct zebra_ns *zns, unsigned int ifindex)
281 {
282 struct interface *ifp;
283
284 return ((ifp = if_lookup_by_index_per_ns(zns, ifindex)) != NULL)
285 ? ifp->name
286 : "unknown";
287 }
288
289 /* Tie an interface address to its derived subnet list of addresses. */
290 int if_subnet_add(struct interface *ifp, struct connected *ifc)
291 {
292 struct route_node *rn;
293 struct zebra_if *zebra_if;
294 struct prefix cp;
295 struct list *addr_list;
296
297 assert(ifp && ifp->info && ifc);
298 zebra_if = ifp->info;
299
300 /* Get address derived subnet node and associated address list, while
301 marking
302 address secondary attribute appropriately. */
303 cp = *CONNECTED_PREFIX(ifc);
304 apply_mask(&cp);
305 rn = route_node_get(zebra_if->ipv4_subnets, &cp);
306
307 if ((addr_list = rn->info))
308 SET_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY);
309 else {
310 UNSET_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY);
311 rn->info = addr_list = list_new();
312 route_lock_node(rn);
313 }
314
315 /* Tie address at the tail of address list. */
316 listnode_add(addr_list, ifc);
317
318 /* Return list element count. */
319 return (addr_list->count);
320 }
321
322 /* Untie an interface address from its derived subnet list of addresses. */
323 int if_subnet_delete(struct interface *ifp, struct connected *ifc)
324 {
325 struct route_node *rn;
326 struct zebra_if *zebra_if;
327 struct list *addr_list;
328 struct prefix cp;
329
330 assert(ifp && ifp->info && ifc);
331 zebra_if = ifp->info;
332
333 cp = *CONNECTED_PREFIX(ifc);
334 apply_mask(&cp);
335
336 /* Get address derived subnet node. */
337 rn = route_node_lookup(zebra_if->ipv4_subnets, &cp);
338 if (!(rn && rn->info)) {
339 zlog_warn(
340 "Trying to remove an address from an unknown subnet."
341 " (please report this bug)");
342 return -1;
343 }
344 route_unlock_node(rn);
345
346 /* Untie address from subnet's address list. */
347 addr_list = rn->info;
348
349 /* Deleting an address that is not registered is a bug.
350 * In any case, we shouldn't decrement the lock counter if the address
351 * is unknown. */
352 if (!listnode_lookup(addr_list, ifc)) {
353 zlog_warn(
354 "Trying to remove an address from a subnet where it is not"
355 " currently registered. (please report this bug)");
356 return -1;
357 }
358
359 listnode_delete(addr_list, ifc);
360 route_unlock_node(rn);
361
362 /* Return list element count, if not empty. */
363 if (addr_list->count) {
364 /* If deleted address is primary, mark subsequent one as such
365 * and distribute. */
366 if (!CHECK_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY)) {
367 ifc = listgetdata(
368 (struct listnode *)listhead(addr_list));
369 zebra_interface_address_delete_update(ifp, ifc);
370 UNSET_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY);
371 /* XXX: Linux kernel removes all the secondary addresses
372 * when the primary
373 * address is removed. We could try to work around that,
374 * though this is
375 * non-trivial. */
376 zebra_interface_address_add_update(ifp, ifc);
377 }
378
379 return addr_list->count;
380 }
381
382 /* Otherwise, free list and route node. */
383 list_delete_and_null(&addr_list);
384 rn->info = NULL;
385 route_unlock_node(rn);
386
387 return 0;
388 }
389
390 /* if_flags_mangle: A place for hacks that require mangling
391 * or tweaking the interface flags.
392 *
393 * ******************** Solaris flags hacks **************************
394 *
395 * Solaris IFF_UP flag reflects only the primary interface as the
396 * routing socket only sends IFINFO for the primary interface. Hence
397 * ~IFF_UP does not per se imply all the logical interfaces are also
398 * down - which we only know of as addresses. Instead we must determine
399 * whether the interface really is up or not according to how many
400 * addresses are still attached. (Solaris always sends RTM_DELADDR if
401 * an interface, logical or not, goes ~IFF_UP).
402 *
403 * Ie, we mangle IFF_UP to *additionally* reflect whether or not there
404 * are addresses left in struct connected, not just the actual underlying
405 * IFF_UP flag.
406 *
407 * We must hence remember the real state of IFF_UP, which we do in
408 * struct zebra_if.primary_state.
409 *
410 * Setting IFF_UP within zebra to administratively shutdown the
411 * interface will affect only the primary interface/address on Solaris.
412 ************************End Solaris flags hacks ***********************
413 */
414 static void if_flags_mangle(struct interface *ifp, uint64_t *newflags)
415 {
416 #ifdef SUNOS_5
417 struct zebra_if *zif = ifp->info;
418
419 zif->primary_state = *newflags & (IFF_UP & 0xff);
420
421 if (CHECK_FLAG(zif->primary_state, IFF_UP)
422 || listcount(ifp->connected) > 0)
423 SET_FLAG(*newflags, IFF_UP);
424 else
425 UNSET_FLAG(*newflags, IFF_UP);
426 #endif /* SUNOS_5 */
427 }
428
429 /* Update the flags field of the ifp with the new flag set provided.
430 * Take whatever actions are required for any changes in flags we care
431 * about.
432 *
433 * newflags should be the raw value, as obtained from the OS.
434 */
435 void if_flags_update(struct interface *ifp, uint64_t newflags)
436 {
437 if_flags_mangle(ifp, &newflags);
438
439 if (if_is_no_ptm_operative(ifp)) {
440 /* operative -> inoperative? */
441 ifp->flags = newflags;
442 if (!if_is_operative(ifp))
443 if_down(ifp);
444 } else {
445 /* inoperative -> operative? */
446 ifp->flags = newflags;
447 if (if_is_operative(ifp))
448 if_up(ifp);
449 }
450 }
451
452 /* Wake up configured address if it is not in current kernel
453 address. */
454 static void if_addr_wakeup(struct interface *ifp)
455 {
456 struct listnode *node, *nnode;
457 struct connected *ifc;
458 struct prefix *p;
459 int ret;
460
461 for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, ifc)) {
462 p = ifc->address;
463
464 if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED)
465 && !CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED)) {
466 /* Address check. */
467 if (p->family == AF_INET) {
468 if (!if_is_up(ifp)) {
469 /* Assume zebra is configured like
470 * following:
471 *
472 * interface gre0
473 * ip addr 192.0.2.1/24
474 * !
475 *
476 * As soon as zebra becomes first aware
477 * that gre0 exists in the
478 * kernel, it will set gre0 up and
479 * configure its addresses.
480 *
481 * (This may happen at startup when the
482 * interface already exists
483 * or during runtime when the interface
484 * is added to the kernel)
485 *
486 * XXX: IRDP code is calling here via
487 * if_add_update - this seems
488 * somewhat weird.
489 * XXX: RUNNING is not a settable flag
490 * on any system
491 * I (paulj) am aware of.
492 */
493 if_set_flags(ifp, IFF_UP | IFF_RUNNING);
494 if_refresh(ifp);
495 }
496
497 ret = if_set_prefix(ifp, ifc);
498 if (ret < 0) {
499 zlog_warn(
500 "Can't set interface's address: %s",
501 safe_strerror(errno));
502 continue;
503 }
504
505 SET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
506 /* The address will be advertised to zebra
507 * clients when the notification
508 * from the kernel has been received.
509 * It will also be added to the interface's
510 * subnet list then. */
511 }
512 if (p->family == AF_INET6) {
513 if (!if_is_up(ifp)) {
514 /* See long comment above */
515 if_set_flags(ifp, IFF_UP | IFF_RUNNING);
516 if_refresh(ifp);
517 }
518
519 ret = if_prefix_add_ipv6(ifp, ifc);
520 if (ret < 0) {
521 zlog_warn(
522 "Can't set interface's address: %s",
523 safe_strerror(errno));
524 continue;
525 }
526
527 SET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
528 /* The address will be advertised to zebra
529 * clients when the notification
530 * from the kernel has been received. */
531 }
532 }
533 }
534 }
535
536 /* Handle interface addition */
537 void if_add_update(struct interface *ifp)
538 {
539 struct zebra_if *if_data;
540 struct zebra_ns *zns;
541 struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
542
543 /* case interface populate before vrf enabled */
544 if (zvrf->zns)
545 zns = zvrf->zns;
546 else
547 zns = zebra_ns_lookup(NS_DEFAULT);
548 if_link_per_ns(zns, ifp);
549 if_data = ifp->info;
550 assert(if_data);
551
552 if (if_data->multicast == IF_ZEBRA_MULTICAST_ON)
553 if_set_flags(ifp, IFF_MULTICAST);
554 else if (if_data->multicast == IF_ZEBRA_MULTICAST_OFF)
555 if_unset_flags(ifp, IFF_MULTICAST);
556
557 zebra_ptm_if_set_ptm_state(ifp, if_data);
558
559 zebra_interface_add_update(ifp);
560
561 if (!CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) {
562 SET_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE);
563
564 if (if_data->shutdown == IF_ZEBRA_SHUTDOWN_ON) {
565 if (IS_ZEBRA_DEBUG_KERNEL)
566 zlog_debug(
567 "interface %s vrf %u index %d is shutdown. "
568 "Won't wake it up.",
569 ifp->name, ifp->vrf_id, ifp->ifindex);
570 return;
571 }
572
573 if_addr_wakeup(ifp);
574
575 if (IS_ZEBRA_DEBUG_KERNEL)
576 zlog_debug(
577 "interface %s vrf %u index %d becomes active.",
578 ifp->name, ifp->vrf_id, ifp->ifindex);
579
580 static_ifindex_update(ifp, true);
581 } else {
582 if (IS_ZEBRA_DEBUG_KERNEL)
583 zlog_debug("interface %s vrf %u index %d is added.",
584 ifp->name, ifp->vrf_id, ifp->ifindex);
585 }
586 }
587
588 /* Install connected routes corresponding to an interface. */
589 static void if_install_connected(struct interface *ifp)
590 {
591 struct listnode *node;
592 struct listnode *next;
593 struct connected *ifc;
594
595 if (ifp->connected) {
596 for (ALL_LIST_ELEMENTS(ifp->connected, node, next, ifc)) {
597 if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL))
598 zebra_interface_address_add_update(ifp, ifc);
599
600 connected_up(ifp, ifc);
601 }
602 }
603 }
604
605 /* Uninstall connected routes corresponding to an interface. */
606 static void if_uninstall_connected(struct interface *ifp)
607 {
608 struct listnode *node;
609 struct listnode *next;
610 struct connected *ifc;
611
612 if (ifp->connected) {
613 for (ALL_LIST_ELEMENTS(ifp->connected, node, next, ifc)) {
614 zebra_interface_address_delete_update(ifp, ifc);
615 connected_down(ifp, ifc);
616 }
617 }
618 }
619
620 /* Uninstall and delete connected routes corresponding to an interface. */
621 /* TODO - Check why IPv4 handling here is different from install or if_down */
622 static void if_delete_connected(struct interface *ifp)
623 {
624 struct connected *ifc;
625 struct prefix cp;
626 struct route_node *rn;
627 struct zebra_if *zebra_if;
628 struct listnode *node;
629 struct listnode *last = NULL;
630
631 zebra_if = ifp->info;
632
633 if (!ifp->connected)
634 return;
635
636 while ((node = (last ? last->next : listhead(ifp->connected)))) {
637 ifc = listgetdata(node);
638
639 cp = *CONNECTED_PREFIX(ifc);
640 apply_mask(&cp);
641
642 if (cp.family == AF_INET
643 && (rn = route_node_lookup(zebra_if->ipv4_subnets, &cp))) {
644 struct listnode *anode;
645 struct listnode *next;
646 struct listnode *first;
647 struct list *addr_list;
648
649 route_unlock_node(rn);
650 addr_list = (struct list *)rn->info;
651
652 /* Remove addresses, secondaries first. */
653 first = listhead(addr_list);
654 if (first)
655 for (anode = first->next; anode || first;
656 anode = next) {
657 if (!anode) {
658 anode = first;
659 first = NULL;
660 }
661 next = anode->next;
662
663 ifc = listgetdata(anode);
664 connected_down(ifp, ifc);
665
666 /* XXX: We have to send notifications
667 * here explicitly, because we destroy
668 * the ifc before receiving the
669 * notification about the address being
670 * deleted.
671 */
672 zebra_interface_address_delete_update(
673 ifp, ifc);
674
675 UNSET_FLAG(ifc->conf, ZEBRA_IFC_REAL);
676 UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
677
678 /* Remove from subnet chain. */
679 list_delete_node(addr_list, anode);
680 route_unlock_node(rn);
681
682 /* Remove from interface address list
683 * (unconditionally). */
684 if (!CHECK_FLAG(ifc->conf,
685 ZEBRA_IFC_CONFIGURED)) {
686 listnode_delete(ifp->connected,
687 ifc);
688 connected_free(ifc);
689 } else
690 last = node;
691 }
692
693 /* Free chain list and respective route node. */
694 list_delete_and_null(&addr_list);
695 rn->info = NULL;
696 route_unlock_node(rn);
697 } else if (cp.family == AF_INET6) {
698 connected_down(ifp, ifc);
699
700 zebra_interface_address_delete_update(ifp, ifc);
701
702 UNSET_FLAG(ifc->conf, ZEBRA_IFC_REAL);
703 UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
704
705 if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED))
706 last = node;
707 else {
708 listnode_delete(ifp->connected, ifc);
709 connected_free(ifc);
710 }
711 } else {
712 last = node;
713 }
714 }
715 }
716
717 /* Handle an interface delete event */
718 void if_delete_update(struct interface *ifp)
719 {
720 struct zebra_if *zif;
721
722 if (if_is_up(ifp)) {
723 zlog_err(
724 "interface %s vrf %u index %d is still up while being deleted.",
725 ifp->name, ifp->vrf_id, ifp->ifindex);
726 return;
727 }
728
729 if (!CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE))
730 return;
731
732 /* Mark interface as inactive */
733 UNSET_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE);
734
735 if (IS_ZEBRA_DEBUG_KERNEL)
736 zlog_debug("interface %s vrf %u index %d is now inactive.",
737 ifp->name, ifp->vrf_id, ifp->ifindex);
738
739 static_ifindex_update(ifp, false);
740
741 /* Delete connected routes from the kernel. */
742 if_delete_connected(ifp);
743
744 /* Send out notification on interface delete. */
745 zebra_interface_delete_update(ifp);
746
747 if_unlink_per_ns(ifp);
748
749 /* Update ifindex after distributing the delete message. This is in
750 case any client needs to have the old value of ifindex available
751 while processing the deletion. Each client daemon is responsible
752 for setting ifindex to IFINDEX_INTERNAL after processing the
753 interface deletion message. */
754 if_set_index(ifp, IFINDEX_INTERNAL);
755 ifp->node = NULL;
756
757 /* if the ifp is in a vrf, move it to default so vrf can be deleted if
758 * desired */
759 if (ifp->vrf_id)
760 if_handle_vrf_change(ifp, VRF_DEFAULT);
761
762 /* Reset some zebra interface params to default values. */
763 zif = ifp->info;
764 if (zif) {
765 zif->zif_type = ZEBRA_IF_OTHER;
766 zif->zif_slave_type = ZEBRA_IF_SLAVE_NONE;
767 memset(&zif->l2info, 0, sizeof(union zebra_l2if_info));
768 memset(&zif->brslave_info, 0,
769 sizeof(struct zebra_l2info_brslave));
770 }
771 }
772
773 /* VRF change for an interface */
774 void if_handle_vrf_change(struct interface *ifp, vrf_id_t vrf_id)
775 {
776 vrf_id_t old_vrf_id;
777
778 old_vrf_id = ifp->vrf_id;
779
780 static_ifindex_update(ifp, false);
781
782 /* Uninstall connected routes. */
783 if_uninstall_connected(ifp);
784
785 /* Delete any IPv4 neighbors created to implement RFC 5549 */
786 if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(ifp);
787
788 /* Delete all neighbor addresses learnt through IPv6 RA */
789 if_down_del_nbr_connected(ifp);
790
791 /* Send out notification on interface VRF change. */
792 /* This is to issue an UPDATE or a DELETE, as appropriate. */
793 zebra_interface_vrf_update_del(ifp, vrf_id);
794
795 /* update VRF */
796 if_update_to_new_vrf(ifp, vrf_id);
797
798 /* Send out notification on interface VRF change. */
799 /* This is to issue an ADD, if needed. */
800 zebra_interface_vrf_update_add(ifp, old_vrf_id);
801
802 /* Install connected routes (in new VRF). */
803 if (if_is_operative(ifp))
804 if_install_connected(ifp);
805
806 static_ifindex_update(ifp, true);
807
808 /* Due to connected route change, schedule RIB processing for both old
809 * and new VRF.
810 */
811 if (IS_ZEBRA_DEBUG_RIB_DETAILED)
812 zlog_debug("%u: IF %s VRF change, scheduling RIB processing",
813 ifp->vrf_id, ifp->name);
814 rib_update(old_vrf_id, RIB_UPDATE_IF_CHANGE);
815 rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
816 }
817
818 static void ipv6_ll_address_to_mac(struct in6_addr *address, uint8_t *mac)
819 {
820 mac[0] = address->s6_addr[8] ^ 0x02;
821 mac[1] = address->s6_addr[9];
822 mac[2] = address->s6_addr[10];
823 mac[3] = address->s6_addr[13];
824 mac[4] = address->s6_addr[14];
825 mac[5] = address->s6_addr[15];
826 }
827
828 void if_nbr_ipv6ll_to_ipv4ll_neigh_update(struct interface *ifp,
829 struct in6_addr *address, int add)
830 {
831 struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
832 struct zebra_if *zif = ifp->info;
833 char buf[16] = "169.254.0.1";
834 struct in_addr ipv4_ll;
835 char mac[6];
836 ns_id_t ns_id;
837
838 inet_pton(AF_INET, buf, &ipv4_ll);
839
840 ipv6_ll_address_to_mac(address, (uint8_t *)mac);
841 ns_id = zvrf->zns->ns_id;
842
843 /*
844 * Remove existed arp record for the interface as netlink
845 * protocol does not have update message types
846 *
847 * supported message types are RTM_NEWNEIGH and RTM_DELNEIGH
848 */
849 kernel_neigh_update(0, ifp->ifindex, ipv4_ll.s_addr, mac, 6, ns_id);
850
851 /* Add arp record */
852 kernel_neigh_update(add, ifp->ifindex, ipv4_ll.s_addr, mac, 6, ns_id);
853
854 /*
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.
859 */
860 zif->v6_2_v4_ll_neigh_entry = !!add;
861 memcpy(&zif->v6_2_v4_ll_addr6, address, sizeof(*address));
862
863 zvrf->neigh_updates++;
864 }
865
866 static void if_nbr_ipv6ll_to_ipv4ll_neigh_add_all(struct interface *ifp)
867 {
868 if (listhead(ifp->nbr_connected)) {
869 struct nbr_connected *nbr_connected;
870 struct listnode *node;
871
872 for (ALL_LIST_ELEMENTS_RO(ifp->nbr_connected, node,
873 nbr_connected))
874 if_nbr_ipv6ll_to_ipv4ll_neigh_update(
875 ifp, &nbr_connected->address->u.prefix6, 1);
876 }
877 }
878
879 void if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(struct interface *ifp)
880 {
881 if (listhead(ifp->nbr_connected)) {
882 struct nbr_connected *nbr_connected;
883 struct listnode *node;
884
885 for (ALL_LIST_ELEMENTS_RO(ifp->nbr_connected, node,
886 nbr_connected))
887 if_nbr_ipv6ll_to_ipv4ll_neigh_update(
888 ifp, &nbr_connected->address->u.prefix6, 0);
889 }
890 }
891
892 static void if_down_del_nbr_connected(struct interface *ifp)
893 {
894 struct nbr_connected *nbr_connected;
895 struct listnode *node, *nnode;
896
897 for (ALL_LIST_ELEMENTS(ifp->nbr_connected, node, nnode,
898 nbr_connected)) {
899 listnode_delete(ifp->nbr_connected, nbr_connected);
900 nbr_connected_free(nbr_connected);
901 }
902 }
903
904 /* Interface is up. */
905 void if_up(struct interface *ifp)
906 {
907 struct zebra_if *zif;
908 struct interface *link_if;
909 struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
910
911 zif = ifp->info;
912 zif->up_count++;
913 quagga_timestamp(2, zif->up_last, sizeof(zif->up_last));
914
915 /* Notify the protocol daemons. */
916 if (ifp->ptm_enable && (ifp->ptm_status == ZEBRA_PTM_STATUS_DOWN)) {
917 zlog_warn("%s: interface %s hasn't passed ptm check\n",
918 __func__, ifp->name);
919 return;
920 }
921 zebra_interface_up_update(ifp);
922
923 if_nbr_ipv6ll_to_ipv4ll_neigh_add_all(ifp);
924
925 #if defined(HAVE_RTADV)
926 /* Enable fast tx of RA if enabled && RA interval is not in msecs */
927 if (zif->rtadv.AdvSendAdvertisements
928 && (zif->rtadv.MaxRtrAdvInterval >= 1000)) {
929 zif->rtadv.inFastRexmit = 1;
930 zif->rtadv.NumFastReXmitsRemain = RTADV_NUM_FAST_REXMITS;
931 }
932 #endif
933
934 /* Install connected routes to the kernel. */
935 if_install_connected(ifp);
936
937 /* Install any static routes using this vrf interface */
938 if (IS_ZEBRA_IF_VRF(ifp)) {
939 static_fixup_vrf_ids(zvrf);
940 static_config_install_delayed_routes(zvrf);
941 }
942
943 if (IS_ZEBRA_DEBUG_RIB_DETAILED)
944 zlog_debug("%u: IF %s up, scheduling RIB processing",
945 ifp->vrf_id, ifp->name);
946 rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
947
948 /* Handle interface up for specific types for EVPN. Non-VxLAN interfaces
949 * are checked to see if (remote) neighbor entries need to be installed
950 * on them for ARP suppression.
951 */
952 if (IS_ZEBRA_IF_VXLAN(ifp))
953 zebra_vxlan_if_up(ifp);
954 else if (IS_ZEBRA_IF_BRIDGE(ifp)) {
955 link_if = ifp;
956 zebra_vxlan_svi_up(ifp, link_if);
957 } else if (IS_ZEBRA_IF_VLAN(ifp)) {
958 link_if = if_lookup_by_index_per_ns(zvrf->zns,
959 zif->link_ifindex);
960 if (link_if)
961 zebra_vxlan_svi_up(ifp, link_if);
962 }
963 }
964
965 /* Interface goes down. We have to manage different behavior of based
966 OS. */
967 void if_down(struct interface *ifp)
968 {
969 struct zebra_if *zif;
970 struct interface *link_if;
971 struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
972
973 zif = ifp->info;
974 zif->down_count++;
975 quagga_timestamp(2, zif->down_last, sizeof(zif->down_last));
976
977 /* Handle interface down for specific types for EVPN. Non-VxLAN
978 * interfaces
979 * are checked to see if (remote) neighbor entries need to be purged
980 * for ARP suppression.
981 */
982 if (IS_ZEBRA_IF_VXLAN(ifp))
983 zebra_vxlan_if_down(ifp);
984 else if (IS_ZEBRA_IF_BRIDGE(ifp)) {
985 link_if = ifp;
986 zebra_vxlan_svi_down(ifp, link_if);
987 } else if (IS_ZEBRA_IF_VLAN(ifp)) {
988 link_if = if_lookup_by_index_per_ns(zvrf->zns,
989 zif->link_ifindex);
990 if (link_if)
991 zebra_vxlan_svi_down(ifp, link_if);
992 }
993
994
995 /* Notify to the protocol daemons. */
996 zebra_interface_down_update(ifp);
997
998 /* Uninstall connected routes from the kernel. */
999 if_uninstall_connected(ifp);
1000
1001 if (IS_ZEBRA_DEBUG_RIB_DETAILED)
1002 zlog_debug("%u: IF %s down, scheduling RIB processing",
1003 ifp->vrf_id, ifp->name);
1004 rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
1005
1006 if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(ifp);
1007
1008 /* Delete all neighbor addresses learnt through IPv6 RA */
1009 if_down_del_nbr_connected(ifp);
1010 }
1011
1012 void if_refresh(struct interface *ifp)
1013 {
1014 if_get_flags(ifp);
1015 }
1016
1017 void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex)
1018 {
1019 struct zebra_if *zif;
1020
1021 zif = (struct zebra_if *)ifp->info;
1022 zif->link_ifindex = link_ifindex;
1023 zif->link = if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT),
1024 link_ifindex);
1025 }
1026
1027
1028 /* Output prefix string to vty. */
1029 static int prefix_vty_out(struct vty *vty, struct prefix *p)
1030 {
1031 char str[INET6_ADDRSTRLEN];
1032
1033 inet_ntop(p->family, &p->u.prefix, str, sizeof(str));
1034 vty_out(vty, "%s", str);
1035 return strlen(str);
1036 }
1037
1038 /* Dump if address information to vty. */
1039 static void connected_dump_vty(struct vty *vty, struct connected *connected)
1040 {
1041 struct prefix *p;
1042
1043 /* Print interface address. */
1044 p = connected->address;
1045 vty_out(vty, " %s ", prefix_family_str(p));
1046 prefix_vty_out(vty, p);
1047 vty_out(vty, "/%d", p->prefixlen);
1048
1049 /* If there is destination address, print it. */
1050 if (connected->destination) {
1051 vty_out(vty,
1052 (CONNECTED_PEER(connected) ? " peer " : " broadcast "));
1053 prefix_vty_out(vty, connected->destination);
1054 if (CONNECTED_PEER(connected))
1055 vty_out(vty, "/%d", connected->destination->prefixlen);
1056 }
1057
1058 if (CHECK_FLAG(connected->flags, ZEBRA_IFA_SECONDARY))
1059 vty_out(vty, " secondary");
1060
1061 if (CHECK_FLAG(connected->flags, ZEBRA_IFA_UNNUMBERED))
1062 vty_out(vty, " unnumbered");
1063
1064 if (connected->label)
1065 vty_out(vty, " %s", connected->label);
1066
1067 vty_out(vty, "\n");
1068 }
1069
1070 /* Dump interface neighbor address information to vty. */
1071 static void nbr_connected_dump_vty(struct vty *vty,
1072 struct nbr_connected *connected)
1073 {
1074 struct prefix *p;
1075
1076 /* Print interface address. */
1077 p = connected->address;
1078 vty_out(vty, " %s ", prefix_family_str(p));
1079 prefix_vty_out(vty, p);
1080 vty_out(vty, "/%d", p->prefixlen);
1081
1082 vty_out(vty, "\n");
1083 }
1084
1085 static const char *zebra_ziftype_2str(zebra_iftype_t zif_type)
1086 {
1087 switch (zif_type) {
1088 case ZEBRA_IF_OTHER:
1089 return "Other";
1090 break;
1091
1092 case ZEBRA_IF_BRIDGE:
1093 return "Bridge";
1094 break;
1095
1096 case ZEBRA_IF_VLAN:
1097 return "Vlan";
1098 break;
1099
1100 case ZEBRA_IF_VXLAN:
1101 return "Vxlan";
1102 break;
1103
1104 case ZEBRA_IF_VRF:
1105 return "VRF";
1106 break;
1107
1108 default:
1109 return "Unknown";
1110 break;
1111 }
1112 }
1113
1114 /* Interface's information print out to vty interface. */
1115 static void if_dump_vty(struct vty *vty, struct interface *ifp)
1116 {
1117 struct connected *connected;
1118 struct nbr_connected *nbr_connected;
1119 struct listnode *node;
1120 struct route_node *rn;
1121 struct zebra_if *zebra_if;
1122 struct vrf *vrf;
1123
1124 zebra_if = ifp->info;
1125
1126 vty_out(vty, "Interface %s is ", ifp->name);
1127 if (if_is_up(ifp)) {
1128 vty_out(vty, "up, line protocol ");
1129
1130 if (CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_LINKDETECTION)) {
1131 if (if_is_running(ifp))
1132 vty_out(vty, "is up\n");
1133 else
1134 vty_out(vty, "is down\n");
1135 } else {
1136 vty_out(vty, "detection is disabled\n");
1137 }
1138 } else {
1139 vty_out(vty, "down\n");
1140 }
1141
1142 vty_out(vty, " Link ups: %5u last: %s\n", zebra_if->up_count,
1143 zebra_if->up_last[0] ? zebra_if->up_last : "(never)");
1144 vty_out(vty, " Link downs: %5u last: %s\n", zebra_if->down_count,
1145 zebra_if->down_last[0] ? zebra_if->down_last : "(never)");
1146
1147 zebra_ptm_show_status(vty, ifp);
1148
1149 vrf = vrf_lookup_by_id(ifp->vrf_id);
1150 vty_out(vty, " vrf: %s\n", vrf->name);
1151
1152 if (ifp->desc)
1153 vty_out(vty, " Description: %s\n", ifp->desc);
1154 if (ifp->ifindex == IFINDEX_INTERNAL) {
1155 vty_out(vty, " pseudo interface\n");
1156 return;
1157 } else if (!CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) {
1158 vty_out(vty, " index %d inactive interface\n", ifp->ifindex);
1159 return;
1160 }
1161
1162 vty_out(vty, " index %d metric %d mtu %d speed %u ", ifp->ifindex,
1163 ifp->metric, ifp->mtu, ifp->speed);
1164 if (ifp->mtu6 != ifp->mtu)
1165 vty_out(vty, "mtu6 %d ", ifp->mtu6);
1166 vty_out(vty, "\n flags: %s\n", if_flag_dump(ifp->flags));
1167
1168 /* Hardware address. */
1169 vty_out(vty, " Type: %s\n", if_link_type_str(ifp->ll_type));
1170 if (ifp->hw_addr_len != 0) {
1171 int i;
1172
1173 vty_out(vty, " HWaddr: ");
1174 for (i = 0; i < ifp->hw_addr_len; i++)
1175 vty_out(vty, "%s%02x", i == 0 ? "" : ":",
1176 ifp->hw_addr[i]);
1177 vty_out(vty, "\n");
1178 }
1179
1180 /* Bandwidth in Mbps */
1181 if (ifp->bandwidth != 0) {
1182 vty_out(vty, " bandwidth %u Mbps", ifp->bandwidth);
1183 vty_out(vty, "\n");
1184 }
1185
1186 for (rn = route_top(zebra_if->ipv4_subnets); rn; rn = route_next(rn)) {
1187 if (!rn->info)
1188 continue;
1189
1190 for (ALL_LIST_ELEMENTS_RO((struct list *)rn->info, node,
1191 connected))
1192 connected_dump_vty(vty, connected);
1193 }
1194
1195 for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) {
1196 if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL)
1197 && (connected->address->family == AF_INET6))
1198 connected_dump_vty(vty, connected);
1199 }
1200
1201 vty_out(vty, " Interface Type %s\n",
1202 zebra_ziftype_2str(zebra_if->zif_type));
1203 if (IS_ZEBRA_IF_BRIDGE(ifp)) {
1204 struct zebra_l2info_bridge *bridge_info;
1205
1206 bridge_info = &zebra_if->l2info.br;
1207 vty_out(vty, " Bridge VLAN-aware: %s\n",
1208 bridge_info->vlan_aware ? "yes" : "no");
1209 } else if (IS_ZEBRA_IF_VLAN(ifp)) {
1210 struct zebra_l2info_vlan *vlan_info;
1211
1212 vlan_info = &zebra_if->l2info.vl;
1213 vty_out(vty, " VLAN Id %u\n", vlan_info->vid);
1214 } else if (IS_ZEBRA_IF_VXLAN(ifp)) {
1215 struct zebra_l2info_vxlan *vxlan_info;
1216
1217 vxlan_info = &zebra_if->l2info.vxl;
1218 vty_out(vty, " VxLAN Id %u", vxlan_info->vni);
1219 if (vxlan_info->vtep_ip.s_addr != INADDR_ANY)
1220 vty_out(vty, " VTEP IP: %s",
1221 inet_ntoa(vxlan_info->vtep_ip));
1222 if (vxlan_info->access_vlan)
1223 vty_out(vty, " Access VLAN Id %u",
1224 vxlan_info->access_vlan);
1225 vty_out(vty, "\n");
1226 }
1227
1228 if (IS_ZEBRA_IF_BRIDGE_SLAVE(ifp)) {
1229 struct zebra_l2info_brslave *br_slave;
1230
1231 br_slave = &zebra_if->brslave_info;
1232 if (br_slave->bridge_ifindex != IFINDEX_INTERNAL)
1233 vty_out(vty, " Master (bridge) ifindex %u\n",
1234 br_slave->bridge_ifindex);
1235 }
1236
1237 if (zebra_if->link_ifindex != IFINDEX_INTERNAL) {
1238 vty_out(vty, " Link ifindex %u", zebra_if->link_ifindex);
1239 if (zebra_if->link)
1240 vty_out(vty, "(%s)\n", zebra_if->link->name);
1241 else
1242 vty_out(vty, "(Unknown)\n");
1243 }
1244
1245 if (HAS_LINK_PARAMS(ifp)) {
1246 int i;
1247 struct if_link_params *iflp = ifp->link_params;
1248 vty_out(vty, " Traffic Engineering Link Parameters:\n");
1249 if (IS_PARAM_SET(iflp, LP_TE_METRIC))
1250 vty_out(vty, " TE metric %u\n", iflp->te_metric);
1251 if (IS_PARAM_SET(iflp, LP_MAX_BW))
1252 vty_out(vty, " Maximum Bandwidth %g (Byte/s)\n",
1253 iflp->max_bw);
1254 if (IS_PARAM_SET(iflp, LP_MAX_RSV_BW))
1255 vty_out(vty,
1256 " Maximum Reservable Bandwidth %g (Byte/s)\n",
1257 iflp->max_rsv_bw);
1258 if (IS_PARAM_SET(iflp, LP_UNRSV_BW)) {
1259 vty_out(vty,
1260 " Unreserved Bandwidth per Class Type in Byte/s:\n");
1261 for (i = 0; i < MAX_CLASS_TYPE; i += 2)
1262 vty_out(vty,
1263 " [%d]: %g (Bytes/sec),\t[%d]: %g (Bytes/sec)\n",
1264 i, iflp->unrsv_bw[i], i + 1,
1265 iflp->unrsv_bw[i + 1]);
1266 }
1267
1268 if (IS_PARAM_SET(iflp, LP_ADM_GRP))
1269 vty_out(vty, " Administrative Group:%u\n",
1270 iflp->admin_grp);
1271 if (IS_PARAM_SET(iflp, LP_DELAY)) {
1272 vty_out(vty, " Link Delay Average: %u (micro-sec.)",
1273 iflp->av_delay);
1274 if (IS_PARAM_SET(iflp, LP_MM_DELAY)) {
1275 vty_out(vty, " Min: %u (micro-sec.)",
1276 iflp->min_delay);
1277 vty_out(vty, " Max: %u (micro-sec.)",
1278 iflp->max_delay);
1279 }
1280 vty_out(vty, "\n");
1281 }
1282 if (IS_PARAM_SET(iflp, LP_DELAY_VAR))
1283 vty_out(vty,
1284 " Link Delay Variation %u (micro-sec.)\n",
1285 iflp->delay_var);
1286 if (IS_PARAM_SET(iflp, LP_PKT_LOSS))
1287 vty_out(vty, " Link Packet Loss %g (in %%)\n",
1288 iflp->pkt_loss);
1289 if (IS_PARAM_SET(iflp, LP_AVA_BW))
1290 vty_out(vty, " Available Bandwidth %g (Byte/s)\n",
1291 iflp->ava_bw);
1292 if (IS_PARAM_SET(iflp, LP_RES_BW))
1293 vty_out(vty, " Residual Bandwidth %g (Byte/s)\n",
1294 iflp->res_bw);
1295 if (IS_PARAM_SET(iflp, LP_USE_BW))
1296 vty_out(vty, " Utilized Bandwidth %g (Byte/s)\n",
1297 iflp->use_bw);
1298 if (IS_PARAM_SET(iflp, LP_RMT_AS))
1299 vty_out(vty, " Neighbor ASBR IP: %s AS: %u \n",
1300 inet_ntoa(iflp->rmt_ip), iflp->rmt_as);
1301 }
1302
1303 hook_call(zebra_if_extra_info, vty, ifp);
1304
1305 if (listhead(ifp->nbr_connected))
1306 vty_out(vty, " Neighbor address(s):\n");
1307 for (ALL_LIST_ELEMENTS_RO(ifp->nbr_connected, node, nbr_connected))
1308 nbr_connected_dump_vty(vty, nbr_connected);
1309
1310 #ifdef HAVE_PROC_NET_DEV
1311 /* Statistics print out using proc file system. */
1312 vty_out(vty,
1313 " %lu input packets (%lu multicast), %lu bytes, "
1314 "%lu dropped\n",
1315 ifp->stats.rx_packets, ifp->stats.rx_multicast,
1316 ifp->stats.rx_bytes, ifp->stats.rx_dropped);
1317
1318 vty_out(vty,
1319 " %lu input errors, %lu length, %lu overrun,"
1320 " %lu CRC, %lu frame\n",
1321 ifp->stats.rx_errors, ifp->stats.rx_length_errors,
1322 ifp->stats.rx_over_errors, ifp->stats.rx_crc_errors,
1323 ifp->stats.rx_frame_errors);
1324
1325 vty_out(vty, " %lu fifo, %lu missed\n", ifp->stats.rx_fifo_errors,
1326 ifp->stats.rx_missed_errors);
1327
1328 vty_out(vty, " %lu output packets, %lu bytes, %lu dropped\n",
1329 ifp->stats.tx_packets, ifp->stats.tx_bytes,
1330 ifp->stats.tx_dropped);
1331
1332 vty_out(vty,
1333 " %lu output errors, %lu aborted, %lu carrier,"
1334 " %lu fifo, %lu heartbeat\n",
1335 ifp->stats.tx_errors, ifp->stats.tx_aborted_errors,
1336 ifp->stats.tx_carrier_errors, ifp->stats.tx_fifo_errors,
1337 ifp->stats.tx_heartbeat_errors);
1338
1339 vty_out(vty, " %lu window, %lu collisions\n",
1340 ifp->stats.tx_window_errors, ifp->stats.collisions);
1341 #endif /* HAVE_PROC_NET_DEV */
1342
1343 #ifdef HAVE_NET_RT_IFLIST
1344 #if defined(__bsdi__) || defined(__NetBSD__)
1345 /* Statistics print out using sysctl (). */
1346 vty_out(vty,
1347 " input packets %llu, bytes %llu, dropped %llu,"
1348 " multicast packets %llu\n",
1349 (unsigned long long)ifp->stats.ifi_ipackets,
1350 (unsigned long long)ifp->stats.ifi_ibytes,
1351 (unsigned long long)ifp->stats.ifi_iqdrops,
1352 (unsigned long long)ifp->stats.ifi_imcasts);
1353
1354 vty_out(vty, " input errors %llu\n",
1355 (unsigned long long)ifp->stats.ifi_ierrors);
1356
1357 vty_out(vty,
1358 " output packets %llu, bytes %llu,"
1359 " multicast packets %llu\n",
1360 (unsigned long long)ifp->stats.ifi_opackets,
1361 (unsigned long long)ifp->stats.ifi_obytes,
1362 (unsigned long long)ifp->stats.ifi_omcasts);
1363
1364 vty_out(vty, " output errors %llu\n",
1365 (unsigned long long)ifp->stats.ifi_oerrors);
1366
1367 vty_out(vty, " collisions %llu\n",
1368 (unsigned long long)ifp->stats.ifi_collisions);
1369 #else
1370 /* Statistics print out using sysctl (). */
1371 vty_out(vty,
1372 " input packets %lu, bytes %lu, dropped %lu,"
1373 " multicast packets %lu\n",
1374 ifp->stats.ifi_ipackets, ifp->stats.ifi_ibytes,
1375 ifp->stats.ifi_iqdrops, ifp->stats.ifi_imcasts);
1376
1377 vty_out(vty, " input errors %lu\n", ifp->stats.ifi_ierrors);
1378
1379 vty_out(vty,
1380 " output packets %lu, bytes %lu, multicast packets %lu\n",
1381 ifp->stats.ifi_opackets, ifp->stats.ifi_obytes,
1382 ifp->stats.ifi_omcasts);
1383
1384 vty_out(vty, " output errors %lu\n", ifp->stats.ifi_oerrors);
1385
1386 vty_out(vty, " collisions %lu\n", ifp->stats.ifi_collisions);
1387 #endif /* __bsdi__ || __NetBSD__ */
1388 #endif /* HAVE_NET_RT_IFLIST */
1389 }
1390
1391 static void interface_update_stats(void)
1392 {
1393 #ifdef HAVE_PROC_NET_DEV
1394 /* If system has interface statistics via proc file system, update
1395 statistics. */
1396 ifstat_update_proc();
1397 #endif /* HAVE_PROC_NET_DEV */
1398 #ifdef HAVE_NET_RT_IFLIST
1399 ifstat_update_sysctl();
1400 #endif /* HAVE_NET_RT_IFLIST */
1401 }
1402
1403 struct cmd_node interface_node = {INTERFACE_NODE, "%s(config-if)# ", 1};
1404
1405 /* Show all interfaces to vty. */
1406 DEFUN (show_interface,
1407 show_interface_cmd,
1408 "show interface [vrf NAME]",
1409 SHOW_STR
1410 "Interface status and configuration\n"
1411 VRF_CMD_HELP_STR)
1412 {
1413 struct vrf *vrf;
1414 struct interface *ifp;
1415 vrf_id_t vrf_id = VRF_DEFAULT;
1416
1417 interface_update_stats();
1418
1419 if (argc > 2)
1420 VRF_GET_ID(vrf_id, argv[3]->arg, false);
1421
1422 /* All interface print. */
1423 vrf = vrf_lookup_by_id(vrf_id);
1424 FOR_ALL_INTERFACES (vrf, ifp)
1425 if_dump_vty(vty, ifp);
1426
1427 return CMD_SUCCESS;
1428 }
1429
1430
1431 /* Show all interfaces to vty. */
1432 DEFUN (show_interface_vrf_all,
1433 show_interface_vrf_all_cmd,
1434 "show interface vrf all",
1435 SHOW_STR
1436 "Interface status and configuration\n"
1437 VRF_ALL_CMD_HELP_STR)
1438 {
1439 struct vrf *vrf;
1440 struct interface *ifp;
1441
1442 interface_update_stats();
1443
1444 /* All interface print. */
1445 RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
1446 FOR_ALL_INTERFACES (vrf, ifp)
1447 if_dump_vty(vty, ifp);
1448
1449 return CMD_SUCCESS;
1450 }
1451
1452 /* Show specified interface to vty. */
1453
1454 DEFUN (show_interface_name_vrf,
1455 show_interface_name_vrf_cmd,
1456 "show interface IFNAME vrf NAME",
1457 SHOW_STR
1458 "Interface status and configuration\n"
1459 "Interface name\n"
1460 VRF_CMD_HELP_STR)
1461 {
1462 int idx_ifname = 2;
1463 int idx_name = 4;
1464 struct interface *ifp;
1465 vrf_id_t vrf_id;
1466
1467 interface_update_stats();
1468
1469 VRF_GET_ID(vrf_id, argv[idx_name]->arg, false);
1470
1471 /* Specified interface print. */
1472 ifp = if_lookup_by_name(argv[idx_ifname]->arg, vrf_id);
1473 if (ifp == NULL) {
1474 vty_out(vty, "%% Can't find interface %s\n",
1475 argv[idx_ifname]->arg);
1476 return CMD_WARNING;
1477 }
1478 if_dump_vty(vty, ifp);
1479
1480 return CMD_SUCCESS;
1481 }
1482
1483 /* Show specified interface to vty. */
1484 DEFUN (show_interface_name_vrf_all,
1485 show_interface_name_vrf_all_cmd,
1486 "show interface IFNAME [vrf all]",
1487 SHOW_STR
1488 "Interface status and configuration\n"
1489 "Interface name\n"
1490 VRF_ALL_CMD_HELP_STR)
1491 {
1492 int idx_ifname = 2;
1493 struct vrf *vrf;
1494 struct interface *ifp;
1495 int found = 0;
1496
1497 interface_update_stats();
1498
1499 /* All interface print. */
1500 RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
1501 /* Specified interface print. */
1502 ifp = if_lookup_by_name(argv[idx_ifname]->arg, vrf->vrf_id);
1503 if (ifp) {
1504 if_dump_vty(vty, ifp);
1505 found++;
1506 }
1507 }
1508
1509 if (!found) {
1510 vty_out(vty, "%% Can't find interface %s\n",
1511 argv[idx_ifname]->arg);
1512 return CMD_WARNING;
1513 }
1514
1515 return CMD_SUCCESS;
1516 }
1517
1518
1519 static void if_show_description(struct vty *vty, vrf_id_t vrf_id)
1520 {
1521 struct vrf *vrf = vrf_lookup_by_id(vrf_id);
1522 struct interface *ifp;
1523
1524 vty_out(vty, "Interface Status Protocol Description\n");
1525 FOR_ALL_INTERFACES (vrf, ifp) {
1526 int len;
1527
1528 len = vty_out(vty, "%s", ifp->name);
1529 vty_out(vty, "%*s", (16 - len), " ");
1530
1531 if (if_is_up(ifp)) {
1532 vty_out(vty, "up ");
1533 if (CHECK_FLAG(ifp->status,
1534 ZEBRA_INTERFACE_LINKDETECTION)) {
1535 if (if_is_running(ifp))
1536 vty_out(vty, "up ");
1537 else
1538 vty_out(vty, "down ");
1539 } else {
1540 vty_out(vty, "unknown ");
1541 }
1542 } else {
1543 vty_out(vty, "down down ");
1544 }
1545
1546 if (ifp->desc)
1547 vty_out(vty, "%s", ifp->desc);
1548 vty_out(vty, "\n");
1549 }
1550 }
1551
1552 DEFUN (show_interface_desc,
1553 show_interface_desc_cmd,
1554 "show interface description [vrf NAME]",
1555 SHOW_STR
1556 "Interface status and configuration\n"
1557 "Interface description\n"
1558 VRF_CMD_HELP_STR)
1559 {
1560 vrf_id_t vrf_id = VRF_DEFAULT;
1561
1562 if (argc > 3)
1563 VRF_GET_ID(vrf_id, argv[4]->arg, false);
1564
1565 if_show_description(vty, vrf_id);
1566
1567 return CMD_SUCCESS;
1568 }
1569
1570
1571 DEFUN (show_interface_desc_vrf_all,
1572 show_interface_desc_vrf_all_cmd,
1573 "show interface description vrf all",
1574 SHOW_STR
1575 "Interface status and configuration\n"
1576 "Interface description\n"
1577 VRF_ALL_CMD_HELP_STR)
1578 {
1579 struct vrf *vrf;
1580
1581 RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
1582 if (!RB_EMPTY(if_name_head, &vrf->ifaces_by_name)) {
1583 vty_out(vty, "\n\tVRF %u\n\n", vrf->vrf_id);
1584 if_show_description(vty, vrf->vrf_id);
1585 }
1586
1587 return CMD_SUCCESS;
1588 }
1589
1590 DEFUN (multicast,
1591 multicast_cmd,
1592 "multicast",
1593 "Set multicast flag to interface\n")
1594 {
1595 VTY_DECLVAR_CONTEXT(interface, ifp);
1596 int ret;
1597 struct zebra_if *if_data;
1598
1599 if (CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) {
1600 ret = if_set_flags(ifp, IFF_MULTICAST);
1601 if (ret < 0) {
1602 vty_out(vty, "Can't set multicast flag\n");
1603 return CMD_WARNING_CONFIG_FAILED;
1604 }
1605 if_refresh(ifp);
1606 }
1607 if_data = ifp->info;
1608 if_data->multicast = IF_ZEBRA_MULTICAST_ON;
1609
1610 return CMD_SUCCESS;
1611 }
1612
1613 DEFUN (no_multicast,
1614 no_multicast_cmd,
1615 "no multicast",
1616 NO_STR
1617 "Unset multicast flag to interface\n")
1618 {
1619 VTY_DECLVAR_CONTEXT(interface, ifp);
1620 int ret;
1621 struct zebra_if *if_data;
1622
1623 if (CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) {
1624 ret = if_unset_flags(ifp, IFF_MULTICAST);
1625 if (ret < 0) {
1626 vty_out(vty, "Can't unset multicast flag\n");
1627 return CMD_WARNING_CONFIG_FAILED;
1628 }
1629 if_refresh(ifp);
1630 }
1631 if_data = ifp->info;
1632 if_data->multicast = IF_ZEBRA_MULTICAST_OFF;
1633
1634 return CMD_SUCCESS;
1635 }
1636
1637 DEFUN (linkdetect,
1638 linkdetect_cmd,
1639 "link-detect",
1640 "Enable link detection on interface\n")
1641 {
1642 VTY_DECLVAR_CONTEXT(interface, ifp);
1643 int if_was_operative;
1644
1645 if_was_operative = if_is_no_ptm_operative(ifp);
1646 SET_FLAG(ifp->status, ZEBRA_INTERFACE_LINKDETECTION);
1647
1648 /* When linkdetection is enabled, if might come down */
1649 if (!if_is_no_ptm_operative(ifp) && if_was_operative)
1650 if_down(ifp);
1651
1652 /* FIXME: Will defer status change forwarding if interface
1653 does not come down! */
1654
1655 return CMD_SUCCESS;
1656 }
1657
1658
1659 DEFUN (no_linkdetect,
1660 no_linkdetect_cmd,
1661 "no link-detect",
1662 NO_STR
1663 "Disable link detection on interface\n")
1664 {
1665 VTY_DECLVAR_CONTEXT(interface, ifp);
1666 int if_was_operative;
1667
1668 if_was_operative = if_is_no_ptm_operative(ifp);
1669 UNSET_FLAG(ifp->status, ZEBRA_INTERFACE_LINKDETECTION);
1670
1671 /* Interface may come up after disabling link detection */
1672 if (if_is_operative(ifp) && !if_was_operative)
1673 if_up(ifp);
1674
1675 /* FIXME: see linkdetect_cmd */
1676
1677 return CMD_SUCCESS;
1678 }
1679
1680 DEFUN (shutdown_if,
1681 shutdown_if_cmd,
1682 "shutdown",
1683 "Shutdown the selected interface\n")
1684 {
1685 VTY_DECLVAR_CONTEXT(interface, ifp);
1686 int ret;
1687 struct zebra_if *if_data;
1688
1689 if (ifp->ifindex != IFINDEX_INTERNAL) {
1690 ret = if_unset_flags(ifp, IFF_UP);
1691 if (ret < 0) {
1692 vty_out(vty, "Can't shutdown interface\n");
1693 return CMD_WARNING_CONFIG_FAILED;
1694 }
1695 if_refresh(ifp);
1696 }
1697 if_data = ifp->info;
1698 if_data->shutdown = IF_ZEBRA_SHUTDOWN_ON;
1699
1700 return CMD_SUCCESS;
1701 }
1702
1703 DEFUN (no_shutdown_if,
1704 no_shutdown_if_cmd,
1705 "no shutdown",
1706 NO_STR
1707 "Shutdown the selected interface\n")
1708 {
1709 VTY_DECLVAR_CONTEXT(interface, ifp);
1710 int ret;
1711 struct zebra_if *if_data;
1712
1713 if (ifp->ifindex != IFINDEX_INTERNAL) {
1714 ret = if_set_flags(ifp, IFF_UP | IFF_RUNNING);
1715 if (ret < 0) {
1716 vty_out(vty, "Can't up interface\n");
1717 return CMD_WARNING_CONFIG_FAILED;
1718 }
1719 if_refresh(ifp);
1720
1721 /* Some addresses (in particular, IPv6 addresses on Linux) get
1722 * removed when the interface goes down. They need to be
1723 * readded.
1724 */
1725 if_addr_wakeup(ifp);
1726 }
1727
1728 if_data = ifp->info;
1729 if_data->shutdown = IF_ZEBRA_SHUTDOWN_OFF;
1730
1731 return CMD_SUCCESS;
1732 }
1733
1734 DEFUN (bandwidth_if,
1735 bandwidth_if_cmd,
1736 "bandwidth (1-100000)",
1737 "Set bandwidth informational parameter\n"
1738 "Bandwidth in megabits\n")
1739 {
1740 int idx_number = 1;
1741 VTY_DECLVAR_CONTEXT(interface, ifp);
1742 unsigned int bandwidth;
1743
1744 bandwidth = strtol(argv[idx_number]->arg, NULL, 10);
1745
1746 /* bandwidth range is <1-100000> */
1747 if (bandwidth < 1 || bandwidth > 100000) {
1748 vty_out(vty, "Bandwidth is invalid\n");
1749 return CMD_WARNING_CONFIG_FAILED;
1750 }
1751
1752 ifp->bandwidth = bandwidth;
1753
1754 /* force protocols to recalculate routes due to cost change */
1755 if (if_is_operative(ifp))
1756 zebra_interface_up_update(ifp);
1757
1758 return CMD_SUCCESS;
1759 }
1760
1761 DEFUN (no_bandwidth_if,
1762 no_bandwidth_if_cmd,
1763 "no bandwidth [(1-100000)]",
1764 NO_STR
1765 "Set bandwidth informational parameter\n"
1766 "Bandwidth in megabits\n")
1767 {
1768 VTY_DECLVAR_CONTEXT(interface, ifp);
1769
1770 ifp->bandwidth = 0;
1771
1772 /* force protocols to recalculate routes due to cost change */
1773 if (if_is_operative(ifp))
1774 zebra_interface_up_update(ifp);
1775
1776 return CMD_SUCCESS;
1777 }
1778
1779
1780 struct cmd_node link_params_node = {
1781 LINK_PARAMS_NODE, "%s(config-link-params)# ", 1,
1782 };
1783
1784 static void link_param_cmd_set_uint32(struct interface *ifp, uint32_t *field,
1785 uint32_t type, uint32_t value)
1786 {
1787 /* Update field as needed */
1788 if (IS_PARAM_UNSET(ifp->link_params, type) || *field != value) {
1789 *field = value;
1790 SET_PARAM(ifp->link_params, type);
1791
1792 /* force protocols to update LINK STATE due to parameters change
1793 */
1794 if (if_is_operative(ifp))
1795 zebra_interface_parameters_update(ifp);
1796 }
1797 }
1798 static void link_param_cmd_set_float(struct interface *ifp, float *field,
1799 uint32_t type, float value)
1800 {
1801
1802 /* Update field as needed */
1803 if (IS_PARAM_UNSET(ifp->link_params, type) || *field != value) {
1804 *field = value;
1805 SET_PARAM(ifp->link_params, type);
1806
1807 /* force protocols to update LINK STATE due to parameters change
1808 */
1809 if (if_is_operative(ifp))
1810 zebra_interface_parameters_update(ifp);
1811 }
1812 }
1813
1814 static void link_param_cmd_unset(struct interface *ifp, uint32_t type)
1815 {
1816 if (ifp->link_params == NULL)
1817 return;
1818
1819 /* Unset field */
1820 UNSET_PARAM(ifp->link_params, type);
1821
1822 /* force protocols to update LINK STATE due to parameters change */
1823 if (if_is_operative(ifp))
1824 zebra_interface_parameters_update(ifp);
1825 }
1826
1827 DEFUN_NOSH (link_params,
1828 link_params_cmd,
1829 "link-params",
1830 LINK_PARAMS_STR)
1831 {
1832 /* vty->qobj_index stays the same @ interface pointer */
1833 vty->node = LINK_PARAMS_NODE;
1834
1835 return CMD_SUCCESS;
1836 }
1837
1838 DEFUN_NOSH (exit_link_params,
1839 exit_link_params_cmd,
1840 "exit-link-params",
1841 "Exit from Link Params configuration mode\n")
1842 {
1843 if (vty->node == LINK_PARAMS_NODE)
1844 vty->node = INTERFACE_NODE;
1845 return CMD_SUCCESS;
1846 }
1847
1848 /* Specific Traffic Engineering parameters commands */
1849 DEFUN (link_params_enable,
1850 link_params_enable_cmd,
1851 "enable",
1852 "Activate link parameters on this interface\n")
1853 {
1854 VTY_DECLVAR_CONTEXT(interface, ifp);
1855
1856 /* This command could be issue at startup, when activate MPLS TE */
1857 /* on a new interface or after a ON / OFF / ON toggle */
1858 /* In all case, TE parameters are reset to their default factory */
1859 if (IS_ZEBRA_DEBUG_EVENT)
1860 zlog_debug(
1861 "Link-params: enable TE link parameters on interface %s",
1862 ifp->name);
1863
1864 if (!if_link_params_get(ifp)) {
1865 if (IS_ZEBRA_DEBUG_EVENT)
1866 zlog_debug(
1867 "Link-params: failed to init TE link parameters %s",
1868 ifp->name);
1869
1870 return CMD_WARNING_CONFIG_FAILED;
1871 }
1872
1873 /* force protocols to update LINK STATE due to parameters change */
1874 if (if_is_operative(ifp))
1875 zebra_interface_parameters_update(ifp);
1876
1877 return CMD_SUCCESS;
1878 }
1879
1880 DEFUN (no_link_params_enable,
1881 no_link_params_enable_cmd,
1882 "no enable",
1883 NO_STR
1884 "Disable link parameters on this interface\n")
1885 {
1886 VTY_DECLVAR_CONTEXT(interface, ifp);
1887
1888 zlog_debug("MPLS-TE: disable TE link parameters on interface %s",
1889 ifp->name);
1890
1891 if_link_params_free(ifp);
1892
1893 /* force protocols to update LINK STATE due to parameters change */
1894 if (if_is_operative(ifp))
1895 zebra_interface_parameters_update(ifp);
1896
1897 return CMD_SUCCESS;
1898 }
1899
1900 /* STANDARD TE metrics */
1901 DEFUN (link_params_metric,
1902 link_params_metric_cmd,
1903 "metric (0-4294967295)",
1904 "Link metric for MPLS-TE purpose\n"
1905 "Metric value in decimal\n")
1906 {
1907 int idx_number = 1;
1908 VTY_DECLVAR_CONTEXT(interface, ifp);
1909 struct if_link_params *iflp = if_link_params_get(ifp);
1910 uint32_t metric;
1911
1912 metric = strtoul(argv[idx_number]->arg, NULL, 10);
1913
1914 /* Update TE metric if needed */
1915 link_param_cmd_set_uint32(ifp, &iflp->te_metric, LP_TE_METRIC, metric);
1916
1917 return CMD_SUCCESS;
1918 }
1919
1920 DEFUN (no_link_params_metric,
1921 no_link_params_metric_cmd,
1922 "no metric",
1923 NO_STR
1924 "Disable Link Metric on this interface\n")
1925 {
1926 VTY_DECLVAR_CONTEXT(interface, ifp);
1927
1928 /* Unset TE Metric */
1929 link_param_cmd_unset(ifp, LP_TE_METRIC);
1930
1931 return CMD_SUCCESS;
1932 }
1933
1934 DEFUN (link_params_maxbw,
1935 link_params_maxbw_cmd,
1936 "max-bw BANDWIDTH",
1937 "Maximum bandwidth that can be used\n"
1938 "Bytes/second (IEEE floating point format)\n")
1939 {
1940 int idx_bandwidth = 1;
1941 VTY_DECLVAR_CONTEXT(interface, ifp);
1942 struct if_link_params *iflp = if_link_params_get(ifp);
1943
1944 float bw;
1945
1946 if (sscanf(argv[idx_bandwidth]->arg, "%g", &bw) != 1) {
1947 vty_out(vty, "link_params_maxbw: fscanf: %s\n",
1948 safe_strerror(errno));
1949 return CMD_WARNING_CONFIG_FAILED;
1950 }
1951
1952 /* Check that Maximum bandwidth is not lower than other bandwidth
1953 * parameters */
1954 if ((bw <= iflp->max_rsv_bw) || (bw <= iflp->unrsv_bw[0])
1955 || (bw <= iflp->unrsv_bw[1]) || (bw <= iflp->unrsv_bw[2])
1956 || (bw <= iflp->unrsv_bw[3]) || (bw <= iflp->unrsv_bw[4])
1957 || (bw <= iflp->unrsv_bw[5]) || (bw <= iflp->unrsv_bw[6])
1958 || (bw <= iflp->unrsv_bw[7]) || (bw <= iflp->ava_bw)
1959 || (bw <= iflp->res_bw) || (bw <= iflp->use_bw)) {
1960 vty_out(vty,
1961 "Maximum Bandwidth could not be lower than others bandwidth\n");
1962 return CMD_WARNING_CONFIG_FAILED;
1963 }
1964
1965 /* Update Maximum Bandwidth if needed */
1966 link_param_cmd_set_float(ifp, &iflp->max_bw, LP_MAX_BW, bw);
1967
1968 return CMD_SUCCESS;
1969 }
1970
1971 DEFUN (link_params_max_rsv_bw,
1972 link_params_max_rsv_bw_cmd,
1973 "max-rsv-bw BANDWIDTH",
1974 "Maximum bandwidth that may be reserved\n"
1975 "Bytes/second (IEEE floating point format)\n")
1976 {
1977 int idx_bandwidth = 1;
1978 VTY_DECLVAR_CONTEXT(interface, ifp);
1979 struct if_link_params *iflp = if_link_params_get(ifp);
1980 float bw;
1981
1982 if (sscanf(argv[idx_bandwidth]->arg, "%g", &bw) != 1) {
1983 vty_out(vty, "link_params_max_rsv_bw: fscanf: %s\n",
1984 safe_strerror(errno));
1985 return CMD_WARNING_CONFIG_FAILED;
1986 }
1987
1988 /* Check that bandwidth is not greater than maximum bandwidth parameter
1989 */
1990 if (bw > iflp->max_bw) {
1991 vty_out(vty,
1992 "Maximum Reservable Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
1993 iflp->max_bw);
1994 return CMD_WARNING_CONFIG_FAILED;
1995 }
1996
1997 /* Update Maximum Reservable Bandwidth if needed */
1998 link_param_cmd_set_float(ifp, &iflp->max_rsv_bw, LP_MAX_RSV_BW, bw);
1999
2000 return CMD_SUCCESS;
2001 }
2002
2003 DEFUN (link_params_unrsv_bw,
2004 link_params_unrsv_bw_cmd,
2005 "unrsv-bw (0-7) BANDWIDTH",
2006 "Unreserved bandwidth at each priority level\n"
2007 "Priority\n"
2008 "Bytes/second (IEEE floating point format)\n")
2009 {
2010 int idx_number = 1;
2011 int idx_bandwidth = 2;
2012 VTY_DECLVAR_CONTEXT(interface, ifp);
2013 struct if_link_params *iflp = if_link_params_get(ifp);
2014 int priority;
2015 float bw;
2016
2017 /* We don't have to consider about range check here. */
2018 if (sscanf(argv[idx_number]->arg, "%d", &priority) != 1) {
2019 vty_out(vty, "link_params_unrsv_bw: fscanf: %s\n",
2020 safe_strerror(errno));
2021 return CMD_WARNING_CONFIG_FAILED;
2022 }
2023
2024 if (sscanf(argv[idx_bandwidth]->arg, "%g", &bw) != 1) {
2025 vty_out(vty, "link_params_unrsv_bw: fscanf: %s\n",
2026 safe_strerror(errno));
2027 return CMD_WARNING_CONFIG_FAILED;
2028 }
2029
2030 /* Check that bandwidth is not greater than maximum bandwidth parameter
2031 */
2032 if (bw > iflp->max_bw) {
2033 vty_out(vty,
2034 "UnReserved Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2035 iflp->max_bw);
2036 return CMD_WARNING_CONFIG_FAILED;
2037 }
2038
2039 /* Update Unreserved Bandwidth if needed */
2040 link_param_cmd_set_float(ifp, &iflp->unrsv_bw[priority], LP_UNRSV_BW,
2041 bw);
2042
2043 return CMD_SUCCESS;
2044 }
2045
2046 DEFUN (link_params_admin_grp,
2047 link_params_admin_grp_cmd,
2048 "admin-grp BITPATTERN",
2049 "Administrative group membership\n"
2050 "32-bit Hexadecimal value (e.g. 0xa1)\n")
2051 {
2052 int idx_bitpattern = 1;
2053 VTY_DECLVAR_CONTEXT(interface, ifp);
2054 struct if_link_params *iflp = if_link_params_get(ifp);
2055 unsigned long value;
2056
2057 if (sscanf(argv[idx_bitpattern]->arg, "0x%lx", &value) != 1) {
2058 vty_out(vty, "link_params_admin_grp: fscanf: %s\n",
2059 safe_strerror(errno));
2060 return CMD_WARNING_CONFIG_FAILED;
2061 }
2062
2063 /* Update Administrative Group if needed */
2064 link_param_cmd_set_uint32(ifp, &iflp->admin_grp, LP_ADM_GRP, value);
2065
2066 return CMD_SUCCESS;
2067 }
2068
2069 DEFUN (no_link_params_admin_grp,
2070 no_link_params_admin_grp_cmd,
2071 "no admin-grp",
2072 NO_STR
2073 "Disable Administrative group membership on this interface\n")
2074 {
2075 VTY_DECLVAR_CONTEXT(interface, ifp);
2076
2077 /* Unset Admin Group */
2078 link_param_cmd_unset(ifp, LP_ADM_GRP);
2079
2080 return CMD_SUCCESS;
2081 }
2082
2083 /* RFC5392 & RFC5316: INTER-AS */
2084 DEFUN (link_params_inter_as,
2085 link_params_inter_as_cmd,
2086 "neighbor A.B.C.D as (1-4294967295)",
2087 "Configure remote ASBR information (Neighbor IP address and AS number)\n"
2088 "Remote IP address in dot decimal A.B.C.D\n"
2089 "Remote AS number\n"
2090 "AS number in the range <1-4294967295>\n")
2091 {
2092 int idx_ipv4 = 1;
2093 int idx_number = 3;
2094
2095 VTY_DECLVAR_CONTEXT(interface, ifp);
2096 struct if_link_params *iflp = if_link_params_get(ifp);
2097 struct in_addr addr;
2098 uint32_t as;
2099
2100 if (!inet_aton(argv[idx_ipv4]->arg, &addr)) {
2101 vty_out(vty, "Please specify Router-Addr by A.B.C.D\n");
2102 return CMD_WARNING_CONFIG_FAILED;
2103 }
2104
2105 as = strtoul(argv[idx_number]->arg, NULL, 10);
2106
2107 /* Update Remote IP and Remote AS fields if needed */
2108 if (IS_PARAM_UNSET(iflp, LP_RMT_AS) || iflp->rmt_as != as
2109 || iflp->rmt_ip.s_addr != addr.s_addr) {
2110
2111 iflp->rmt_as = as;
2112 iflp->rmt_ip.s_addr = addr.s_addr;
2113 SET_PARAM(iflp, LP_RMT_AS);
2114
2115 /* force protocols to update LINK STATE due to parameters change
2116 */
2117 if (if_is_operative(ifp))
2118 zebra_interface_parameters_update(ifp);
2119 }
2120 return CMD_SUCCESS;
2121 }
2122
2123 DEFUN (no_link_params_inter_as,
2124 no_link_params_inter_as_cmd,
2125 "no neighbor",
2126 NO_STR
2127 "Remove Neighbor IP address and AS number for Inter-AS TE\n")
2128 {
2129 VTY_DECLVAR_CONTEXT(interface, ifp);
2130 struct if_link_params *iflp = if_link_params_get(ifp);
2131
2132 /* Reset Remote IP and AS neighbor */
2133 iflp->rmt_as = 0;
2134 iflp->rmt_ip.s_addr = 0;
2135 UNSET_PARAM(iflp, LP_RMT_AS);
2136
2137 /* force protocols to update LINK STATE due to parameters change */
2138 if (if_is_operative(ifp))
2139 zebra_interface_parameters_update(ifp);
2140
2141 return CMD_SUCCESS;
2142 }
2143
2144 /* RFC7471: OSPF Traffic Engineering (TE) Metric extensions &
2145 * draft-ietf-isis-metric-extensions-07.txt */
2146 DEFUN (link_params_delay,
2147 link_params_delay_cmd,
2148 "delay (0-16777215) [min (0-16777215) max (0-16777215)]",
2149 "Unidirectional Average Link Delay\n"
2150 "Average delay in micro-second as decimal (0...16777215)\n"
2151 "Minimum delay\n"
2152 "Minimum delay in micro-second as decimal (0...16777215)\n"
2153 "Maximum delay\n"
2154 "Maximum delay in micro-second as decimal (0...16777215)\n")
2155 {
2156 /* Get and Check new delay values */
2157 uint32_t delay = 0, low = 0, high = 0;
2158 delay = strtoul(argv[1]->arg, NULL, 10);
2159 if (argc == 6) {
2160 low = strtoul(argv[3]->arg, NULL, 10);
2161 high = strtoul(argv[5]->arg, NULL, 10);
2162 }
2163
2164 VTY_DECLVAR_CONTEXT(interface, ifp);
2165 struct if_link_params *iflp = if_link_params_get(ifp);
2166 uint8_t update = 0;
2167
2168 if (argc == 2) {
2169 /* Check new delay value against old Min and Max delays if set
2170 */
2171 if (IS_PARAM_SET(iflp, LP_MM_DELAY)
2172 && (delay <= iflp->min_delay || delay >= iflp->max_delay)) {
2173 vty_out(vty,
2174 "Average delay should be comprise between Min (%d) and Max (%d) delay\n",
2175 iflp->min_delay, iflp->max_delay);
2176 return CMD_WARNING_CONFIG_FAILED;
2177 }
2178 /* Update delay if value is not set or change */
2179 if (IS_PARAM_UNSET(iflp, LP_DELAY) || iflp->av_delay != delay) {
2180 iflp->av_delay = delay;
2181 SET_PARAM(iflp, LP_DELAY);
2182 update = 1;
2183 }
2184 /* Unset Min and Max delays if already set */
2185 if (IS_PARAM_SET(iflp, LP_MM_DELAY)) {
2186 iflp->min_delay = 0;
2187 iflp->max_delay = 0;
2188 UNSET_PARAM(iflp, LP_MM_DELAY);
2189 update = 1;
2190 }
2191 } else {
2192 /* Check new delays value coherency */
2193 if (delay <= low || delay >= high) {
2194 vty_out(vty,
2195 "Average delay should be comprise between Min (%d) and Max (%d) delay\n",
2196 low, high);
2197 return CMD_WARNING_CONFIG_FAILED;
2198 }
2199 /* Update Delays if needed */
2200 if (IS_PARAM_UNSET(iflp, LP_DELAY)
2201 || IS_PARAM_UNSET(iflp, LP_MM_DELAY)
2202 || iflp->av_delay != delay || iflp->min_delay != low
2203 || iflp->max_delay != high) {
2204 iflp->av_delay = delay;
2205 SET_PARAM(iflp, LP_DELAY);
2206 iflp->min_delay = low;
2207 iflp->max_delay = high;
2208 SET_PARAM(iflp, LP_MM_DELAY);
2209 update = 1;
2210 }
2211 }
2212
2213 /* force protocols to update LINK STATE due to parameters change */
2214 if (update == 1 && if_is_operative(ifp))
2215 zebra_interface_parameters_update(ifp);
2216
2217 return CMD_SUCCESS;
2218 }
2219
2220 DEFUN (no_link_params_delay,
2221 no_link_params_delay_cmd,
2222 "no delay",
2223 NO_STR
2224 "Disable Unidirectional Average, Min & Max Link Delay on this interface\n")
2225 {
2226 VTY_DECLVAR_CONTEXT(interface, ifp);
2227 struct if_link_params *iflp = if_link_params_get(ifp);
2228
2229 /* Unset Delays */
2230 iflp->av_delay = 0;
2231 UNSET_PARAM(iflp, LP_DELAY);
2232 iflp->min_delay = 0;
2233 iflp->max_delay = 0;
2234 UNSET_PARAM(iflp, LP_MM_DELAY);
2235
2236 /* force protocols to update LINK STATE due to parameters change */
2237 if (if_is_operative(ifp))
2238 zebra_interface_parameters_update(ifp);
2239
2240 return CMD_SUCCESS;
2241 }
2242
2243 DEFUN (link_params_delay_var,
2244 link_params_delay_var_cmd,
2245 "delay-variation (0-16777215)",
2246 "Unidirectional Link Delay Variation\n"
2247 "delay variation in micro-second as decimal (0...16777215)\n")
2248 {
2249 int idx_number = 1;
2250 VTY_DECLVAR_CONTEXT(interface, ifp);
2251 struct if_link_params *iflp = if_link_params_get(ifp);
2252 uint32_t value;
2253
2254 value = strtoul(argv[idx_number]->arg, NULL, 10);
2255
2256 /* Update Delay Variation if needed */
2257 link_param_cmd_set_uint32(ifp, &iflp->delay_var, LP_DELAY_VAR, value);
2258
2259 return CMD_SUCCESS;
2260 }
2261
2262 DEFUN (no_link_params_delay_var,
2263 no_link_params_delay_var_cmd,
2264 "no delay-variation",
2265 NO_STR
2266 "Disable Unidirectional Delay Variation on this interface\n")
2267 {
2268 VTY_DECLVAR_CONTEXT(interface, ifp);
2269
2270 /* Unset Delay Variation */
2271 link_param_cmd_unset(ifp, LP_DELAY_VAR);
2272
2273 return CMD_SUCCESS;
2274 }
2275
2276 DEFUN (link_params_pkt_loss,
2277 link_params_pkt_loss_cmd,
2278 "packet-loss PERCENTAGE",
2279 "Unidirectional Link Packet Loss\n"
2280 "percentage of total traffic by 0.000003% step and less than 50.331642%\n")
2281 {
2282 int idx_percentage = 1;
2283 VTY_DECLVAR_CONTEXT(interface, ifp);
2284 struct if_link_params *iflp = if_link_params_get(ifp);
2285 float fval;
2286
2287 if (sscanf(argv[idx_percentage]->arg, "%g", &fval) != 1) {
2288 vty_out(vty, "link_params_pkt_loss: fscanf: %s\n",
2289 safe_strerror(errno));
2290 return CMD_WARNING_CONFIG_FAILED;
2291 }
2292
2293 if (fval > MAX_PKT_LOSS)
2294 fval = MAX_PKT_LOSS;
2295
2296 /* Update Packet Loss if needed */
2297 link_param_cmd_set_float(ifp, &iflp->pkt_loss, LP_PKT_LOSS, fval);
2298
2299 return CMD_SUCCESS;
2300 }
2301
2302 DEFUN (no_link_params_pkt_loss,
2303 no_link_params_pkt_loss_cmd,
2304 "no packet-loss",
2305 NO_STR
2306 "Disable Unidirectional Link Packet Loss on this interface\n")
2307 {
2308 VTY_DECLVAR_CONTEXT(interface, ifp);
2309
2310 /* Unset Packet Loss */
2311 link_param_cmd_unset(ifp, LP_PKT_LOSS);
2312
2313 return CMD_SUCCESS;
2314 }
2315
2316 DEFUN (link_params_res_bw,
2317 link_params_res_bw_cmd,
2318 "res-bw BANDWIDTH",
2319 "Unidirectional Residual Bandwidth\n"
2320 "Bytes/second (IEEE floating point format)\n")
2321 {
2322 int idx_bandwidth = 1;
2323 VTY_DECLVAR_CONTEXT(interface, ifp);
2324 struct if_link_params *iflp = if_link_params_get(ifp);
2325 float bw;
2326
2327 if (sscanf(argv[idx_bandwidth]->arg, "%g", &bw) != 1) {
2328 vty_out(vty, "link_params_res_bw: fscanf: %s\n",
2329 safe_strerror(errno));
2330 return CMD_WARNING_CONFIG_FAILED;
2331 }
2332
2333 /* Check that bandwidth is not greater than maximum bandwidth parameter
2334 */
2335 if (bw > iflp->max_bw) {
2336 vty_out(vty,
2337 "Residual Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2338 iflp->max_bw);
2339 return CMD_WARNING_CONFIG_FAILED;
2340 }
2341
2342 /* Update Residual Bandwidth if needed */
2343 link_param_cmd_set_float(ifp, &iflp->res_bw, LP_RES_BW, bw);
2344
2345 return CMD_SUCCESS;
2346 }
2347
2348 DEFUN (no_link_params_res_bw,
2349 no_link_params_res_bw_cmd,
2350 "no res-bw",
2351 NO_STR
2352 "Disable Unidirectional Residual Bandwidth on this interface\n")
2353 {
2354 VTY_DECLVAR_CONTEXT(interface, ifp);
2355
2356 /* Unset Residual Bandwidth */
2357 link_param_cmd_unset(ifp, LP_RES_BW);
2358
2359 return CMD_SUCCESS;
2360 }
2361
2362 DEFUN (link_params_ava_bw,
2363 link_params_ava_bw_cmd,
2364 "ava-bw BANDWIDTH",
2365 "Unidirectional Available Bandwidth\n"
2366 "Bytes/second (IEEE floating point format)\n")
2367 {
2368 int idx_bandwidth = 1;
2369 VTY_DECLVAR_CONTEXT(interface, ifp);
2370 struct if_link_params *iflp = if_link_params_get(ifp);
2371 float bw;
2372
2373 if (sscanf(argv[idx_bandwidth]->arg, "%g", &bw) != 1) {
2374 vty_out(vty, "link_params_ava_bw: fscanf: %s\n",
2375 safe_strerror(errno));
2376 return CMD_WARNING_CONFIG_FAILED;
2377 }
2378
2379 /* Check that bandwidth is not greater than maximum bandwidth parameter
2380 */
2381 if (bw > iflp->max_bw) {
2382 vty_out(vty,
2383 "Available Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2384 iflp->max_bw);
2385 return CMD_WARNING_CONFIG_FAILED;
2386 }
2387
2388 /* Update Residual Bandwidth if needed */
2389 link_param_cmd_set_float(ifp, &iflp->ava_bw, LP_AVA_BW, bw);
2390
2391 return CMD_SUCCESS;
2392 }
2393
2394 DEFUN (no_link_params_ava_bw,
2395 no_link_params_ava_bw_cmd,
2396 "no ava-bw",
2397 NO_STR
2398 "Disable Unidirectional Available Bandwidth on this interface\n")
2399 {
2400 VTY_DECLVAR_CONTEXT(interface, ifp);
2401
2402 /* Unset Available Bandwidth */
2403 link_param_cmd_unset(ifp, LP_AVA_BW);
2404
2405 return CMD_SUCCESS;
2406 }
2407
2408 DEFUN (link_params_use_bw,
2409 link_params_use_bw_cmd,
2410 "use-bw BANDWIDTH",
2411 "Unidirectional Utilised Bandwidth\n"
2412 "Bytes/second (IEEE floating point format)\n")
2413 {
2414 int idx_bandwidth = 1;
2415 VTY_DECLVAR_CONTEXT(interface, ifp);
2416 struct if_link_params *iflp = if_link_params_get(ifp);
2417 float bw;
2418
2419 if (sscanf(argv[idx_bandwidth]->arg, "%g", &bw) != 1) {
2420 vty_out(vty, "link_params_use_bw: fscanf: %s\n",
2421 safe_strerror(errno));
2422 return CMD_WARNING_CONFIG_FAILED;
2423 }
2424
2425 /* Check that bandwidth is not greater than maximum bandwidth parameter
2426 */
2427 if (bw > iflp->max_bw) {
2428 vty_out(vty,
2429 "Utilised Bandwidth could not be greater than Maximum Bandwidth (%g)\n",
2430 iflp->max_bw);
2431 return CMD_WARNING_CONFIG_FAILED;
2432 }
2433
2434 /* Update Utilized Bandwidth if needed */
2435 link_param_cmd_set_float(ifp, &iflp->use_bw, LP_USE_BW, bw);
2436
2437 return CMD_SUCCESS;
2438 }
2439
2440 DEFUN (no_link_params_use_bw,
2441 no_link_params_use_bw_cmd,
2442 "no use-bw",
2443 NO_STR
2444 "Disable Unidirectional Utilised Bandwidth on this interface\n")
2445 {
2446 VTY_DECLVAR_CONTEXT(interface, ifp);
2447
2448 /* Unset Utilised Bandwidth */
2449 link_param_cmd_unset(ifp, LP_USE_BW);
2450
2451 return CMD_SUCCESS;
2452 }
2453
2454 static int ip_address_install(struct vty *vty, struct interface *ifp,
2455 const char *addr_str, const char *peer_str,
2456 const char *label)
2457 {
2458 struct zebra_if *if_data;
2459 struct prefix_ipv4 lp, pp;
2460 struct connected *ifc;
2461 struct prefix_ipv4 *p;
2462 int ret;
2463
2464 if_data = ifp->info;
2465
2466 ret = str2prefix_ipv4(addr_str, &lp);
2467 if (ret <= 0) {
2468 vty_out(vty, "%% Malformed address \n");
2469 return CMD_WARNING_CONFIG_FAILED;
2470 }
2471
2472 if (ipv4_martian(&lp.prefix)) {
2473 vty_out(vty, "%% Invalid address\n");
2474 return CMD_WARNING_CONFIG_FAILED;
2475 }
2476
2477 if (peer_str) {
2478 if (lp.prefixlen != 32) {
2479 vty_out(vty,
2480 "%% Local prefix length for P-t-P address must be /32\n");
2481 return CMD_WARNING_CONFIG_FAILED;
2482 }
2483
2484 ret = str2prefix_ipv4(peer_str, &pp);
2485 if (ret <= 0) {
2486 vty_out(vty, "%% Malformed peer address\n");
2487 return CMD_WARNING_CONFIG_FAILED;
2488 }
2489 }
2490
2491 ifc = connected_check_ptp(ifp, &lp, peer_str ? &pp : NULL);
2492 if (!ifc) {
2493 ifc = connected_new();
2494 ifc->ifp = ifp;
2495
2496 /* Address. */
2497 p = prefix_ipv4_new();
2498 *p = lp;
2499 ifc->address = (struct prefix *)p;
2500
2501 if (peer_str) {
2502 SET_FLAG(ifc->flags, ZEBRA_IFA_PEER);
2503 p = prefix_ipv4_new();
2504 *p = pp;
2505 ifc->destination = (struct prefix *)p;
2506 } else if (p->prefixlen <= IPV4_MAX_PREFIXLEN - 2) {
2507 p = prefix_ipv4_new();
2508 *p = lp;
2509 p->prefix.s_addr = ipv4_broadcast_addr(p->prefix.s_addr,
2510 p->prefixlen);
2511 ifc->destination = (struct prefix *)p;
2512 }
2513
2514 /* Label. */
2515 if (label)
2516 ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label);
2517
2518 /* Add to linked list. */
2519 listnode_add(ifp->connected, ifc);
2520 }
2521
2522 /* This address is configured from zebra. */
2523 if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED))
2524 SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED);
2525
2526 /* In case of this route need to install kernel. */
2527 if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED)
2528 && CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)
2529 && !(if_data && if_data->shutdown == IF_ZEBRA_SHUTDOWN_ON)) {
2530 /* Some system need to up the interface to set IP address. */
2531 if (!if_is_up(ifp)) {
2532 if_set_flags(ifp, IFF_UP | IFF_RUNNING);
2533 if_refresh(ifp);
2534 }
2535
2536 ret = if_set_prefix(ifp, ifc);
2537 if (ret < 0) {
2538 vty_out(vty, "%% Can't set interface IP address: %s.\n",
2539 safe_strerror(errno));
2540 return CMD_WARNING_CONFIG_FAILED;
2541 }
2542
2543 SET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
2544 /* The address will be advertised to zebra clients when the
2545 * notification
2546 * from the kernel has been received.
2547 * It will also be added to the subnet chain list, then. */
2548 }
2549
2550 return CMD_SUCCESS;
2551 }
2552
2553 static int ip_address_uninstall(struct vty *vty, struct interface *ifp,
2554 const char *addr_str, const char *peer_str,
2555 const char *label)
2556 {
2557 struct prefix_ipv4 lp, pp;
2558 struct connected *ifc;
2559 int ret;
2560
2561 /* Convert to prefix structure. */
2562 ret = str2prefix_ipv4(addr_str, &lp);
2563 if (ret <= 0) {
2564 vty_out(vty, "%% Malformed address \n");
2565 return CMD_WARNING_CONFIG_FAILED;
2566 }
2567
2568 if (peer_str) {
2569 if (lp.prefixlen != 32) {
2570 vty_out(vty,
2571 "%% Local prefix length for P-t-P address must be /32\n");
2572 return CMD_WARNING_CONFIG_FAILED;
2573 }
2574
2575 ret = str2prefix_ipv4(peer_str, &pp);
2576 if (ret <= 0) {
2577 vty_out(vty, "%% Malformed peer address\n");
2578 return CMD_WARNING_CONFIG_FAILED;
2579 }
2580 }
2581
2582 /* Check current interface address. */
2583 ifc = connected_check_ptp(ifp, &lp, peer_str ? &pp : NULL);
2584 if (!ifc) {
2585 vty_out(vty, "%% Can't find address\n");
2586 return CMD_WARNING_CONFIG_FAILED;
2587 }
2588
2589 /* This is not configured address. */
2590 if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED))
2591 return CMD_WARNING_CONFIG_FAILED;
2592
2593 UNSET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED);
2594
2595 /* This is not real address or interface is not active. */
2596 if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED)
2597 || !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) {
2598 listnode_delete(ifp->connected, ifc);
2599 connected_free(ifc);
2600 return CMD_WARNING_CONFIG_FAILED;
2601 }
2602
2603 /* This is real route. */
2604 ret = if_unset_prefix(ifp, ifc);
2605 if (ret < 0) {
2606 vty_out(vty, "%% Can't unset interface IP address: %s.\n",
2607 safe_strerror(errno));
2608 return CMD_WARNING_CONFIG_FAILED;
2609 }
2610 UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
2611 /* we will receive a kernel notification about this route being removed.
2612 * this will trigger its removal from the connected list. */
2613 return CMD_SUCCESS;
2614 }
2615
2616 DEFUN (ip_address,
2617 ip_address_cmd,
2618 "ip address A.B.C.D/M",
2619 "Interface Internet Protocol config commands\n"
2620 "Set the IP address of an interface\n"
2621 "IP address (e.g. 10.0.0.1/8)\n")
2622 {
2623 int idx_ipv4_prefixlen = 2;
2624 VTY_DECLVAR_CONTEXT(interface, ifp);
2625 return ip_address_install(vty, ifp, argv[idx_ipv4_prefixlen]->arg, NULL,
2626 NULL);
2627 }
2628
2629 DEFUN (no_ip_address,
2630 no_ip_address_cmd,
2631 "no ip address A.B.C.D/M",
2632 NO_STR
2633 "Interface Internet Protocol config commands\n"
2634 "Set the IP address of an interface\n"
2635 "IP Address (e.g. 10.0.0.1/8)\n")
2636 {
2637 int idx_ipv4_prefixlen = 3;
2638 VTY_DECLVAR_CONTEXT(interface, ifp);
2639 return ip_address_uninstall(vty, ifp, argv[idx_ipv4_prefixlen]->arg,
2640 NULL, NULL);
2641 }
2642
2643 DEFUN(ip_address_peer,
2644 ip_address_peer_cmd,
2645 "ip address A.B.C.D peer A.B.C.D/M",
2646 "Interface Internet Protocol config commands\n"
2647 "Set the IP address of an interface\n"
2648 "Local IP (e.g. 10.0.0.1) for P-t-P address\n"
2649 "Specify P-t-P address\n"
2650 "Peer IP address (e.g. 10.0.0.1/8)\n")
2651 {
2652 VTY_DECLVAR_CONTEXT(interface, ifp);
2653 return ip_address_install(vty, ifp, argv[2]->arg, argv[4]->arg, NULL);
2654 }
2655
2656 DEFUN(no_ip_address_peer,
2657 no_ip_address_peer_cmd,
2658 "no ip address A.B.C.D peer A.B.C.D/M",
2659 NO_STR
2660 "Interface Internet Protocol config commands\n"
2661 "Set the IP address of an interface\n"
2662 "Local IP (e.g. 10.0.0.1) for P-t-P address\n"
2663 "Specify P-t-P address\n"
2664 "Peer IP address (e.g. 10.0.0.1/8)\n")
2665 {
2666 VTY_DECLVAR_CONTEXT(interface, ifp);
2667 return ip_address_uninstall(vty, ifp, argv[3]->arg, argv[5]->arg, NULL);
2668 }
2669
2670 #ifdef HAVE_NETLINK
2671 DEFUN (ip_address_label,
2672 ip_address_label_cmd,
2673 "ip address A.B.C.D/M label LINE",
2674 "Interface Internet Protocol config commands\n"
2675 "Set the IP address of an interface\n"
2676 "IP address (e.g. 10.0.0.1/8)\n"
2677 "Label of this address\n"
2678 "Label\n")
2679 {
2680 int idx_ipv4_prefixlen = 2;
2681 int idx_line = 4;
2682 VTY_DECLVAR_CONTEXT(interface, ifp);
2683 return ip_address_install(vty, ifp, argv[idx_ipv4_prefixlen]->arg, NULL,
2684 argv[idx_line]->arg);
2685 }
2686
2687 DEFUN (no_ip_address_label,
2688 no_ip_address_label_cmd,
2689 "no ip address A.B.C.D/M label LINE",
2690 NO_STR
2691 "Interface Internet Protocol config commands\n"
2692 "Set the IP address of an interface\n"
2693 "IP address (e.g. 10.0.0.1/8)\n"
2694 "Label of this address\n"
2695 "Label\n")
2696 {
2697 int idx_ipv4_prefixlen = 3;
2698 int idx_line = 5;
2699 VTY_DECLVAR_CONTEXT(interface, ifp);
2700 return ip_address_uninstall(vty, ifp, argv[idx_ipv4_prefixlen]->arg,
2701 NULL, argv[idx_line]->arg);
2702 }
2703 #endif /* HAVE_NETLINK */
2704
2705 static int ipv6_address_install(struct vty *vty, struct interface *ifp,
2706 const char *addr_str, const char *peer_str,
2707 const char *label, int secondary)
2708 {
2709 struct zebra_if *if_data;
2710 struct prefix_ipv6 cp;
2711 struct connected *ifc;
2712 struct prefix_ipv6 *p;
2713 int ret;
2714
2715 if_data = ifp->info;
2716
2717 ret = str2prefix_ipv6(addr_str, &cp);
2718 if (ret <= 0) {
2719 vty_out(vty, "%% Malformed address \n");
2720 return CMD_WARNING_CONFIG_FAILED;
2721 }
2722
2723 if (ipv6_martian(&cp.prefix)) {
2724 vty_out(vty, "%% Invalid address\n");
2725 return CMD_WARNING_CONFIG_FAILED;
2726 }
2727
2728 ifc = connected_check(ifp, (struct prefix *)&cp);
2729 if (!ifc) {
2730 ifc = connected_new();
2731 ifc->ifp = ifp;
2732
2733 /* Address. */
2734 p = prefix_ipv6_new();
2735 *p = cp;
2736 ifc->address = (struct prefix *)p;
2737
2738 /* Secondary. */
2739 if (secondary)
2740 SET_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY);
2741
2742 /* Label. */
2743 if (label)
2744 ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label);
2745
2746 /* Add to linked list. */
2747 listnode_add(ifp->connected, ifc);
2748 }
2749
2750 /* This address is configured from zebra. */
2751 if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED))
2752 SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED);
2753
2754 /* In case of this route need to install kernel. */
2755 if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED)
2756 && CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)
2757 && !(if_data && if_data->shutdown == IF_ZEBRA_SHUTDOWN_ON)) {
2758 /* Some system need to up the interface to set IP address. */
2759 if (!if_is_up(ifp)) {
2760 if_set_flags(ifp, IFF_UP | IFF_RUNNING);
2761 if_refresh(ifp);
2762 }
2763
2764 ret = if_prefix_add_ipv6(ifp, ifc);
2765
2766 if (ret < 0) {
2767 vty_out(vty, "%% Can't set interface IP address: %s.\n",
2768 safe_strerror(errno));
2769 return CMD_WARNING_CONFIG_FAILED;
2770 }
2771
2772 SET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
2773 /* The address will be advertised to zebra clients when the
2774 * notification
2775 * from the kernel has been received. */
2776 }
2777
2778 return CMD_SUCCESS;
2779 }
2780
2781 /* Return true if an ipv6 address is configured on ifp */
2782 int ipv6_address_configured(struct interface *ifp)
2783 {
2784 struct connected *connected;
2785 struct listnode *node;
2786
2787 for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected))
2788 if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL)
2789 && (connected->address->family == AF_INET6))
2790 return 1;
2791
2792 return 0;
2793 }
2794
2795 static int ipv6_address_uninstall(struct vty *vty, struct interface *ifp,
2796 const char *addr_str, const char *peer_str,
2797 const char *label, int secondry)
2798 {
2799 struct prefix_ipv6 cp;
2800 struct connected *ifc;
2801 int ret;
2802
2803 /* Convert to prefix structure. */
2804 ret = str2prefix_ipv6(addr_str, &cp);
2805 if (ret <= 0) {
2806 vty_out(vty, "%% Malformed address \n");
2807 return CMD_WARNING_CONFIG_FAILED;
2808 }
2809
2810 /* Check current interface address. */
2811 ifc = connected_check(ifp, (struct prefix *)&cp);
2812 if (!ifc) {
2813 vty_out(vty, "%% Can't find address\n");
2814 return CMD_WARNING_CONFIG_FAILED;
2815 }
2816
2817 /* This is not configured address. */
2818 if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED))
2819 return CMD_WARNING_CONFIG_FAILED;
2820
2821 UNSET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED);
2822
2823 /* This is not real address or interface is not active. */
2824 if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_QUEUED)
2825 || !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) {
2826 listnode_delete(ifp->connected, ifc);
2827 connected_free(ifc);
2828 return CMD_WARNING_CONFIG_FAILED;
2829 }
2830
2831 /* This is real route. */
2832 ret = if_prefix_delete_ipv6(ifp, ifc);
2833 if (ret < 0) {
2834 vty_out(vty, "%% Can't unset interface IP address: %s.\n",
2835 safe_strerror(errno));
2836 return CMD_WARNING_CONFIG_FAILED;
2837 }
2838
2839 UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
2840 /* This information will be propagated to the zclients when the
2841 * kernel notification is received. */
2842 return CMD_SUCCESS;
2843 }
2844
2845 DEFUN (ipv6_address,
2846 ipv6_address_cmd,
2847 "ipv6 address X:X::X:X/M",
2848 "Interface IPv6 config commands\n"
2849 "Set the IP address of an interface\n"
2850 "IPv6 address (e.g. 3ffe:506::1/48)\n")
2851 {
2852 int idx_ipv6_prefixlen = 2;
2853 VTY_DECLVAR_CONTEXT(interface, ifp);
2854 return ipv6_address_install(vty, ifp, argv[idx_ipv6_prefixlen]->arg,
2855 NULL, NULL, 0);
2856 }
2857
2858 DEFUN (no_ipv6_address,
2859 no_ipv6_address_cmd,
2860 "no ipv6 address X:X::X:X/M",
2861 NO_STR
2862 "Interface IPv6 config commands\n"
2863 "Set the IP address of an interface\n"
2864 "IPv6 address (e.g. 3ffe:506::1/48)\n")
2865 {
2866 int idx_ipv6_prefixlen = 3;
2867 VTY_DECLVAR_CONTEXT(interface, ifp);
2868 return ipv6_address_uninstall(vty, ifp, argv[idx_ipv6_prefixlen]->arg,
2869 NULL, NULL, 0);
2870 }
2871
2872 static int link_params_config_write(struct vty *vty, struct interface *ifp)
2873 {
2874 int i;
2875
2876 if ((ifp == NULL) || !HAS_LINK_PARAMS(ifp))
2877 return -1;
2878
2879 struct if_link_params *iflp = ifp->link_params;
2880
2881 vty_out(vty, " link-params\n");
2882 vty_out(vty, " enable\n");
2883 if (IS_PARAM_SET(iflp, LP_TE_METRIC) && iflp->te_metric != ifp->metric)
2884 vty_out(vty, " metric %u\n", iflp->te_metric);
2885 if (IS_PARAM_SET(iflp, LP_MAX_BW) && iflp->max_bw != iflp->default_bw)
2886 vty_out(vty, " max-bw %g\n", iflp->max_bw);
2887 if (IS_PARAM_SET(iflp, LP_MAX_RSV_BW)
2888 && iflp->max_rsv_bw != iflp->default_bw)
2889 vty_out(vty, " max-rsv-bw %g\n", iflp->max_rsv_bw);
2890 if (IS_PARAM_SET(iflp, LP_UNRSV_BW)) {
2891 for (i = 0; i < 8; i++)
2892 if (iflp->unrsv_bw[i] != iflp->default_bw)
2893 vty_out(vty, " unrsv-bw %d %g\n", i,
2894 iflp->unrsv_bw[i]);
2895 }
2896 if (IS_PARAM_SET(iflp, LP_ADM_GRP))
2897 vty_out(vty, " admin-grp 0x%x\n", iflp->admin_grp);
2898 if (IS_PARAM_SET(iflp, LP_DELAY)) {
2899 vty_out(vty, " delay %u", iflp->av_delay);
2900 if (IS_PARAM_SET(iflp, LP_MM_DELAY)) {
2901 vty_out(vty, " min %u", iflp->min_delay);
2902 vty_out(vty, " max %u", iflp->max_delay);
2903 }
2904 vty_out(vty, "\n");
2905 }
2906 if (IS_PARAM_SET(iflp, LP_DELAY_VAR))
2907 vty_out(vty, " delay-variation %u\n", iflp->delay_var);
2908 if (IS_PARAM_SET(iflp, LP_PKT_LOSS))
2909 vty_out(vty, " packet-loss %g\n", iflp->pkt_loss);
2910 if (IS_PARAM_SET(iflp, LP_AVA_BW))
2911 vty_out(vty, " ava-bw %g\n", iflp->ava_bw);
2912 if (IS_PARAM_SET(iflp, LP_RES_BW))
2913 vty_out(vty, " res-bw %g\n", iflp->res_bw);
2914 if (IS_PARAM_SET(iflp, LP_USE_BW))
2915 vty_out(vty, " use-bw %g\n", iflp->use_bw);
2916 if (IS_PARAM_SET(iflp, LP_RMT_AS))
2917 vty_out(vty, " neighbor %s as %u\n", inet_ntoa(iflp->rmt_ip),
2918 iflp->rmt_as);
2919 vty_out(vty, " exit-link-params\n");
2920 return 0;
2921 }
2922
2923 static int if_config_write(struct vty *vty)
2924 {
2925 struct vrf *vrf;
2926 struct interface *ifp;
2927
2928 zebra_ptm_write(vty);
2929
2930 RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
2931 FOR_ALL_INTERFACES (vrf, ifp) {
2932 struct zebra_if *if_data;
2933 struct listnode *addrnode;
2934 struct connected *ifc;
2935 struct prefix *p;
2936 struct vrf *vrf;
2937
2938 if_data = ifp->info;
2939 vrf = vrf_lookup_by_id(ifp->vrf_id);
2940
2941 if (ifp->vrf_id == VRF_DEFAULT)
2942 vty_frame(vty, "interface %s\n", ifp->name);
2943 else
2944 vty_frame(vty, "interface %s vrf %s\n",
2945 ifp->name, vrf->name);
2946
2947 if (if_data) {
2948 if (if_data->shutdown == IF_ZEBRA_SHUTDOWN_ON)
2949 vty_out(vty, " shutdown\n");
2950
2951 zebra_ptm_if_write(vty, if_data);
2952 }
2953
2954 if (ifp->desc)
2955 vty_out(vty, " description %s\n", ifp->desc);
2956
2957 /* Assign bandwidth here to avoid unnecessary interface
2958 flap
2959 while processing config script */
2960 if (ifp->bandwidth != 0)
2961 vty_out(vty, " bandwidth %u\n", ifp->bandwidth);
2962
2963 if (!CHECK_FLAG(ifp->status,
2964 ZEBRA_INTERFACE_LINKDETECTION))
2965 vty_out(vty, " no link-detect\n");
2966
2967 for (ALL_LIST_ELEMENTS_RO(ifp->connected, addrnode,
2968 ifc)) {
2969 if (CHECK_FLAG(ifc->conf,
2970 ZEBRA_IFC_CONFIGURED)) {
2971 char buf[INET6_ADDRSTRLEN];
2972 p = ifc->address;
2973 vty_out(vty, " ip%s address %s",
2974 p->family == AF_INET ? ""
2975 : "v6",
2976 inet_ntop(p->family,
2977 &p->u.prefix, buf,
2978 sizeof(buf)));
2979 if (CONNECTED_PEER(ifc)) {
2980 p = ifc->destination;
2981 vty_out(vty, " peer %s",
2982 inet_ntop(p->family,
2983 &p->u.prefix,
2984 buf,
2985 sizeof(buf)));
2986 }
2987 vty_out(vty, "/%d", p->prefixlen);
2988
2989 if (ifc->label)
2990 vty_out(vty, " label %s",
2991 ifc->label);
2992
2993 vty_out(vty, "\n");
2994 }
2995 }
2996
2997 if (if_data) {
2998 if (if_data->multicast
2999 != IF_ZEBRA_MULTICAST_UNSPEC)
3000 vty_out(vty, " %smulticast\n",
3001 if_data->multicast
3002 == IF_ZEBRA_MULTICAST_ON
3003 ? ""
3004 : "no ");
3005 }
3006
3007 hook_call(zebra_if_config_wr, vty, ifp);
3008
3009 link_params_config_write(vty, ifp);
3010
3011 vty_endframe(vty, "!\n");
3012 }
3013 return 0;
3014 }
3015
3016 /* Allocate and initialize interface vector. */
3017 void zebra_if_init(void)
3018 {
3019 /* Initialize interface and new hook. */
3020 hook_register_prio(if_add, 0, if_zebra_new_hook);
3021 hook_register_prio(if_del, 0, if_zebra_delete_hook);
3022
3023 /* Install configuration write function. */
3024 install_node(&interface_node, if_config_write);
3025 install_node(&link_params_node, NULL);
3026 if_cmd_init();
3027
3028 install_element(VIEW_NODE, &show_interface_cmd);
3029 install_element(VIEW_NODE, &show_interface_vrf_all_cmd);
3030 install_element(VIEW_NODE, &show_interface_name_vrf_cmd);
3031 install_element(VIEW_NODE, &show_interface_name_vrf_all_cmd);
3032
3033 install_element(ENABLE_NODE, &show_interface_desc_cmd);
3034 install_element(ENABLE_NODE, &show_interface_desc_vrf_all_cmd);
3035 install_element(INTERFACE_NODE, &multicast_cmd);
3036 install_element(INTERFACE_NODE, &no_multicast_cmd);
3037 install_element(INTERFACE_NODE, &linkdetect_cmd);
3038 install_element(INTERFACE_NODE, &no_linkdetect_cmd);
3039 install_element(INTERFACE_NODE, &shutdown_if_cmd);
3040 install_element(INTERFACE_NODE, &no_shutdown_if_cmd);
3041 install_element(INTERFACE_NODE, &bandwidth_if_cmd);
3042 install_element(INTERFACE_NODE, &no_bandwidth_if_cmd);
3043 install_element(INTERFACE_NODE, &ip_address_cmd);
3044 install_element(INTERFACE_NODE, &no_ip_address_cmd);
3045 install_element(INTERFACE_NODE, &ip_address_peer_cmd);
3046 install_element(INTERFACE_NODE, &no_ip_address_peer_cmd);
3047 install_element(INTERFACE_NODE, &ipv6_address_cmd);
3048 install_element(INTERFACE_NODE, &no_ipv6_address_cmd);
3049 #ifdef HAVE_NETLINK
3050 install_element(INTERFACE_NODE, &ip_address_label_cmd);
3051 install_element(INTERFACE_NODE, &no_ip_address_label_cmd);
3052 #endif /* HAVE_NETLINK */
3053 install_element(INTERFACE_NODE, &link_params_cmd);
3054 install_default(LINK_PARAMS_NODE);
3055 install_element(LINK_PARAMS_NODE, &link_params_enable_cmd);
3056 install_element(LINK_PARAMS_NODE, &no_link_params_enable_cmd);
3057 install_element(LINK_PARAMS_NODE, &link_params_metric_cmd);
3058 install_element(LINK_PARAMS_NODE, &no_link_params_metric_cmd);
3059 install_element(LINK_PARAMS_NODE, &link_params_maxbw_cmd);
3060 install_element(LINK_PARAMS_NODE, &link_params_max_rsv_bw_cmd);
3061 install_element(LINK_PARAMS_NODE, &link_params_unrsv_bw_cmd);
3062 install_element(LINK_PARAMS_NODE, &link_params_admin_grp_cmd);
3063 install_element(LINK_PARAMS_NODE, &no_link_params_admin_grp_cmd);
3064 install_element(LINK_PARAMS_NODE, &link_params_inter_as_cmd);
3065 install_element(LINK_PARAMS_NODE, &no_link_params_inter_as_cmd);
3066 install_element(LINK_PARAMS_NODE, &link_params_delay_cmd);
3067 install_element(LINK_PARAMS_NODE, &no_link_params_delay_cmd);
3068 install_element(LINK_PARAMS_NODE, &link_params_delay_var_cmd);
3069 install_element(LINK_PARAMS_NODE, &no_link_params_delay_var_cmd);
3070 install_element(LINK_PARAMS_NODE, &link_params_pkt_loss_cmd);
3071 install_element(LINK_PARAMS_NODE, &no_link_params_pkt_loss_cmd);
3072 install_element(LINK_PARAMS_NODE, &link_params_ava_bw_cmd);
3073 install_element(LINK_PARAMS_NODE, &no_link_params_ava_bw_cmd);
3074 install_element(LINK_PARAMS_NODE, &link_params_res_bw_cmd);
3075 install_element(LINK_PARAMS_NODE, &no_link_params_res_bw_cmd);
3076 install_element(LINK_PARAMS_NODE, &link_params_use_bw_cmd);
3077 install_element(LINK_PARAMS_NODE, &no_link_params_use_bw_cmd);
3078 install_element(LINK_PARAMS_NODE, &exit_link_params_cmd);
3079 }