{
struct nlmsghdr *nh;
u8 *p;
- memset (m, 0, sizeof (vnet_netlink_msg_t));
+ clib_memset (m, 0, sizeof (vnet_netlink_msg_t));
vec_add2 (m->data, p, NLMSG_SPACE (msg_len));
ASSERT (m->data == p);
return clib_error_return_unix (0, "socket(AF_NETLINK)");
ra.nl_family = AF_NETLINK;
- ra.nl_pid = getpid ();
+ ra.nl_pid = 0;
if ((bind (sock, (struct sockaddr *) &ra, sizeof (ra))) == -1)
{
{
vnet_netlink_msg_t m;
struct ifinfomsg ifmsg = { 0 };
+ clib_error_t *err = 0;
ifmsg.ifi_index = ifindex;
vnet_netlink_msg_init (&m, RTM_SETLINK, NLM_F_REQUEST,
vnet_netlink_msg_add_rtattr (&m, IFLA_IFNAME, new_ifname,
strlen (new_ifname) + 1);
- return vnet_netlink_msg_send (&m);
+ err = vnet_netlink_msg_send (&m);
+ if (err)
+ err = clib_error_return (0, "set link name %U", format_clib_error, err);
+ return err;
}
clib_error_t *
{
vnet_netlink_msg_t m;
struct ifinfomsg ifmsg = { 0 };
+ clib_error_t *err = 0;
ifmsg.ifi_index = ifindex;
vnet_netlink_msg_init (&m, RTM_SETLINK, NLM_F_REQUEST,
vnet_netlink_msg_add_rtattr (&m, IFLA_IFNAME, new_ifname,
strlen (new_ifname) + 1);
- return vnet_netlink_msg_send (&m);
+ err = vnet_netlink_msg_send (&m);
+ if (err)
+ err = clib_error_return (0, "set link netns %U", format_clib_error, err);
+ return err;
}
clib_error_t *
vnet_netlink_msg_t m;
struct ifinfomsg ifmsg = { 0 };
int i;
+ clib_error_t *err = 0;
ifmsg.ifi_index = ifindex;
vnet_netlink_msg_init (&m, RTM_SETLINK, NLM_F_REQUEST,
&ifmsg, sizeof (struct ifinfomsg));
vnet_netlink_msg_add_rtattr (&m, IFLA_MASTER, &i, sizeof (int));
- return vnet_netlink_msg_send (&m);
+ err = vnet_netlink_msg_send (&m);
+ if (err)
+ err = clib_error_return (0, "set link master %U", format_clib_error, err);
+ return err;
}
clib_error_t *
{
vnet_netlink_msg_t m;
struct ifinfomsg ifmsg = { 0 };
+ clib_error_t *err = 0;
ifmsg.ifi_index = ifindex;
vnet_netlink_msg_init (&m, RTM_SETLINK, NLM_F_REQUEST,
&ifmsg, sizeof (struct ifinfomsg));
vnet_netlink_msg_add_rtattr (&m, IFLA_ADDRESS, mac, 6);
- return vnet_netlink_msg_send (&m);
+ err = vnet_netlink_msg_send (&m);
+ if (err)
+ err = clib_error_return (0, "set link addr %U", format_clib_error, err);
+ return err;
}
clib_error_t *
{
vnet_netlink_msg_t m;
struct ifinfomsg ifmsg = { 0 };
+ clib_error_t *err = 0;
ifmsg.ifi_flags = IFF_UP;
ifmsg.ifi_change = IFF_UP;
vnet_netlink_msg_init (&m, RTM_SETLINK, NLM_F_REQUEST,
&ifmsg, sizeof (struct ifinfomsg));
- return vnet_netlink_msg_send (&m);
+ err = vnet_netlink_msg_send (&m);
+ if (err)
+ err = clib_error_return (0, "set link state %U", format_clib_error, err);
+ return err;
}
clib_error_t *
{
vnet_netlink_msg_t m;
struct ifinfomsg ifmsg = { 0 };
+ clib_error_t *err = 0;
ifmsg.ifi_index = ifindex;
vnet_netlink_msg_init (&m, RTM_SETLINK, NLM_F_REQUEST,
&ifmsg, sizeof (struct ifinfomsg));
vnet_netlink_msg_add_rtattr (&m, IFLA_MTU, &mtu, sizeof (int));
- return vnet_netlink_msg_send (&m);
+ err = vnet_netlink_msg_send (&m);
+ if (err)
+ err = clib_error_return (0, "set link mtu %U", format_clib_error, err);
+ return err;
}
clib_error_t *
{
vnet_netlink_msg_t m;
struct ifaddrmsg ifa = { 0 };
+ clib_error_t *err = 0;
ifa.ifa_family = AF_INET;
ifa.ifa_prefixlen = pfx_len;
vnet_netlink_msg_add_rtattr (&m, IFA_LOCAL, addr, 4);
vnet_netlink_msg_add_rtattr (&m, IFA_ADDRESS, addr, 4);
- return vnet_netlink_msg_send (&m);
+ err = vnet_netlink_msg_send (&m);
+ if (err)
+ err = clib_error_return (0, "add ip4 addr %U", format_clib_error, err);
+ return err;
}
clib_error_t *
{
vnet_netlink_msg_t m;
struct ifaddrmsg ifa = { 0 };
+ clib_error_t *err = 0;
ifa.ifa_family = AF_INET6;
ifa.ifa_prefixlen = pfx_len;
vnet_netlink_msg_add_rtattr (&m, IFA_LOCAL, addr, 16);
vnet_netlink_msg_add_rtattr (&m, IFA_ADDRESS, addr, 16);
- return vnet_netlink_msg_send (&m);
+ err = vnet_netlink_msg_send (&m);
+ if (err)
+ err = clib_error_return (0, "add ip6 addr %U", format_clib_error, err);
+ return err;
+}
+
+clib_error_t *
+vnet_netlink_add_ip4_route (void *dst, u8 dst_len, void *gw)
+{
+ vnet_netlink_msg_t m;
+ struct rtmsg rtm = { 0 };
+ u8 dflt[4] = { 0 };
+ clib_error_t *err = 0;
+
+ rtm.rtm_family = AF_INET;
+ rtm.rtm_table = RT_TABLE_MAIN;
+ rtm.rtm_type = RTN_UNICAST;
+ rtm.rtm_dst_len = dst_len;
+
+ vnet_netlink_msg_init (&m, RTM_NEWROUTE,
+ NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL,
+ &rtm, sizeof (struct rtmsg));
+
+ vnet_netlink_msg_add_rtattr (&m, RTA_GATEWAY, gw, 4);
+ vnet_netlink_msg_add_rtattr (&m, RTA_DST, dst ? dst : dflt, 4);
+ err = vnet_netlink_msg_send (&m);
+ if (err)
+ err = clib_error_return (0, "add ip4 route %U", format_clib_error, err);
+ return err;
+}
+
+clib_error_t *
+vnet_netlink_add_ip6_route (void *dst, u8 dst_len, void *gw)
+{
+ vnet_netlink_msg_t m;
+ struct rtmsg rtm = { 0 };
+ u8 dflt[16] = { 0 };
+ clib_error_t *err = 0;
+
+ rtm.rtm_family = AF_INET6;
+ rtm.rtm_table = RT_TABLE_MAIN;
+ rtm.rtm_type = RTN_UNICAST;
+ rtm.rtm_dst_len = dst_len;
+
+ vnet_netlink_msg_init (&m, RTM_NEWROUTE,
+ NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL,
+ &rtm, sizeof (struct rtmsg));
+
+ vnet_netlink_msg_add_rtattr (&m, RTA_GATEWAY, gw, 16);
+ vnet_netlink_msg_add_rtattr (&m, RTA_DST, dst ? dst : dflt, 16);
+ err = vnet_netlink_msg_send (&m);
+ if (err)
+ err = clib_error_return (0, "add ip6 route %U", format_clib_error, err);
+ return err;
}
/*