routedesc, nl_msg_type_to_str(cmd), label);
}
+static int netlink_configure_arp(struct interface *ifp, int family, ns_id_t ns_id)
+{
+ struct {
+ struct nlmsghdr n;
+ struct ndtmsg ndtm;
+ char buf[256];
+ } req;
+ struct zebra_ns *zns = zebra_ns_lookup(ns_id);
+ struct rtattr *nest;
+ uint32_t val;
+
+ memset(&req, 0, sizeof(req));
+
+ req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndtmsg));
+ req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_REPLACE;
+ req.n.nlmsg_type = RTM_SETNEIGHTBL;
+ req.n.nlmsg_pid = zns->netlink_cmd.snl.nl_pid;
+
+ req.ndtm.ndtm_family = family;
+
+ nl_attr_put(&req.n, sizeof(req), NDTA_NAME, family == AF_INET ? "arp_cache" :
+ "ndisc_cache", 10);
+
+ nest = nl_attr_nest(&req.n, sizeof(req), NDTA_PARMS);
+ if (nest == NULL)
+ return;
+ if (!nl_attr_put(&req.n, sizeof(req), NDTPA_IFINDEX, &ifp->ifindex,
+ sizeof(ifp->ifindex)))
+ return 0;
+ val = 1;
+ if (!nl_attr_put(&req.n, sizeof(req), NDTPA_APP_PROBES, &val,
+ sizeof(val)))
+ return 0;
+ val = 0;
+ if (!nl_attr_put(&req.n, sizeof(req), NDTPA_MCAST_PROBES, &val,
+ sizeof(val)))
+ return 0;
+ if (!nl_attr_put(&req.n, sizeof(req), NDTPA_UCAST_PROBES, &val,
+ sizeof(val)))
+ return 0;
+ nl_attr_nest_end(&req.n, nest);
+
+ return netlink_talk(netlink_talk_filter, &req.n, &zns->netlink_cmd, zns,
+ 0);
+}
+
static int netlink_neigh_update(int cmd, int ifindex, void *addr, char *lla,
int llalen, ns_id_t ns_id, uint8_t family,
bool permanent, uint8_t protocol)
false);
}
+int kernel_configure_arp(struct interface *ifp, int family,
+ ns_id_t ns_id)
+{
+ return netlink_configure_arp(ifp, family, ns_id);
+}
+
/*
* MPLS label forwarding table change via netlink interface, using dataplane
* context information.
return;
}
+static inline void zebra_configure_arp(ZAPI_HANDLER_ARGS)
+{
+ struct stream *s;
+ int fam;
+ ifindex_t idx;
+ struct interface *ifp;
+ ns_id_t ns_id;
+
+ s = msg;
+ STREAM_GETC(s, fam);
+ if (fam != AF_INET && fam != AF_INET6)
+ return;
+ STREAM_GETL(s, idx);
+ ifp = if_lookup_by_index_per_ns(zvrf->zns, idx);
+ if (!ifp)
+ return;
+ ns_id = zvrf->zns->ns_id;
+ kernel_configure_arp(ifp, fam, ns_id);
+stream_failure:
+ return;
+}
+
static inline void zebra_neigh_add(ZAPI_HANDLER_ARGS)
{
struct stream *s;
[ZEBRA_NEIGH_DEL] = zebra_neigh_del,
[ZEBRA_NHRP_NEIGH_REGISTER] = zebra_neigh_register,
[ZEBRA_NHRP_NEIGH_UNREGISTER] = zebra_neigh_unregister,
+ [ZEBRA_CONFIGURE_ARP] = zebra_configure_arp,
};
/*