On 11/17/20 1:48 AM, Shi Lei wrote:
> Signed-off-by: Shi Lei <shi_lei(a)massclouds.com>
> ---
> src/util/virnetlink.c | 25 +++++++++++++++++++++++++
> src/util/virnetlink.h | 1 +
> 2 files changed, 26 insertions(+)
>
> diff --git a/src/util/virnetlink.c b/src/util/virnetlink.c
> index fdd3a6a4..e191f63b 100644
> --- a/src/util/virnetlink.c
> +++ b/src/util/virnetlink.c
> @@ -41,6 +41,18 @@ VIR_LOG_INIT("util.netlink");
> #define NETLINK_ACK_TIMEOUT_S (2*1000)
>
> #if defined(WITH_LIBNL)
> +
> +/*
> + * VETH_INFO_PEER is defined in libnl, but it isn't exposed.
> + * We include it just like what iproute2 has done.
This is actually defined as a part of the basic netlink .h files, and is
available in /usr/include/linux/veth.h. The file in iproute2 is just a
copy of that file (in include/uapi/linux/veth.h). I'm not sure why they
did that, possibly so they could build an ip binary containing the "new"
(at the time) veth support on a machine that was still lacking support
in the kernel header files?.
Anyway, I replaced this open-coded definition of VETH_INFO_* with
#include <linux/veth.h> and everything built with no problem. And I've
checked and that file is present in the kernel headers at least as far
back as kernel-3.18 (and we don't support anything older than that).
So, when you send V2 with the change I outlined in my review of Patch
2/2, could you replace this enum with the proper #include?
Thanks!
Okay. I also don't like introducing that enum.
Thanks for letting me know :-)
Shi Lei
> + */
> +enum {
> + VETH_INFO_UNSPEC,
> + VETH_INFO_PEER,
> +
> + __VETH_INFO_MAX
> +};
> +
> /* State for a single netlink event handle */
> struct virNetlinkEventHandle {
> int watch;
> @@ -535,6 +547,19 @@ virNetlinkNewLink(const char *ifname,
> NETLINK_MSG_NEST_END(nl_msg, infodata);
> }
>
> + if (STREQ(type, "veth") && extra_args &&
extra_args->veth_peer) {
> + struct nlattr *infoveth = NULL;
> +
> + NETLINK_MSG_NEST_START(nl_msg, infodata, IFLA_INFO_DATA);
> + NETLINK_MSG_NEST_START(nl_msg, infoveth, VETH_INFO_PEER);
> + nlmsg_reserve(nl_msg, sizeof(struct ifinfomsg), 0);
> + NETLINK_MSG_PUT(nl_msg, IFLA_IFNAME,
> + (strlen(extra_args->veth_peer) + 1),
> + extra_args->veth_peer);
> + NETLINK_MSG_NEST_END(nl_msg, infoveth);
> + NETLINK_MSG_NEST_END(nl_msg, infodata);
> + }
> +
> NETLINK_MSG_NEST_END(nl_msg, linkinfo);
>
> if (extra_args) {
> diff --git a/src/util/virnetlink.h b/src/util/virnetlink.h
> index 7121eac4..7c4ed202 100644
> --- a/src/util/virnetlink.h
> +++ b/src/util/virnetlink.h
> @@ -84,6 +84,7 @@ struct _virNetlinkNewLinkData {
> const int *ifindex; /* The index for the 'link' device */
> const virMacAddr *mac; /* The MAC address of the device */
> const uint32_t *macvlan_mode; /* The mode of macvlan */
> + const char *veth_peer; /* The peer name for veth */
> };
>
> int virNetlinkNewLink(const char *ifname,