25 #include <netlink-private/netlink.h>
26 #include <netlink/netlink.h>
27 #include <netlink/attr.h>
28 #include <netlink/utils.h>
29 #include <netlink/object.h>
30 #include <netlink/route/rtnl.h>
31 #include <netlink-private/route/link/api.h>
32 #include <netlink/route/link/veth.h>
34 #include <linux/if_link.h>
36 static struct nla_policy veth_policy[VETH_INFO_MAX+1] = {
37 [VETH_INFO_PEER] = { .
minlen =
sizeof(
struct ifinfomsg) },
40 static int veth_parse(
struct rtnl_link *link,
struct nlattr *data,
41 struct nlattr *xstats)
43 struct nlattr *tb[VETH_INFO_MAX+1];
44 struct nlattr *peer_tb[IFLA_MAX + 1];
48 NL_DBG(3,
"Parsing veth link info");
53 if (tb[VETH_INFO_PEER]) {
54 struct nlattr *nla_peer;
55 struct ifinfomsg *ifi;
57 nla_peer = tb[VETH_INFO_PEER];
60 peer->l_family = ifi->ifi_family;
61 peer->l_arptype = ifi->ifi_type;
62 peer->l_index = ifi->ifi_index;
63 peer->l_flags = ifi->ifi_flags;
64 peer->l_change = ifi->ifi_change;
66 nla_data(nla_peer) +
sizeof(
struct ifinfomsg),
67 nla_len(nla_peer) -
sizeof(
struct ifinfomsg),
72 err = rtnl_link_info_parse(peer, peer_tb);
94 nl_dump_line(p,
"%s\n", name);
96 nl_dump_line(p,
"%u\n", peer->l_index);
101 struct rtnl_link *dst_peer , *src_peer = src->l_info;
105 if (!dst_peer || !src_peer)
112 memcpy(dst_peer, src_peer,
sizeof(
struct rtnl_link));
117 static int veth_put_attrs(
struct nl_msg *msg,
struct rtnl_link *link)
120 struct ifinfomsg ifi;
121 struct nlattr *data, *info_peer;
123 memset(&ifi, 0,
sizeof ifi);
124 ifi.ifi_family = peer->l_family;
125 ifi.ifi_type = peer->l_arptype;
126 ifi.ifi_index = peer->l_index;
127 ifi.ifi_flags = peer->l_flags;
128 ifi.ifi_change = peer->l_change;
134 if (
nlmsg_append(msg, &ifi,
sizeof(ifi), NLMSG_ALIGNTO) < 0)
136 rtnl_link_fill_info(msg, peer);
143 static struct rtnl_link_info_ops veth_info_ops = {
145 .io_parse = veth_parse,
150 .io_clone = veth_clone,
151 .io_put_attrs = veth_put_attrs,
156 #define IS_VETH_LINK_ASSERT(link) \
157 if ((link)->l_info_ops != &veth_info_ops) { \
158 APPBUG("Link is not a veth link. set type \"veth\" first."); \
208 IS_VETH_LINK_ASSERT(link);
231 return link->l_info_ops && !strcmp(link->l_info_ops->io_name,
"veth");
249 const char *peer_name, pid_t pid)
252 int err = -NLE_NOMEM;
258 if (name && peer_name) {
263 rtnl_link_set_ns_pid(peer, pid);
274 static void __init veth_init(
void)
279 static void __exit veth_exit(
void)