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