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