diff --git a/src/lxc/network.c b/src/lxc/network.c index c56794be0..8a5861e50 100644 --- a/src/lxc/network.c +++ b/src/lxc/network.c @@ -170,6 +170,42 @@ out: return err; } +int lxc_device_delete_index(int ifindex) +{ + struct nl_handler nlh; + struct nlmsg *nlmsg = NULL, *answer = NULL; + struct link_req *link_req; + int err = -1; + + if (netlink_open(&nlh, NETLINK_ROUTE)) + return -1; + + nlmsg = nlmsg_alloc(NLMSG_GOOD_SIZE); + if (!nlmsg) + goto out; + + answer = nlmsg_alloc(NLMSG_GOOD_SIZE); + if (!answer) + goto out; + + link_req = (struct link_req *)nlmsg; + link_req->ifinfomsg.ifi_family = AF_UNSPEC; + link_req->ifinfomsg.ifi_index = ifindex; + nlmsg->nlmsghdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); + nlmsg->nlmsghdr.nlmsg_flags = NLM_F_ACK|NLM_F_REQUEST; + nlmsg->nlmsghdr.nlmsg_type = RTM_DELLINK; + + if (netlink_transaction(&nlh, nlmsg, answer)) + goto out; + + err = 0; +out: + netlink_close(&nlh); + nlmsg_free(answer); + nlmsg_free(nlmsg); + return err; +} + static int device_set_flag(const char *name, int flag) { struct nl_handler nlh; diff --git a/src/lxc/network.h b/src/lxc/network.h index 7bac5ee5e..59f2a4180 100644 --- a/src/lxc/network.h +++ b/src/lxc/network.h @@ -38,6 +38,11 @@ extern int lxc_device_move(int ifindex, pid_t pid); */ extern int lxc_device_delete(const char *name); +/* + * Delete a network device by the index + */ +extern int lxc_device_delete_index(int ifindex); + /* * Set the device network up */