Skip to content

Commit

Permalink
2003-08-01 Cougar <[email protected]>
Browse files Browse the repository at this point in the history
	* lib/if.c: (if_cmp_func) new function, compare interface names in
	alphabetical order.
	(if_create) Take name as argument and add interface in sorted order.
	(if_get_by_name),(interface_cmd) fixup calls to if_create - see
	above.
	(if_init) register list comparison function.
	* lib/if.h: Add comparison function, modify if_create prototype.
	* lib/zclient.c: Modify call to if_create.
	* ospfd/ospf_interface.c: (ospf_vl_new) modify call to if_create.
	change sprintf to snprintf.
	* zebra/kernel_socket.c: (ifm_read) modify call to if_create.
  • Loading branch information
paul committed Aug 1, 2003
1 parent 12ab19f commit 106d2fd
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 21 deletions.
69 changes: 58 additions & 11 deletions lib/if.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

/*
* Interface functions.
* Copyright (C) 1997, 98 Kunihiro Ishiguro
Expand Down Expand Up @@ -46,6 +47,52 @@ struct if_master
int (*if_delete_hook) (struct interface *);
} if_master;

/* Compare interface names */
int
if_cmp_func (struct interface *ifp1, struct interface *ifp2)
{
unsigned int l1, l2;
long int x1, x2;
char *p1, *p2;
int res;

p1 = ifp1->name;
p2 = ifp2->name;

while (1) {
/* look up to any number */
l1 = strcspn(p1, "0123456789");
l2 = strcspn(p2, "0123456789");

/* name lengths are different -> compare names */
if (l1 != l2)
return (strcmp(p1, p2));

res = strncmp(p1, p2, l1);

/* names are different -> compare them */
if (res)
return res;

/* with identical name part, go to numeric part */

p1 += l1;
p2 += l1;

x1 = strtol(p1, &p1, 10);
x2 = strtol(p2, &p2, 10);

/* let's compare numbers now */
if (x1 < x2)
return -1;
if (x1 > x2)
return 1;

/* numbers were equal, lets do it again..
(it happens with name like "eth123.456:789") */
}
}

/* Create new interface structure. */
struct interface *
if_new ()
Expand All @@ -58,13 +105,17 @@ if_new ()
}

struct interface *
if_create ()
if_create (char *name, int namelen)
{
struct interface *ifp;

ifp = if_new ();

listnode_add (iflist, ifp);
assert (name);
assert (namelen <= (INTERFACE_NAMSIZ + 1));
strncpy (ifp->name, name, namelen);
ifp->name[INTERFACE_NAMSIZ] = '\0';
listnode_add_sort (iflist, ifp);
ifp->connected = list_new ();
ifp->connected->del = (void (*) (void *)) connected_free;

Expand Down Expand Up @@ -248,10 +299,7 @@ if_get_by_name (char *name)

ifp = if_lookup_by_name (name);
if (ifp == NULL)
{
ifp = if_create ();
strncpy (ifp->name, name, IFNAMSIZ);
}
ifp = if_create (name, INTERFACE_NAMSIZ);
return ifp;
}

Expand Down Expand Up @@ -430,10 +478,7 @@ DEFUN (interface,
ifp = if_lookup_by_name (argv[0]);

if (ifp == NULL)
{
ifp = if_create ();
strncpy (ifp->name, argv[0], INTERFACE_NAMSIZ);
}
ifp = if_create (argv[0], INTERFACE_NAMSIZ);
vty->index = ifp;
vty->node = INTERFACE_NODE;

Expand Down Expand Up @@ -803,8 +848,10 @@ if_init ()
iflist = list_new ();
ifaddr_ipv4_table = route_table_init ();

if (iflist)
if (iflist) {
iflist->cmp = (int (*)(void *, void *))if_cmp_func;
return;
}

memset (&if_master, 0, sizeof if_master);
}
3 changes: 2 additions & 1 deletion lib/if.h
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,9 @@ struct connected
#endif /* IFF_LINK2 */

/* Prototypes. */
int if_cmp_func (struct interface *, struct interface *);
struct interface *if_new (void);
struct interface *if_create (void);
struct interface *if_create (char *name, int namelen);
struct interface *if_lookup_by_index (unsigned int);
struct interface *if_lookup_by_name (char *);
struct interface *if_lookup_exact_address (struct in_addr);
Expand Down
5 changes: 1 addition & 4 deletions lib/zclient.c
Original file line number Diff line number Diff line change
Expand Up @@ -555,10 +555,7 @@ zebra_interface_add_read (struct stream *s)

/* If such interface does not exist, make new one. */
if (! ifp)
{
ifp = if_create ();
strncpy (ifp->name, ifname_tmp, IFNAMSIZ);
}
ifp = if_create (ifname_tmp, INTERFACE_NAMSIZ);

/* Read interface's index. */
ifp->ifindex = stream_getl (s);
Expand Down
6 changes: 3 additions & 3 deletions ospfd/ospf_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -745,7 +745,8 @@ ospf_vl_new (struct ospf *ospf, struct ospf_vl_data *vl_data)
if (IS_DEBUG_OSPF_EVENT)
zlog_info ("ospf_vl_new(): creating pseudo zebra interface");

vi = if_create ();
snprintf (ifname, INTERFACE_NAMSIZ + 1, "VLINK%d", vlink_count);
vi = if_create (ifname, INTERFACE_NAMSIZ);
co = connected_new ();
co->ifp = vi;
listnode_add (vi->connected, co);
Expand All @@ -769,10 +770,9 @@ ospf_vl_new (struct ospf *ospf, struct ospf_vl_data *vl_data)
voi->ifp->mtu = OSPF_VL_MTU;
voi->type = OSPF_IFTYPE_VIRTUALLINK;

sprintf (ifname, "VLINK%d", vlink_count++);
vlink_count++;
if (IS_DEBUG_OSPF_EVENT)
zlog_info ("ospf_vl_new(): Created name: %s", ifname);
strncpy (vi->name, ifname, IFNAMSIZ);
if (IS_DEBUG_OSPF_EVENT)
zlog_info ("ospf_vl_new(): set if->name to %s", vi->name);

Expand Down
3 changes: 1 addition & 2 deletions zebra/kernel_socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,9 +219,8 @@ ifm_read (struct if_msghdr *ifm)
return -1;
}

ifp = if_create ();
ifp = if_create (sdl->sdl_data, sdl->sdl_nlen);

strncpy (ifp->name, sdl->sdl_data, sdl->sdl_nlen);
ifp->ifindex = ifm->ifm_index;
ifp->flags = ifm->ifm_flags;
#if defined(__bsdi__)
Expand Down

0 comments on commit 106d2fd

Please sign in to comment.