return 0;
}
+static void veth_free(struct rtnl_link *link)
+{
+ struct rtnl_link *peer = rtnl_link_veth_get_peer(link);
+ if (peer) {
+ link->l_info = NULL;
+ /* avoid calling this recursively */
+ peer->l_info = NULL;
+ rtnl_link_put(peer);
+ }
+ /* the caller should finally free link */
+}
+
static struct rtnl_link_info_ops veth_info_ops = {
.io_name = "veth",
.io_parse = veth_parse,
.io_alloc = veth_alloc,
.io_clone = veth_clone,
.io_put_attrs = veth_put_attrs,
+ .io_free = veth_free,
};
/** @cond SKIP */
*/
void rtnl_link_veth_release(struct rtnl_link *link)
{
- struct rtnl_link *peer = rtnl_link_veth_get_peer(link);
- rtnl_link_put(peer);
+ veth_free(link);
rtnl_link_put(link);
}
rtnl_link_set_ns_pid(peer, pid);
err = rtnl_link_add(sock, link, NLM_F_CREATE);
- rtnl_link_put(peer);
rtnl_link_put(link);
-
return err;
}