{
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)
{
return vnet_netlink_msg_send (&m);
}
+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 };
+
+ 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);
+ return vnet_netlink_msg_send (&m);
+}
+
+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 };
+
+ 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);
+ return vnet_netlink_msg_send (&m);
+}
+
/*
* fd.io coding-style-patch-verification: ON
*