[libvirt] [libvirt PATCH] 802.1Qbh: Add support for IFLA_VF_MAC
Stefan Berger
stefanb at linux.vnet.ibm.com
Sat Dec 11 18:55:41 UTC 2010
On 12/10/2010 04:32 PM, Roopa Prabhu wrote:
> From: Roopa Prabhu<roprabhu at cisco.com>
>
> Current code does not pass VM mac address to a 802.1Qbh direct attach
> interface using IFLA_VF_MAC. This patch adds support in macvtap code to
> send IFLA_VF_MAC netlink request during port profile association on a
> 802.1Qbh interface.
>
> Stefan Cc'ed for comments because this patch changes a condition for
> 802.1Qbg
Thanks for cc'ing. I am also cc'ing Jens Osterkamp whose lldpad
extensions need to be able to cope with this change.
> 802.1Qbh support for IFLA_VF_MAC in enic driver has been posted and is
> pending acceptance at http://marc.info/?l=linux-netdev&m=129185244410557&w=2
>
> Signed-off-by: Roopa Prabhu<roprabhu at cisco.com>
> Signed-off-by: David Wang<dwang2 at cisco.com>
> Signed-off-by: Christian Benvenuti<benve at cisco.com>
> ---
> src/util/macvtap.c | 59 ++++++++++++++++++++++++++++------------------------
> 1 files changed, 32 insertions(+), 27 deletions(-)
>
>
> diff --git a/src/util/macvtap.c b/src/util/macvtap.c
> index 4345d97..96df301 100644
> --- a/src/util/macvtap.c
> +++ b/src/util/macvtap.c
> @@ -1031,19 +1031,8 @@ doPortProfileOpSetLink(bool nltarget_kernel,
> nla_put(nl_msg, IFLA_IFNAME, strlen(ifname)+1, ifname)< 0)
> goto buffer_too_small;
>
> - if (macaddr&& vlanid>= 0) {
> + if (macaddr || vlanid>= 0) {
> struct nlattr *vfinfolist, *vfinfo;
> - struct ifla_vf_mac ifla_vf_mac = {
> - .vf = vf,
> - .mac = { 0, },
> - };
> - struct ifla_vf_vlan ifla_vf_vlan = {
> - .vf = vf,
> - .vlan = vlanid,
> - .qos = 0,
> - };
> -
> - memcpy(ifla_vf_mac.mac, macaddr, 6);
>
> if (!(vfinfolist = nla_nest_start(nl_msg, IFLA_VFINFO_LIST)))
> goto buffer_too_small;
> @@ -1051,13 +1040,30 @@ doPortProfileOpSetLink(bool nltarget_kernel,
> if (!(vfinfo = nla_nest_start(nl_msg, IFLA_VF_INFO)))
> goto buffer_too_small;
>
> - if (!nla_put(nl_msg, IFLA_VF_MAC, sizeof(ifla_vf_mac),
> -&ifla_vf_mac)< 0)
> - goto buffer_too_small;
> + if (macaddr) {
> + struct ifla_vf_mac ifla_vf_mac = {
> + .vf = vf,
> + .mac = { 0, },
> + };
>
> - if (!nla_put(nl_msg, IFLA_VF_VLAN, sizeof(ifla_vf_vlan),
> -&ifla_vf_vlan)< 0)
> - goto buffer_too_small;
> + memcpy(ifla_vf_mac.mac, macaddr, 6);
> +
> + if (!nla_put(nl_msg, IFLA_VF_MAC, sizeof(ifla_vf_mac),
> +&ifla_vf_mac)< 0)
> + goto buffer_too_small;
> + }
> +
> + if (vlanid>= 0) {
> + struct ifla_vf_vlan ifla_vf_vlan = {
> + .vf = vf,
> + .vlan = vlanid,
> + .qos = 0,
> + };
> +
> + if (!nla_put(nl_msg, IFLA_VF_VLAN, sizeof(ifla_vf_vlan),
> +&ifla_vf_vlan)< 0)
> + goto buffer_too_small;
> + }
>
> nla_nest_end(nl_msg, vfinfo);
> nla_nest_end(nl_msg, vfinfolist);
> @@ -1402,6 +1408,7 @@ getPhysfn(const char *linkdev,
>
> static int
> doPortProfileOp8021Qbh(const char *ifname,
> + const unsigned char *macaddr,
> const virVirtualPortProfileParamsPtr virtPort,
> const unsigned char *vm_uuid,
> enum virVirtualPortOp virtPortOp)
> @@ -1411,6 +1418,7 @@ doPortProfileOp8021Qbh(const char *ifname,
> # ifndef IFLA_VF_PORT_MAX
>
> (void)ifname;
> + (void)macaddr;
> (void)virtPort;
> (void)vm_uuid;
> (void)virtPortOp;
> @@ -1426,7 +1434,6 @@ doPortProfileOp8021Qbh(const char *ifname,
> bool nltarget_kernel = true;
> int ifindex;
> int vlanid = -1;
> - const unsigned char *macaddr = NULL;
>
> rc = getPhysfn(ifname,&vf,&physfndev);
> if (rc)
> @@ -1456,7 +1463,7 @@ doPortProfileOp8021Qbh(const char *ifname,
> /* Association timed out, disassociate */
> doPortProfileOpCommon(nltarget_kernel, NULL, ifindex,
> NULL,
> - 0,
> + vlanid,
> NULL,
> NULL,
> NULL,
> @@ -1470,7 +1477,7 @@ doPortProfileOp8021Qbh(const char *ifname,
> case DISASSOCIATE:
> rc = doPortProfileOpCommon(nltarget_kernel, NULL, ifindex,
> NULL,
> - 0,
> + vlanid,
> NULL,
> NULL,
> NULL,
> @@ -1545,9 +1552,8 @@ vpAssociatePortProfileId(const char *macvtap_ifname,
> /* avoid associating twice */
> if (vmOp == VIR_VM_OP_MIGRATE_IN_FINISH)
> break;
> - rc = doPortProfileOp8021Qbh(linkdev, virtPort,
> - vmuuid,
> - ASSOCIATE);
> + rc = doPortProfileOp8021Qbh(linkdev, macvtap_macaddr,
> + virtPort, vmuuid, ASSOCIATE);
> break;
> }
>
> @@ -1594,9 +1600,8 @@ vpDisassociatePortProfileId(const char *macvtap_ifname,
> /* avoid disassociating twice */
> if (vmOp == VIR_VM_OP_MIGRATE_IN_FINISH)
> break;
> - rc = doPortProfileOp8021Qbh(linkdev, virtPort,
> - NULL,
> - DISASSOCIATE);
> + rc = doPortProfileOp8021Qbh(linkdev, macvtap_macaddr,
> + virtPort, NULL, DISASSOCIATE);
> break;
> }
>
>
The change looks good to me.
Regards,
Stefan
More information about the libvir-list
mailing list