Skip to content

Commit

Permalink
Merge pull request #1546 from pguibert6WIND/issue__1537
Browse files Browse the repository at this point in the history
Issue  1537
  • Loading branch information
donaldsharp authored Dec 14, 2017
2 parents cb9cef7 + 8aa416a commit 9b7e34e
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 31 deletions.
10 changes: 10 additions & 0 deletions zebra/if_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -838,6 +838,16 @@ int kernel_address_delete_ipv4(struct interface *ifp, struct connected *ifc)
return netlink_address(RTM_DELADDR, AF_INET, ifp, ifc);
}

int kernel_address_add_ipv6 (struct interface *ifp, struct connected *ifc)
{
return netlink_address (RTM_NEWADDR, AF_INET6, ifp, ifc);
}

int kernel_address_delete_ipv6 (struct interface *ifp, struct connected *ifc)
{
return netlink_address (RTM_DELADDR, AF_INET6, ifp, ifc);
}

int netlink_interface_addr(struct sockaddr_nl *snl, struct nlmsghdr *h,
ns_id_t ns_id, int startup)
{
Expand Down
39 changes: 8 additions & 31 deletions zebra/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ int if_ioctl(u_long request, caddr_t buffer)
return 0;
}

#ifndef HAVE_NETLINK
static int if_ioctl_ipv6(u_long request, caddr_t buffer)
{
int sock;
Expand Down Expand Up @@ -108,6 +109,7 @@ static int if_ioctl_ipv6(u_long request, caddr_t buffer)
}
return 0;
}
#endif /* ! HAVE_NETLINK */

/*
* get interface metric
Expand Down Expand Up @@ -460,44 +462,19 @@ struct in6_ifreq {
int ifr6_ifindex;
};
#endif /* _LINUX_IN6_H */

/* Interface's address add/delete functions. */
int if_prefix_add_ipv6(struct interface *ifp, struct connected *ifc)
{
int ret;
struct prefix_ipv6 *p;
struct in6_ifreq ifreq;

p = (struct prefix_ipv6 *)ifc->address;

memset(&ifreq, 0, sizeof(struct in6_ifreq));

memcpy(&ifreq.ifr6_addr, &p->prefix, sizeof(struct in6_addr));
ifreq.ifr6_ifindex = ifp->ifindex;
ifreq.ifr6_prefixlen = p->prefixlen;

ret = if_ioctl_ipv6(SIOCSIFADDR, (caddr_t)&ifreq);

return ret;
#ifdef HAVE_NETLINK
return kernel_address_add_ipv6 (ifp, ifc);
#endif /* HAVE_NETLINK */
}

int if_prefix_delete_ipv6(struct interface *ifp, struct connected *ifc)
{
int ret;
struct prefix_ipv6 *p;
struct in6_ifreq ifreq;

p = (struct prefix_ipv6 *)ifc->address;

memset(&ifreq, 0, sizeof(struct in6_ifreq));

memcpy(&ifreq.ifr6_addr, &p->prefix, sizeof(struct in6_addr));
ifreq.ifr6_ifindex = ifp->ifindex;
ifreq.ifr6_prefixlen = p->prefixlen;

ret = if_ioctl_ipv6(SIOCDIFADDR, (caddr_t)&ifreq);

return ret;
#ifdef HAVE_NETLINK
return kernel_address_delete_ipv6 (ifp, ifc);
#endif /* HAVE_NETLINK */
}
#else /* LINUX_IPV6 */
#ifdef HAVE_STRUCT_IN6_ALIASREQ
Expand Down
2 changes: 2 additions & 0 deletions zebra/rt.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ extern void kernel_route_rib_pass_fail(struct prefix *p,

extern int kernel_address_add_ipv4(struct interface *, struct connected *);
extern int kernel_address_delete_ipv4(struct interface *, struct connected *);
extern int kernel_address_add_ipv6 (struct interface *, struct connected *);
extern int kernel_address_delete_ipv6 (struct interface *, struct connected *);
extern int kernel_neigh_update(int, int, uint32_t, char *, int);
extern int kernel_interface_set_master(struct interface *master,
struct interface *slave);
Expand Down

0 comments on commit 9b7e34e

Please sign in to comment.