From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8B621C43381 for ; Tue, 26 Feb 2019 13:51:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3B9C421841 for ; Tue, 26 Feb 2019 13:51:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=Mellanox.com header.i=@Mellanox.com header.b="aDfhwv+k" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726921AbfBZNvY (ORCPT ); Tue, 26 Feb 2019 08:51:24 -0500 Received: from mail-eopbgr40075.outbound.protection.outlook.com ([40.107.4.75]:54192 "EHLO EUR03-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725954AbfBZNvY (ORCPT ); Tue, 26 Feb 2019 08:51:24 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6ItD69rbKk5a0kgrV+gc9RMY65Dklglo/25BNQH1nSc=; b=aDfhwv+kwD5Pwzq/e8wq/r22k11IxiGG4zYBaO3yyRRbO5FDt+tXRBC2wa1LgjZtsY4AVoahe3IBIjmJvP/z3eTjyb1aCmDxZUQZfKq1wv2MtgndgnN4S9+3YOeMKMCj6/PMFXFNAM3nK6dWrewupD0FIUuEWx2AT8Cw/y2i3sU= Received: from VI1PR05MB3247.eurprd05.prod.outlook.com (10.170.238.16) by VI1PR05MB3360.eurprd05.prod.outlook.com (10.170.238.149) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1643.18; Tue, 26 Feb 2019 13:51:13 +0000 Received: from VI1PR05MB3247.eurprd05.prod.outlook.com ([fe80::210b:6763:af21:4f43]) by VI1PR05MB3247.eurprd05.prod.outlook.com ([fe80::210b:6763:af21:4f43%6]) with mapi id 15.20.1643.019; Tue, 26 Feb 2019 13:51:13 +0000 From: Petr Machata To: Roopa Prabhu CC: "davem@davemloft.net" , "netdev@vger.kernel.org" , "dsa@cumulusnetworks.com" , "sd@queasysnail.net" , "johannes@sipsolutions.net" Subject: Re: [PATCH net-next 1/2] vxlan: add extack support for create and changelink Thread-Topic: [PATCH net-next 1/2] vxlan: add extack support for create and changelink Thread-Index: AQHUzZj5T61NX3KyQEKyA9DSfurH4KXyGXYA Date: Tue, 26 Feb 2019 13:51:13 +0000 Message-ID: <87imx6fyk1.fsf@mellanox.com> References: <1551160982-32685-1-git-send-email-roopa@cumulusnetworks.com> <1551160982-32685-2-git-send-email-roopa@cumulusnetworks.com> In-Reply-To: <1551160982-32685-2-git-send-email-roopa@cumulusnetworks.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: AM6P195CA0006.EURP195.PROD.OUTLOOK.COM (2603:10a6:209:81::19) To VI1PR05MB3247.eurprd05.prod.outlook.com (2603:10a6:802:1c::16) authentication-results: spf=none (sender IP is ) smtp.mailfrom=petrm@mellanox.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [78.45.160.211] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 7d5c2ba4-62a6-491d-d825-08d69bf17898 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600127)(711020)(4605104)(4618075)(2017052603328)(7153060)(7193020);SRVR:VI1PR05MB3360; x-ms-traffictypediagnostic: VI1PR05MB3360: x-microsoft-exchange-diagnostics: =?iso-8859-1?Q?1;VI1PR05MB3360;23:fNmF2oVnf0LeDYADWiG1OB6+7+c43GBtSSzCMiT?= =?iso-8859-1?Q?1jV7TCK7PzWtQRC9hp22jBqjLGsESBnjBexi9C07COIvFp8AXPxwWlqNnf?= =?iso-8859-1?Q?EWma2/JrgbnDH5QYTcxXnpNl2jcQZ7W/u71/M8JHkeDpDVrOtCBsmgkS7D?= =?iso-8859-1?Q?Ay/N5WUUPgGKiz/CY5FOsyeuojedp+uxxmfhTv6BGB2HbkW+1jzZuBsL+A?= =?iso-8859-1?Q?6ukQqFF8Csa4ulLvD4AdCBF/D+g+q1x+dKHgH4F864QLJF5wvRH2C/mQv1?= =?iso-8859-1?Q?2UiuolluVIqzBTIP2OznYAo0xuBd2N/AyeOpwyBMwJ2upeLbLMV2vlmcTy?= =?iso-8859-1?Q?EBEmvv3lU8KbTDYmJLW53j8SJ4KpgKCLqaC9s9yzAw20NGde4EyyVOAuAv?= =?iso-8859-1?Q?IbhmHyjlqNl4IWF5MhkbzIfE5ORX+roaoh4zdgqZTIk3fw9RZ8PiVV6ukY?= =?iso-8859-1?Q?/HFGr9vyC6n0YMvL9p0AjkOSIUkzTQExy+PjdCeXU6k7pa6poEcGfsX//L?= =?iso-8859-1?Q?Hpret09Ap0Xv4a/Uo+VcLjhh52eW6XpkVu9JJkjhNahoC1lWzfylAjyNBY?= =?iso-8859-1?Q?BCZsmrH1BS4zXpnALexrN8G01OkLhSy0Cm2+6DF9bGCm1vncoXZNbjQa+v?= =?iso-8859-1?Q?8ghU01L1UlXL8In5mF2sHyXvfPVJmE9y6E+M+JlzNhrIi6+ARXhCvVimcZ?= =?iso-8859-1?Q?EQ90+jNH4VgA1VmVabr73AEFN9nJ7jrsMucShDgyslSRTn/CwI4LutVjc4?= =?iso-8859-1?Q?f9EUTMXZRRlH/yKnVksw0Kc/Xdp0LUx/KaNOsIIPSCZZWKwWp8/81VGD/K?= =?iso-8859-1?Q?FQb6mQA2lRLKnoM4BX//U+pnVMy3QzGjIw4EHusOqSvSkeb7acHZ2i4emL?= =?iso-8859-1?Q?VUxcss8HyHe2iv4itVfnGR3epPpGtqd1+9UdVZjB1oGRydDnSWH23mJ/Zr?= =?iso-8859-1?Q?B/JhjAKlxOduZtD2ngL1Fg80oF9uN4b6/e8vWrpQzKcniZLa0j91lJXaj6?= =?iso-8859-1?Q?6dEvb7T/oFONmyxOeGB7OdFCUmbYOBvtUKBLZNLMlPsrqx03pRWD9RwXHY?= =?iso-8859-1?Q?DBrc8703p7LGbYCAPeOo4aVZsROiueePUnFmQzEivfs++gnHiCCjhJfkTY?= =?iso-8859-1?Q?jds7eMVeYujfwKOEdy5Jc2eEGB+K00Rjal8T4LEq6x0PJfRLzYcuUgvkYg?= =?iso-8859-1?Q?dPCKtrS/oY23JDtNU6dek7+VfC/AhrBDPd7z8B8OaL8dndQN9YXk5E0TTH?= =?iso-8859-1?Q?bVlOd7e5+0R7ntNv6gMrFQVJpjYx1f0eDZtIxYKZqUbHrNif07IOAE6KWp?= =?iso-8859-1?Q?RA=3D?= x-microsoft-antispam-prvs: x-forefront-prvs: 096029FF66 x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(346002)(136003)(396003)(366004)(376002)(39860400002)(199004)(189003)(26005)(5660300002)(8936002)(99286004)(76176011)(476003)(2616005)(486006)(6246003)(186003)(97736004)(6916009)(102836004)(25786009)(68736007)(86362001)(14444005)(8676002)(81166006)(6506007)(105586002)(81156014)(256004)(4326008)(386003)(106356001)(6116002)(316002)(6486002)(305945005)(3846002)(2906002)(6436002)(36756003)(52116002)(53936002)(446003)(478600001)(71190400001)(71200400001)(14454004)(6512007)(66066001)(30864003)(7736002)(54906003)(229853002)(11346002);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR05MB3360;H:VI1PR05MB3247.eurprd05.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;A:1;MX:1; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: jxxcSCurKF2MT4zQJPfcacTe5luSMdmDBAIt2UdylEUBrmTfKh81J+dB0M6LjV9IHv+tkFxskqiXjdtcQ5BV9Ti7UtVy1KsH2Z4LUIqFCboene4WFZt16oFd+VeRskd0ZTtsmYt/rqsxyqY7GrLqr9sDKZvJ0m9lHW2nJq03xQ2McDEsaL+2xgnpijVQjUXBmzvhLXrtacYFg6mCo2ygGyi74UA4XWlMBJaOKDuhNgPxaloHE48x0B4DlYRF6UL+kNUCXVztUI7gjTNXRrYym626WWCdV8rxkjCMM67jaeg6GNDGJ5oKNpXrSU2zqHM8xeueCCZpgvy85jcdai9VqccE48gwm1IASHchGyO56QjOMTqpI1FxQllOyGnam9RBxWKRW//8tbIBFIIFvJHh0xZI8F/l8A68Ow99tE8m6aM= Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7d5c2ba4-62a6-491d-d825-08d69bf17898 X-MS-Exchange-CrossTenant-originalarrivaltime: 26 Feb 2019 13:51:12.7747 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB3360 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Roopa Prabhu writes: > From: Roopa Prabhu > > This patch adds extack coverage in vxlan link > create and changelink paths. Introduces a new helper > vxlan_nl2flags to consolidate flag attribute validation. > > thanks to Johannes Berg for some tips to construct the > generic vxlan flag extack strings. > > Signed-off-by: Roopa Prabhu > --- > drivers/net/vxlan.c | 208 +++++++++++++++++++++++++++++++++++-----------= ------ > include/net/vxlan.h | 31 ++++++++ > 2 files changed, 172 insertions(+), 67 deletions(-) > > diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c > index 577201c..a3c46d7 100644 > --- a/drivers/net/vxlan.c > +++ b/drivers/net/vxlan.c > @@ -3583,11 +3583,40 @@ static int __vxlan_dev_create(struct net *net, st= ruct net_device *dev, > return err; > } > > +/* Set/clear flags based on attribute */ > +static int vxlan_nl2flag(struct vxlan_config *conf, struct nlattr *tb[], > + int attrtype, unsigned long mask, bool changelink, > + bool changelink_supported, > + struct netlink_ext_ack *extack) > +{ > + unsigned long flags; > + > + if (!tb[attrtype]) > + return 0; > + > + if (changelink && !changelink_supported) { > + vxlan_flag_attr_error(attrtype, extack); > + return -EOPNOTSUPP; > + } > + > + if (vxlan_policy[attrtype].type =3D=3D NLA_FLAG) > + flags =3D conf->flags | mask; > + else if (nla_get_u8(tb[attrtype])) > + flags =3D conf->flags | mask; > + else > + flags =3D conf->flags & ~mask; Many of the flags for which you call this don't actually have the else branch. However I suspect there are no good reasons not to allow resetting a flag. Reviewed-by: Petr Machata > + > + conf->flags =3D flags; > + > + return 0; > +} > + > static int vxlan_nl2conf(struct nlattr *tb[], struct nlattr *data[], > struct net_device *dev, struct vxlan_config *conf, > - bool changelink) > + bool changelink, struct netlink_ext_ack *extack) > { > struct vxlan_dev *vxlan =3D netdev_priv(dev); > + int err =3D 0; > > memset(conf, 0, sizeof(*conf)); > > @@ -3598,40 +3627,54 @@ static int vxlan_nl2conf(struct nlattr *tb[], str= uct nlattr *data[], > if (data[IFLA_VXLAN_ID]) { > __be32 vni =3D cpu_to_be32(nla_get_u32(data[IFLA_VXLAN_ID])); > > - if (changelink && (vni !=3D conf->vni)) > + if (changelink && (vni !=3D conf->vni)) { > + NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_ID], "Cannot change VNI"); > return -EOPNOTSUPP; > + } > conf->vni =3D cpu_to_be32(nla_get_u32(data[IFLA_VXLAN_ID])); > } > > if (data[IFLA_VXLAN_GROUP]) { > - if (changelink && (conf->remote_ip.sa.sa_family !=3D AF_INET)) > + if (changelink && (conf->remote_ip.sa.sa_family !=3D AF_INET)) { > + NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_GROUP], "New group address = family does not match old group"); > return -EOPNOTSUPP; > + } > > conf->remote_ip.sin.sin_addr.s_addr =3D nla_get_in_addr(data[IFLA_VXLA= N_GROUP]); > conf->remote_ip.sa.sa_family =3D AF_INET; > } else if (data[IFLA_VXLAN_GROUP6]) { > - if (!IS_ENABLED(CONFIG_IPV6)) > + if (!IS_ENABLED(CONFIG_IPV6)) { > + NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_GROUP6], "IPv6 support not = enabled in the kernel"); > return -EPFNOSUPPORT; > + } > > - if (changelink && (conf->remote_ip.sa.sa_family !=3D AF_INET6)) > + if (changelink && (conf->remote_ip.sa.sa_family !=3D AF_INET6)) { > + NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_GROUP6], "New group address= family does not match old group"); > return -EOPNOTSUPP; > + } > > conf->remote_ip.sin6.sin6_addr =3D nla_get_in6_addr(data[IFLA_VXLAN_GR= OUP6]); > conf->remote_ip.sa.sa_family =3D AF_INET6; > } > > if (data[IFLA_VXLAN_LOCAL]) { > - if (changelink && (conf->saddr.sa.sa_family !=3D AF_INET)) > + if (changelink && (conf->saddr.sa.sa_family !=3D AF_INET)) { > + NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_LOCAL], "New local address = family does not match old"); > return -EOPNOTSUPP; > + } > > conf->saddr.sin.sin_addr.s_addr =3D nla_get_in_addr(data[IFLA_VXLAN_LO= CAL]); > conf->saddr.sa.sa_family =3D AF_INET; > } else if (data[IFLA_VXLAN_LOCAL6]) { > - if (!IS_ENABLED(CONFIG_IPV6)) > + if (!IS_ENABLED(CONFIG_IPV6)) { > + NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_LOCAL6], "IPv6 support not = enabled in the kernel"); > return -EPFNOSUPPORT; > + } > > - if (changelink && (conf->saddr.sa.sa_family !=3D AF_INET6)) > + if (changelink && (conf->saddr.sa.sa_family !=3D AF_INET6)) { > + NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_LOCAL6], "New local address= family does not match old"); > return -EOPNOTSUPP; > + } > > /* TODO: respect scope id */ > conf->saddr.sin6.sin6_addr =3D nla_get_in6_addr(data[IFLA_VXLAN_LOCAL6= ]); > @@ -3648,9 +3691,12 @@ static int vxlan_nl2conf(struct nlattr *tb[], stru= ct nlattr *data[], > conf->ttl =3D nla_get_u8(data[IFLA_VXLAN_TTL]); > > if (data[IFLA_VXLAN_TTL_INHERIT]) { > - if (changelink) > - return -EOPNOTSUPP; > - conf->flags |=3D VXLAN_F_TTL_INHERIT; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_TTL_INHERIT, > + VXLAN_F_TTL_INHERIT, changelink, false, > + extack); > + if (err) > + return err; > + > } > > if (data[IFLA_VXLAN_LABEL]) > @@ -3658,10 +3704,11 @@ static int vxlan_nl2conf(struct nlattr *tb[], str= uct nlattr *data[], > IPV6_FLOWLABEL_MASK; > > if (data[IFLA_VXLAN_LEARNING]) { > - if (nla_get_u8(data[IFLA_VXLAN_LEARNING])) > - conf->flags |=3D VXLAN_F_LEARN; > - else > - conf->flags &=3D ~VXLAN_F_LEARN; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_LEARNING, > + VXLAN_F_LEARN, changelink, true, > + extack); > + if (err) > + return err; > } else if (!changelink) { > /* default to learn on a new device */ > conf->flags |=3D VXLAN_F_LEARN; > @@ -3671,44 +3718,52 @@ static int vxlan_nl2conf(struct nlattr *tb[], str= uct nlattr *data[], > conf->age_interval =3D nla_get_u32(data[IFLA_VXLAN_AGEING]); > > if (data[IFLA_VXLAN_PROXY]) { > - if (changelink) > - return -EOPNOTSUPP; > - if (nla_get_u8(data[IFLA_VXLAN_PROXY])) > - conf->flags |=3D VXLAN_F_PROXY; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_PROXY, > + VXLAN_F_PROXY, changelink, false, > + extack); > + if (err) > + return err; > } > > if (data[IFLA_VXLAN_RSC]) { > - if (changelink) > - return -EOPNOTSUPP; > - if (nla_get_u8(data[IFLA_VXLAN_RSC])) > - conf->flags |=3D VXLAN_F_RSC; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_RSC, > + VXLAN_F_RSC, changelink, false, > + extack); > + if (err) > + return err; > } > > if (data[IFLA_VXLAN_L2MISS]) { > - if (changelink) > - return -EOPNOTSUPP; > - if (nla_get_u8(data[IFLA_VXLAN_L2MISS])) > - conf->flags |=3D VXLAN_F_L2MISS; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_L2MISS, > + VXLAN_F_L2MISS, changelink, false, > + extack); > + if (err) > + return err; > } > > if (data[IFLA_VXLAN_L3MISS]) { > - if (changelink) > - return -EOPNOTSUPP; > - if (nla_get_u8(data[IFLA_VXLAN_L3MISS])) > - conf->flags |=3D VXLAN_F_L3MISS; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_L3MISS, > + VXLAN_F_L3MISS, changelink, false, > + extack); > + if (err) > + return err; > } > > if (data[IFLA_VXLAN_LIMIT]) { > - if (changelink) > + if (changelink) { > + NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_LIMIT], > + "Cannot change limit"); > return -EOPNOTSUPP; > + } > conf->addrmax =3D nla_get_u32(data[IFLA_VXLAN_LIMIT]); > } > > if (data[IFLA_VXLAN_COLLECT_METADATA]) { > - if (changelink) > - return -EOPNOTSUPP; > - if (nla_get_u8(data[IFLA_VXLAN_COLLECT_METADATA])) > - conf->flags |=3D VXLAN_F_COLLECT_METADATA; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_COLLECT_METADATA, > + VXLAN_F_COLLECT_METADATA, changelink, false, > + extack); > + if (err) > + return err; > } > > if (data[IFLA_VXLAN_PORT_RANGE]) { > @@ -3718,72 +3773,92 @@ static int vxlan_nl2conf(struct nlattr *tb[], str= uct nlattr *data[], > conf->port_min =3D ntohs(p->low); > conf->port_max =3D ntohs(p->high); > } else { > + NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_PORT_RANGE], > + "Cannot change port range"); > return -EOPNOTSUPP; > } > } > > if (data[IFLA_VXLAN_PORT]) { > - if (changelink) > + if (changelink) { > + NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_PORT], > + "Cannot change port"); > return -EOPNOTSUPP; > + } > conf->dst_port =3D nla_get_be16(data[IFLA_VXLAN_PORT]); > } > > if (data[IFLA_VXLAN_UDP_CSUM]) { > - if (changelink) > + if (changelink) { > + NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_UDP_CSUM], > + "Cannot change UDP_CSUM flag"); > return -EOPNOTSUPP; > + } > if (!nla_get_u8(data[IFLA_VXLAN_UDP_CSUM])) > conf->flags |=3D VXLAN_F_UDP_ZERO_CSUM_TX; > } > > if (data[IFLA_VXLAN_UDP_ZERO_CSUM6_TX]) { > - if (changelink) > - return -EOPNOTSUPP; > - if (nla_get_u8(data[IFLA_VXLAN_UDP_ZERO_CSUM6_TX])) > - conf->flags |=3D VXLAN_F_UDP_ZERO_CSUM6_TX; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_UDP_ZERO_CSUM6_TX, > + VXLAN_F_UDP_ZERO_CSUM6_TX, changelink, > + false, extack); > + if (err) > + return err; > } > > if (data[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]) { > - if (changelink) > - return -EOPNOTSUPP; > - if (nla_get_u8(data[IFLA_VXLAN_UDP_ZERO_CSUM6_RX])) > - conf->flags |=3D VXLAN_F_UDP_ZERO_CSUM6_RX; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_UDP_ZERO_CSUM6_RX, > + VXLAN_F_UDP_ZERO_CSUM6_RX, changelink, > + false, extack); > + if (err) > + return err; > } > > if (data[IFLA_VXLAN_REMCSUM_TX]) { > - if (changelink) > - return -EOPNOTSUPP; > - if (nla_get_u8(data[IFLA_VXLAN_REMCSUM_TX])) > - conf->flags |=3D VXLAN_F_REMCSUM_TX; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_REMCSUM_TX, > + VXLAN_F_REMCSUM_TX, changelink, false, > + extack); > + if (err) > + return err; > } > > if (data[IFLA_VXLAN_REMCSUM_RX]) { > - if (changelink) > - return -EOPNOTSUPP; > - if (nla_get_u8(data[IFLA_VXLAN_REMCSUM_RX])) > - conf->flags |=3D VXLAN_F_REMCSUM_RX; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_REMCSUM_RX, > + VXLAN_F_REMCSUM_RX, changelink, false, > + extack); > + if (err) > + return err; > } > > if (data[IFLA_VXLAN_GBP]) { > - if (changelink) > - return -EOPNOTSUPP; > - conf->flags |=3D VXLAN_F_GBP; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_GBP, > + VXLAN_F_GBP, changelink, false, extack); > + if (err) > + return err; > } > > if (data[IFLA_VXLAN_GPE]) { > - if (changelink) > - return -EOPNOTSUPP; > - conf->flags |=3D VXLAN_F_GPE; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_GPE, > + VXLAN_F_GPE, changelink, false, > + extack); > + if (err) > + return err; > } > > if (data[IFLA_VXLAN_REMCSUM_NOPARTIAL]) { > - if (changelink) > - return -EOPNOTSUPP; > - conf->flags |=3D VXLAN_F_REMCSUM_NOPARTIAL; > + err =3D vxlan_nl2flag(conf, data, IFLA_VXLAN_REMCSUM_NOPARTIAL, > + VXLAN_F_REMCSUM_NOPARTIAL, changelink, > + false, extack); > + if (err) > + return err; > } > > if (tb[IFLA_MTU]) { > - if (changelink) > + if (changelink) { > + NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_MTU], > + "Cannot change mtu"); > return -EOPNOTSUPP; > + } > conf->mtu =3D nla_get_u32(tb[IFLA_MTU]); > } > > @@ -3800,7 +3875,7 @@ static int vxlan_newlink(struct net *src_net, struc= t net_device *dev, > struct vxlan_config conf; > int err; > > - err =3D vxlan_nl2conf(tb, data, dev, &conf, false); > + err =3D vxlan_nl2conf(tb, data, dev, &conf, false, extack); > if (err) > return err; > > @@ -3817,8 +3892,7 @@ static int vxlan_changelink(struct net_device *dev,= struct nlattr *tb[], > struct vxlan_config conf; > int err; > > - err =3D vxlan_nl2conf(tb, data, > - dev, &conf, true); > + err =3D vxlan_nl2conf(tb, data, dev, &conf, true, extack); > if (err) > return err; > > diff --git a/include/net/vxlan.h b/include/net/vxlan.h > index 0976781..00254a5 100644 > --- a/include/net/vxlan.h > +++ b/include/net/vxlan.h > @@ -453,4 +453,35 @@ vxlan_fdb_clear_offload(const struct net_device *dev= , __be32 vni) > } > #endif > > +static inline void vxlan_flag_attr_error(int attrtype, > + struct netlink_ext_ack *extack) > +{ > +#define VXLAN_FLAG(flg) \ > + case IFLA_VXLAN_##flg: \ > + NL_SET_ERR_MSG_MOD(extack, \ > + "cannot change " #flg " flag"); \ > + break > + switch (attrtype) { > + VXLAN_FLAG(TTL_INHERIT); > + VXLAN_FLAG(LEARNING); > + VXLAN_FLAG(PROXY); > + VXLAN_FLAG(RSC); > + VXLAN_FLAG(L2MISS); > + VXLAN_FLAG(L3MISS); > + VXLAN_FLAG(COLLECT_METADATA); > + VXLAN_FLAG(UDP_ZERO_CSUM6_TX); > + VXLAN_FLAG(UDP_ZERO_CSUM6_RX); > + VXLAN_FLAG(REMCSUM_TX); > + VXLAN_FLAG(REMCSUM_RX); > + VXLAN_FLAG(GBP); > + VXLAN_FLAG(GPE); > + VXLAN_FLAG(REMCSUM_NOPARTIAL); > + default: > + NL_SET_ERR_MSG_MOD(extack, \ > + "cannot change flag"); > + break; > + } > +#undef VXLAN_FLAG > +} > + > #endif