version 1.1, 2012/02/21 17:26:12
|
version 1.1.1.3, 2016/11/02 10:09:11
|
Line 27
|
Line 27
|
#include "vector.h" |
#include "vector.h" |
#include "vty.h" |
#include "vty.h" |
#include "command.h" |
#include "command.h" |
|
#include "vrf.h" |
#include "if.h" |
#include "if.h" |
#include "sockunion.h" |
#include "sockunion.h" |
#include "prefix.h" |
#include "prefix.h" |
Line 35
|
Line 36
|
#include "buffer.h" |
#include "buffer.h" |
#include "str.h" |
#include "str.h" |
#include "log.h" |
#include "log.h" |
| |
/* Master list of interfaces. */ | /* List of interfaces in only the default VRF */ |
struct list *iflist; |
struct list *iflist; |
|
|
/* One for each program. This structure is needed to store hooks. */ |
/* One for each program. This structure is needed to store hooks. */ |
Line 44 struct if_master
|
Line 45 struct if_master
|
{ |
{ |
int (*if_new_hook) (struct interface *); |
int (*if_new_hook) (struct interface *); |
int (*if_delete_hook) (struct interface *); |
int (*if_delete_hook) (struct interface *); |
} if_master; | } if_master = {0,}; |
| |
/* Compare interface names, returning an integer greater than, equal to, or |
/* Compare interface names, returning an integer greater than, equal to, or |
* less than 0, (following the strcmp convention), according to the |
* less than 0, (following the strcmp convention), according to the |
* relationship between ifp1 and ifp2. Interface names consist of an |
* relationship between ifp1 and ifp2. Interface names consist of an |
Line 113 if_cmp_func (struct interface *ifp1, struct interface
|
Line 114 if_cmp_func (struct interface *ifp1, struct interface
|
|
|
/* Create new interface structure. */ |
/* Create new interface structure. */ |
struct interface * |
struct interface * |
if_create (const char *name, int namelen) | if_create_vrf (const char *name, int namelen, vrf_id_t vrf_id) |
{ |
{ |
struct interface *ifp; |
struct interface *ifp; |
|
struct list *intf_list = vrf_iflist_get (vrf_id); |
|
|
ifp = XCALLOC (MTYPE_IF, sizeof (struct interface)); |
ifp = XCALLOC (MTYPE_IF, sizeof (struct interface)); |
ifp->ifindex = IFINDEX_INTERNAL; |
ifp->ifindex = IFINDEX_INTERNAL; |
Line 124 if_create (const char *name, int namelen)
|
Line 126 if_create (const char *name, int namelen)
|
assert (namelen <= INTERFACE_NAMSIZ); /* Need space for '\0' at end. */ |
assert (namelen <= INTERFACE_NAMSIZ); /* Need space for '\0' at end. */ |
strncpy (ifp->name, name, namelen); |
strncpy (ifp->name, name, namelen); |
ifp->name[namelen] = '\0'; |
ifp->name[namelen] = '\0'; |
if (if_lookup_by_name(ifp->name) == NULL) | ifp->vrf_id = vrf_id; |
listnode_add_sort (iflist, ifp); | if (if_lookup_by_name_vrf (ifp->name, vrf_id) == NULL) |
| listnode_add_sort (intf_list, ifp); |
else |
else |
zlog_err("if_create(%s): corruption detected -- interface with this " |
zlog_err("if_create(%s): corruption detected -- interface with this " |
"name exists already!", ifp->name); | "name exists already in VRF %u!", ifp->name, vrf_id); |
ifp->connected = list_new (); |
ifp->connected = list_new (); |
ifp->connected->del = (void (*) (void *)) connected_free; |
ifp->connected->del = (void (*) (void *)) connected_free; |
|
|
Line 138 if_create (const char *name, int namelen)
|
Line 141 if_create (const char *name, int namelen)
|
return ifp; |
return ifp; |
} |
} |
|
|
|
struct interface * |
|
if_create (const char *name, int namelen) |
|
{ |
|
return if_create_vrf (name, namelen, VRF_DEFAULT); |
|
} |
|
|
/* Delete interface structure. */ |
/* Delete interface structure. */ |
void |
void |
if_delete_retain (struct interface *ifp) |
if_delete_retain (struct interface *ifp) |
Line 146 if_delete_retain (struct interface *ifp)
|
Line 155 if_delete_retain (struct interface *ifp)
|
(*if_master.if_delete_hook) (ifp); |
(*if_master.if_delete_hook) (ifp); |
|
|
/* Free connected address list */ |
/* Free connected address list */ |
list_delete (ifp->connected); | list_delete_all_node (ifp->connected); |
} |
} |
|
|
/* Delete and free interface structure. */ |
/* Delete and free interface structure. */ |
void |
void |
if_delete (struct interface *ifp) |
if_delete (struct interface *ifp) |
{ |
{ |
listnode_delete (iflist, ifp); | listnode_delete (vrf_iflist (ifp->vrf_id), ifp); |
|
|
if_delete_retain(ifp); |
if_delete_retain(ifp); |
|
|
|
list_free (ifp->connected); |
|
|
XFREE (MTYPE_IF, ifp); |
XFREE (MTYPE_IF, ifp); |
} |
} |
|
|
Line 178 if_add_hook (int type, int (*func)(struct interface *i
|
Line 189 if_add_hook (int type, int (*func)(struct interface *i
|
|
|
/* Interface existance check by index. */ |
/* Interface existance check by index. */ |
struct interface * |
struct interface * |
if_lookup_by_index (unsigned int index) | if_lookup_by_index_vrf (ifindex_t ifindex, vrf_id_t vrf_id) |
{ |
{ |
struct listnode *node; |
struct listnode *node; |
struct interface *ifp; |
struct interface *ifp; |
|
|
for (ALL_LIST_ELEMENTS_RO(iflist, node, ifp)) | for (ALL_LIST_ELEMENTS_RO (vrf_iflist (vrf_id), node, ifp)) |
{ |
{ |
if (ifp->ifindex == index) | if (ifp->ifindex == ifindex) |
return ifp; |
return ifp; |
} |
} |
return NULL; |
return NULL; |
} |
} |
|
|
|
struct interface * |
|
if_lookup_by_index (ifindex_t ifindex) |
|
{ |
|
return if_lookup_by_index_vrf (ifindex, VRF_DEFAULT); |
|
} |
|
|
const char * |
const char * |
ifindex2ifname (unsigned int index) | ifindex2ifname_vrf (ifindex_t ifindex, vrf_id_t vrf_id) |
{ |
{ |
struct interface *ifp; |
struct interface *ifp; |
|
|
return ((ifp = if_lookup_by_index(index)) != NULL) ? | return ((ifp = if_lookup_by_index_vrf (ifindex, vrf_id)) != NULL) ? |
ifp->name : "unknown"; |
ifp->name : "unknown"; |
} |
} |
|
|
unsigned int | const char * |
ifname2ifindex (const char *name) | ifindex2ifname (ifindex_t ifindex) |
{ |
{ |
|
return ifindex2ifname_vrf (ifindex, VRF_DEFAULT); |
|
} |
|
|
|
ifindex_t |
|
ifname2ifindex_vrf (const char *name, vrf_id_t vrf_id) |
|
{ |
struct interface *ifp; |
struct interface *ifp; |
|
|
return ((ifp = if_lookup_by_name(name)) != NULL) ? ifp->ifindex | return ((ifp = if_lookup_by_name_vrf (name, vrf_id)) != NULL) ? ifp->ifindex |
: IFINDEX_INTERNAL; |
: IFINDEX_INTERNAL; |
} |
} |
|
|
|
ifindex_t |
|
ifname2ifindex (const char *name) |
|
{ |
|
return ifname2ifindex_vrf (name, VRF_DEFAULT); |
|
} |
|
|
/* Interface existance check by interface name. */ |
/* Interface existance check by interface name. */ |
struct interface * |
struct interface * |
if_lookup_by_name (const char *name) | if_lookup_by_name_vrf (const char *name, vrf_id_t vrf_id) |
{ |
{ |
struct listnode *node; |
struct listnode *node; |
struct interface *ifp; |
struct interface *ifp; |
|
|
if (name) |
if (name) |
for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp)) | for (ALL_LIST_ELEMENTS_RO (vrf_iflist (vrf_id), node, ifp)) |
{ |
{ |
if (strcmp(name, ifp->name) == 0) |
if (strcmp(name, ifp->name) == 0) |
return ifp; |
return ifp; |
Line 226 if_lookup_by_name (const char *name)
|
Line 255 if_lookup_by_name (const char *name)
|
} |
} |
|
|
struct interface * |
struct interface * |
if_lookup_by_name_len(const char *name, size_t namelen) | if_lookup_by_name (const char *name) |
{ |
{ |
|
return if_lookup_by_name_vrf (name, VRF_DEFAULT); |
|
} |
|
|
|
struct interface * |
|
if_lookup_by_name_len_vrf (const char *name, size_t namelen, vrf_id_t vrf_id) |
|
{ |
struct listnode *node; |
struct listnode *node; |
struct interface *ifp; |
struct interface *ifp; |
|
|
if (namelen > INTERFACE_NAMSIZ) |
if (namelen > INTERFACE_NAMSIZ) |
return NULL; |
return NULL; |
|
|
for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp)) | for (ALL_LIST_ELEMENTS_RO (vrf_iflist (vrf_id), node, ifp)) |
{ |
{ |
if (!memcmp(name, ifp->name, namelen) && (ifp->name[namelen] == '\0')) |
if (!memcmp(name, ifp->name, namelen) && (ifp->name[namelen] == '\0')) |
return ifp; |
return ifp; |
Line 242 if_lookup_by_name_len(const char *name, size_t namelen
|
Line 277 if_lookup_by_name_len(const char *name, size_t namelen
|
return NULL; |
return NULL; |
} |
} |
|
|
|
struct interface * |
|
if_lookup_by_name_len(const char *name, size_t namelen) |
|
{ |
|
return if_lookup_by_name_len_vrf (name, namelen, VRF_DEFAULT); |
|
} |
|
|
/* Lookup interface by IPv4 address. */ |
/* Lookup interface by IPv4 address. */ |
struct interface * |
struct interface * |
if_lookup_exact_address (struct in_addr src) | if_lookup_exact_address_vrf (struct in_addr src, vrf_id_t vrf_id) |
{ |
{ |
struct listnode *node; |
struct listnode *node; |
struct listnode *cnode; |
struct listnode *cnode; |
Line 252 if_lookup_exact_address (struct in_addr src)
|
Line 293 if_lookup_exact_address (struct in_addr src)
|
struct prefix *p; |
struct prefix *p; |
struct connected *c; |
struct connected *c; |
|
|
for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp)) | for (ALL_LIST_ELEMENTS_RO (vrf_iflist (vrf_id), node, ifp)) |
{ |
{ |
for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, c)) |
for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, c)) |
{ |
{ |
Line 268 if_lookup_exact_address (struct in_addr src)
|
Line 309 if_lookup_exact_address (struct in_addr src)
|
return NULL; |
return NULL; |
} |
} |
|
|
|
struct interface * |
|
if_lookup_exact_address (struct in_addr src) |
|
{ |
|
return if_lookup_exact_address_vrf (src, VRF_DEFAULT); |
|
} |
|
|
/* Lookup interface by IPv4 address. */ |
/* Lookup interface by IPv4 address. */ |
struct interface * |
struct interface * |
if_lookup_address (struct in_addr src) | if_lookup_address_vrf (struct in_addr src, vrf_id_t vrf_id) |
{ |
{ |
struct listnode *node; |
struct listnode *node; |
struct prefix addr; |
struct prefix addr; |
Line 286 if_lookup_address (struct in_addr src)
|
Line 333 if_lookup_address (struct in_addr src)
|
|
|
match = NULL; |
match = NULL; |
|
|
for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp)) | for (ALL_LIST_ELEMENTS_RO (vrf_iflist (vrf_id), node, ifp)) |
{ |
{ |
for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, c)) |
for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, c)) |
{ |
{ |
Line 302 if_lookup_address (struct in_addr src)
|
Line 349 if_lookup_address (struct in_addr src)
|
return match; |
return match; |
} |
} |
|
|
|
struct interface * |
|
if_lookup_address (struct in_addr src) |
|
{ |
|
return if_lookup_address_vrf (src, VRF_DEFAULT); |
|
} |
|
|
|
/* Lookup interface by prefix */ |
|
struct interface * |
|
if_lookup_prefix_vrf (struct prefix *prefix, vrf_id_t vrf_id) |
|
{ |
|
struct listnode *node; |
|
struct listnode *cnode; |
|
struct interface *ifp; |
|
struct connected *c; |
|
|
|
for (ALL_LIST_ELEMENTS_RO (vrf_iflist (vrf_id), node, ifp)) |
|
{ |
|
for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, c)) |
|
{ |
|
if (prefix_cmp(c->address, prefix) == 0) |
|
{ |
|
return ifp; |
|
} |
|
} |
|
} |
|
return NULL; |
|
} |
|
|
|
struct interface * |
|
if_lookup_prefix (struct prefix *prefix) |
|
{ |
|
return if_lookup_prefix_vrf (prefix, VRF_DEFAULT); |
|
} |
|
|
/* Get interface by name if given name interface doesn't exist create |
/* Get interface by name if given name interface doesn't exist create |
one. */ |
one. */ |
struct interface * |
struct interface * |
if_get_by_name (const char *name) | if_get_by_name_vrf (const char *name, vrf_id_t vrf_id) |
{ |
{ |
struct interface *ifp; |
struct interface *ifp; |
|
|
return ((ifp = if_lookup_by_name(name)) != NULL) ? ifp : | return ((ifp = if_lookup_by_name_vrf (name, vrf_id)) != NULL) ? ifp : |
if_create(name, strlen(name)); | if_create_vrf (name, strlen(name), vrf_id); |
} |
} |
|
|
struct interface * |
struct interface * |
if_get_by_name_len(const char *name, size_t namelen) | if_get_by_name (const char *name) |
{ |
{ |
|
return if_get_by_name_vrf (name, VRF_DEFAULT); |
|
} |
|
|
|
struct interface * |
|
if_get_by_name_len_vrf (const char *name, size_t namelen, vrf_id_t vrf_id) |
|
{ |
struct interface *ifp; |
struct interface *ifp; |
|
|
return ((ifp = if_lookup_by_name_len(name, namelen)) != NULL) ? ifp : | return ((ifp = if_lookup_by_name_len_vrf (name, namelen, vrf_id)) != NULL) ? \ |
if_create(name, namelen); | ifp : if_create_vrf (name, namelen, vrf_id); |
} |
} |
|
|
|
struct interface * |
|
if_get_by_name_len (const char *name, size_t namelen) |
|
{ |
|
return if_get_by_name_len_vrf (name, namelen, VRF_DEFAULT); |
|
} |
|
|
/* Does interface up ? */ |
/* Does interface up ? */ |
int |
int |
if_is_up (struct interface *ifp) |
if_is_up (struct interface *ifp) |
Line 427 static void
|
Line 520 static void
|
if_dump (const struct interface *ifp) |
if_dump (const struct interface *ifp) |
{ |
{ |
struct listnode *node; |
struct listnode *node; |
struct connected *c; | struct connected *c __attribute__((unused)); |
|
|
zlog_info ("Interface %s index %d metric %d mtu %d " | for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, c)) |
| zlog_info ("Interface %s vrf %u index %d metric %d mtu %d " |
#ifdef HAVE_IPV6 |
#ifdef HAVE_IPV6 |
"mtu6 %d " | "mtu6 %d " |
#endif /* HAVE_IPV6 */ |
#endif /* HAVE_IPV6 */ |
"%s", | "%s", |
ifp->name, ifp->ifindex, ifp->metric, ifp->mtu, | ifp->name, ifp->vrf_id, ifp->ifindex, ifp->metric, ifp->mtu, |
#ifdef HAVE_IPV6 |
#ifdef HAVE_IPV6 |
ifp->mtu6, | ifp->mtu6, |
#endif /* HAVE_IPV6 */ |
#endif /* HAVE_IPV6 */ |
if_flag_dump (ifp->flags)); | if_flag_dump (ifp->flags)); |
| |
for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, c)) | |
; | |
} |
} |
|
|
/* Interface printing for all interface. */ |
/* Interface printing for all interface. */ |
void |
void |
if_dump_all (void) |
if_dump_all (void) |
{ |
{ |
|
struct list *intf_list; |
struct listnode *node; |
struct listnode *node; |
void *p; |
void *p; |
|
vrf_iter_t iter; |
|
|
for (ALL_LIST_ELEMENTS_RO (iflist, node, p)) | for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter)) |
if_dump (p); | if ((intf_list = vrf_iter2iflist (iter)) != NULL) |
| for (ALL_LIST_ELEMENTS_RO (intf_list, node, p)) |
| if_dump (p); |
} |
} |
|
|
DEFUN (interface_desc, |
DEFUN (interface_desc, |
Line 489 DEFUN (no_interface_desc,
|
Line 584 DEFUN (no_interface_desc,
|
|
|
return CMD_SUCCESS; |
return CMD_SUCCESS; |
} |
} |
| |
#ifdef SUNOS_5 |
#ifdef SUNOS_5 |
/* Need to handle upgrade from SUNWzebra to Quagga. SUNWzebra created |
/* Need to handle upgrade from SUNWzebra to Quagga. SUNWzebra created |
* a seperate struct interface for each logical interface, so config |
* a seperate struct interface for each logical interface, so config |
Line 512 DEFUN (no_interface_desc,
|
Line 607 DEFUN (no_interface_desc,
|
* - no idea, just get the name in its entirety. |
* - no idea, just get the name in its entirety. |
*/ |
*/ |
static struct interface * |
static struct interface * |
if_sunwzebra_get (const char *name, size_t nlen) | if_sunwzebra_get (const char *name, size_t nlen, vrf_id_t vrf_id) |
{ |
{ |
struct interface *ifp; |
struct interface *ifp; |
size_t seppos = 0; |
size_t seppos = 0; |
|
|
if ( (ifp = if_lookup_by_name_len(name, nlen)) != NULL) | if ( (ifp = if_lookup_by_name_len_vrf (name, nlen, vrf_id)) != NULL) |
return ifp; |
return ifp; |
|
|
/* hunt the primary interface name... */ |
/* hunt the primary interface name... */ |
Line 526 if_sunwzebra_get (const char *name, size_t nlen)
|
Line 621 if_sunwzebra_get (const char *name, size_t nlen)
|
|
|
/* Wont catch seperator as last char, e.g. 'foo0:' but thats invalid */ |
/* Wont catch seperator as last char, e.g. 'foo0:' but thats invalid */ |
if (seppos < nlen) |
if (seppos < nlen) |
return if_get_by_name_len (name, seppos); | return if_get_by_name_len_vrf (name, seppos, vrf_id); |
else |
else |
return if_get_by_name_len (name, nlen); | return if_get_by_name_len_vrf (name, nlen, vrf_id); |
} |
} |
#endif /* SUNOS_5 */ |
#endif /* SUNOS_5 */ |
| |
DEFUN (interface, |
DEFUN (interface, |
interface_cmd, |
interface_cmd, |
"interface IFNAME", |
"interface IFNAME", |
Line 540 DEFUN (interface,
|
Line 635 DEFUN (interface,
|
{ |
{ |
struct interface *ifp; |
struct interface *ifp; |
size_t sl; |
size_t sl; |
|
vrf_id_t vrf_id = VRF_DEFAULT; |
|
|
if ((sl = strlen(argv[0])) > INTERFACE_NAMSIZ) |
if ((sl = strlen(argv[0])) > INTERFACE_NAMSIZ) |
{ |
{ |
Line 549 DEFUN (interface,
|
Line 645 DEFUN (interface,
|
return CMD_WARNING; |
return CMD_WARNING; |
} |
} |
|
|
|
if (argc > 1) |
|
VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]); |
|
|
#ifdef SUNOS_5 |
#ifdef SUNOS_5 |
ifp = if_sunwzebra_get (argv[0], sl); | ifp = if_sunwzebra_get (argv[0], sl, vrf_id); |
#else |
#else |
ifp = if_get_by_name_len(argv[0], sl); | ifp = if_get_by_name_len_vrf (argv[0], sl, vrf_id); |
#endif /* SUNOS_5 */ |
#endif /* SUNOS_5 */ |
|
|
vty->index = ifp; |
vty->index = ifp; |
Line 561 DEFUN (interface,
|
Line 660 DEFUN (interface,
|
return CMD_SUCCESS; |
return CMD_SUCCESS; |
} |
} |
|
|
|
ALIAS (interface, |
|
interface_vrf_cmd, |
|
"interface IFNAME " VRF_CMD_STR, |
|
"Select an interface to configure\n" |
|
"Interface's name\n" |
|
VRF_CMD_HELP_STR) |
|
|
DEFUN_NOSH (no_interface, |
DEFUN_NOSH (no_interface, |
no_interface_cmd, |
no_interface_cmd, |
"no interface IFNAME", |
"no interface IFNAME", |
Line 570 DEFUN_NOSH (no_interface,
|
Line 676 DEFUN_NOSH (no_interface,
|
{ |
{ |
// deleting interface |
// deleting interface |
struct interface *ifp; |
struct interface *ifp; |
|
vrf_id_t vrf_id = VRF_DEFAULT; |
|
|
ifp = if_lookup_by_name (argv[0]); | if (argc > 1) |
| VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]); |
|
|
|
ifp = if_lookup_by_name_vrf (argv[0], vrf_id); |
|
|
if (ifp == NULL) |
if (ifp == NULL) |
{ |
{ |
vty_out (vty, "%% Interface %s does not exist%s", argv[0], VTY_NEWLINE); |
vty_out (vty, "%% Interface %s does not exist%s", argv[0], VTY_NEWLINE); |
Line 591 DEFUN_NOSH (no_interface,
|
Line 701 DEFUN_NOSH (no_interface,
|
return CMD_SUCCESS; |
return CMD_SUCCESS; |
} |
} |
|
|
|
ALIAS (no_interface, |
|
no_interface_vrf_cmd, |
|
"no interface IFNAME " VRF_CMD_STR, |
|
NO_STR |
|
"Delete a pseudo interface's configuration\n" |
|
"Interface's name\n" |
|
VRF_CMD_HELP_STR) |
|
|
/* For debug purpose. */ |
/* For debug purpose. */ |
DEFUN (show_address, |
DEFUN (show_address, |
show_address_cmd, |
show_address_cmd, |
Line 603 DEFUN (show_address,
|
Line 721 DEFUN (show_address,
|
struct interface *ifp; |
struct interface *ifp; |
struct connected *ifc; |
struct connected *ifc; |
struct prefix *p; |
struct prefix *p; |
|
vrf_id_t vrf_id = VRF_DEFAULT; |
|
|
for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp)) | if (argc > 0) |
| VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]); |
| |
| for (ALL_LIST_ELEMENTS_RO (vrf_iflist (vrf_id), node, ifp)) |
{ |
{ |
for (ALL_LIST_ELEMENTS_RO (ifp->connected, node2, ifc)) |
for (ALL_LIST_ELEMENTS_RO (ifp->connected, node2, ifc)) |
{ |
{ |
Line 618 DEFUN (show_address,
|
Line 740 DEFUN (show_address,
|
return CMD_SUCCESS; |
return CMD_SUCCESS; |
} |
} |
|
|
|
ALIAS (show_address, |
|
show_address_vrf_cmd, |
|
"show address " VRF_CMD_STR, |
|
SHOW_STR |
|
"address\n" |
|
VRF_CMD_HELP_STR) |
|
|
|
DEFUN (show_address_vrf_all, |
|
show_address_vrf_all_cmd, |
|
"show address " VRF_ALL_CMD_STR, |
|
SHOW_STR |
|
"address\n" |
|
VRF_ALL_CMD_HELP_STR) |
|
{ |
|
struct list *intf_list; |
|
struct listnode *node; |
|
struct listnode *node2; |
|
struct interface *ifp; |
|
struct connected *ifc; |
|
struct prefix *p; |
|
vrf_iter_t iter; |
|
|
|
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter)) |
|
{ |
|
intf_list = vrf_iter2iflist (iter); |
|
if (!intf_list || !listcount (intf_list)) |
|
continue; |
|
|
|
vty_out (vty, "%sVRF %u%s%s", VTY_NEWLINE, vrf_iter2id (iter), |
|
VTY_NEWLINE, VTY_NEWLINE); |
|
|
|
for (ALL_LIST_ELEMENTS_RO (intf_list, node, ifp)) |
|
{ |
|
for (ALL_LIST_ELEMENTS_RO (ifp->connected, node2, ifc)) |
|
{ |
|
p = ifc->address; |
|
|
|
if (p->family == AF_INET) |
|
vty_out (vty, "%s/%d%s", inet_ntoa (p->u.prefix4), p->prefixlen, |
|
VTY_NEWLINE); |
|
} |
|
} |
|
} |
|
return CMD_SUCCESS; |
|
} |
|
|
/* Allocate connected structure. */ |
/* Allocate connected structure. */ |
struct connected * |
struct connected * |
connected_new (void) |
connected_new (void) |
Line 653 connected_log (struct connected *connected, char *str)
|
Line 821 connected_log (struct connected *connected, char *str)
|
ifp = connected->ifp; |
ifp = connected->ifp; |
p = connected->address; |
p = connected->address; |
|
|
snprintf (logbuf, BUFSIZ, "%s interface %s %s %s/%d ", | snprintf (logbuf, BUFSIZ, "%s interface %s vrf %u %s %s/%d ", |
str, ifp->name, prefix_family_str (p), | str, ifp->name, ifp->vrf_id, prefix_family_str (p), |
inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ), |
inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ), |
p->prefixlen); |
p->prefixlen); |
|
|
Line 760 connected_add_by_prefix (struct interface *ifp, struct
|
Line 928 connected_add_by_prefix (struct interface *ifp, struct
|
} |
} |
|
|
#ifndef HAVE_IF_NAMETOINDEX |
#ifndef HAVE_IF_NAMETOINDEX |
unsigned int | ifindex_t |
if_nametoindex (const char *name) |
if_nametoindex (const char *name) |
{ |
{ |
struct interface *ifp; |
struct interface *ifp; |
Line 772 if_nametoindex (const char *name)
|
Line 940 if_nametoindex (const char *name)
|
|
|
#ifndef HAVE_IF_INDEXTONAME |
#ifndef HAVE_IF_INDEXTONAME |
char * |
char * |
if_indextoname (unsigned int ifindex, char *name) | if_indextoname (ifindex_t ifindex, char *name) |
{ |
{ |
struct interface *ifp; |
struct interface *ifp; |
|
|
Line 782 if_indextoname (unsigned int ifindex, char *name)
|
Line 950 if_indextoname (unsigned int ifindex, char *name)
|
return ifp->name; |
return ifp->name; |
} |
} |
#endif |
#endif |
| |
#if 0 /* this route_table of struct connected's is unused |
#if 0 /* this route_table of struct connected's is unused |
* however, it would be good to use a route_table rather than |
* however, it would be good to use a route_table rather than |
* a list.. |
* a list.. |
Line 837 ifaddr_ipv4_delete (struct in_addr *ifaddr, struct int
|
Line 1005 ifaddr_ipv4_delete (struct in_addr *ifaddr, struct int
|
|
|
/* Lookup interface by interface's IP address or interface index. */ |
/* Lookup interface by interface's IP address or interface index. */ |
static struct interface * |
static struct interface * |
ifaddr_ipv4_lookup (struct in_addr *addr, unsigned int ifindex) | ifaddr_ipv4_lookup (struct in_addr *addr, ifindex_t ifindex) |
{ |
{ |
struct prefix_ipv4 p; |
struct prefix_ipv4 p; |
struct route_node *rn; |
struct route_node *rn; |
Line 864 ifaddr_ipv4_lookup (struct in_addr *addr, unsigned int
|
Line 1032 ifaddr_ipv4_lookup (struct in_addr *addr, unsigned int
|
|
|
/* Initialize interface list. */ |
/* Initialize interface list. */ |
void |
void |
if_init (void) | if_init (vrf_id_t vrf_id, struct list **intf_list) |
{ |
{ |
iflist = list_new (); | *intf_list = list_new (); |
#if 0 |
#if 0 |
ifaddr_ipv4_table = route_table_init (); |
ifaddr_ipv4_table = route_table_init (); |
#endif /* ifaddr_ipv4_table */ |
#endif /* ifaddr_ipv4_table */ |
|
|
if (iflist) { | (*intf_list)->cmp = (int (*)(void *, void *))if_cmp_func; |
iflist->cmp = (int (*)(void *, void *))if_cmp_func; | |
return; | |
} | |
|
|
memset (&if_master, 0, sizeof if_master); | if (vrf_id == VRF_DEFAULT) |
| iflist = *intf_list; |
} |
} |
|
|
void |
void |
if_terminate (void) | if_terminate (vrf_id_t vrf_id, struct list **intf_list) |
{ |
{ |
for (;;) |
for (;;) |
{ |
{ |
struct interface *ifp; |
struct interface *ifp; |
|
|
ifp = listnode_head (iflist); | ifp = listnode_head (*intf_list); |
if (ifp == NULL) |
if (ifp == NULL) |
break; |
break; |
|
|
if_delete (ifp); |
if_delete (ifp); |
} |
} |
|
|
list_delete (iflist); | list_delete (*intf_list); |
iflist = NULL; | *intf_list = NULL; |
| |
| if (vrf_id == VRF_DEFAULT) |
| iflist = NULL; |
| } |
| |
| const char * |
| if_link_type_str (enum zebra_link_type llt) |
| { |
| switch (llt) |
| { |
| #define llts(T,S) case (T): return (S) |
| llts(ZEBRA_LLT_UNKNOWN, "Unknown"); |
| llts(ZEBRA_LLT_ETHER, "Ethernet"); |
| llts(ZEBRA_LLT_EETHER, "Experimental Ethernet"); |
| llts(ZEBRA_LLT_AX25, "AX.25 Level 2"); |
| llts(ZEBRA_LLT_PRONET, "PROnet token ring"); |
| llts(ZEBRA_LLT_IEEE802, "IEEE 802.2 Ethernet/TR/TB"); |
| llts(ZEBRA_LLT_ARCNET, "ARCnet"); |
| llts(ZEBRA_LLT_APPLETLK, "AppleTalk"); |
| llts(ZEBRA_LLT_DLCI, "Frame Relay DLCI"); |
| llts(ZEBRA_LLT_ATM, "ATM"); |
| llts(ZEBRA_LLT_METRICOM, "Metricom STRIP"); |
| llts(ZEBRA_LLT_IEEE1394, "IEEE 1394 IPv4"); |
| llts(ZEBRA_LLT_EUI64, "EUI-64"); |
| llts(ZEBRA_LLT_INFINIBAND, "InfiniBand"); |
| llts(ZEBRA_LLT_SLIP, "SLIP"); |
| llts(ZEBRA_LLT_CSLIP, "Compressed SLIP"); |
| llts(ZEBRA_LLT_SLIP6, "SLIPv6"); |
| llts(ZEBRA_LLT_CSLIP6, "Compressed SLIPv6"); |
| llts(ZEBRA_LLT_ROSE, "ROSE packet radio"); |
| llts(ZEBRA_LLT_X25, "CCITT X.25"); |
| llts(ZEBRA_LLT_PPP, "PPP"); |
| llts(ZEBRA_LLT_CHDLC, "Cisco HDLC"); |
| llts(ZEBRA_LLT_RAWHDLC, "Raw HDLC"); |
| llts(ZEBRA_LLT_LAPB, "LAPB"); |
| llts(ZEBRA_LLT_IPIP, "IPIP Tunnel"); |
| llts(ZEBRA_LLT_IPIP6, "IPIP6 Tunnel"); |
| llts(ZEBRA_LLT_FRAD, "FRAD"); |
| llts(ZEBRA_LLT_SKIP, "SKIP vif"); |
| llts(ZEBRA_LLT_LOOPBACK, "Loopback"); |
| llts(ZEBRA_LLT_LOCALTLK, "Localtalk"); |
| llts(ZEBRA_LLT_FDDI, "FDDI"); |
| llts(ZEBRA_LLT_SIT, "IPv6-in-IPv4 SIT"); |
| llts(ZEBRA_LLT_IPDDP, "IP-in-DDP tunnel"); |
| llts(ZEBRA_LLT_IPGRE, "GRE over IP"); |
| llts(ZEBRA_LLT_PIMREG, "PIMSM registration"); |
| llts(ZEBRA_LLT_HIPPI, "HiPPI"); |
| llts(ZEBRA_LLT_IRDA, "IrDA"); |
| llts(ZEBRA_LLT_FCPP, "Fibre-Channel PtP"); |
| llts(ZEBRA_LLT_FCAL, "Fibre-Channel Arbitrated Loop"); |
| llts(ZEBRA_LLT_FCPL, "Fibre-Channel Public Loop"); |
| llts(ZEBRA_LLT_FCFABRIC, "Fibre-Channel Fabric"); |
| llts(ZEBRA_LLT_IEEE802_TR, "IEEE 802.2 Token Ring"); |
| llts(ZEBRA_LLT_IEEE80211, "IEEE 802.11"); |
| llts(ZEBRA_LLT_IEEE80211_RADIOTAP, "IEEE 802.11 Radiotap"); |
| llts(ZEBRA_LLT_IEEE802154, "IEEE 802.15.4"); |
| llts(ZEBRA_LLT_IEEE802154_PHY, "IEEE 802.15.4 Phy"); |
| default: |
| zlog_warn ("Unknown value %d", llt); |
| return "Unknown type!"; |
| #undef llts |
| } |
| return NULL; |
} |
} |