[ovs-dev] [PATCH 2/3] dpif-netlink-rtnl: Use getlink() in common verify path.
Joe Stringer
joe at ovn.org
Tue May 23 22:45:12 UTC 2017
On 22 May 2017 at 10:40, Eric Garver <e at erig.me> wrote:
> On Fri, May 19, 2017 at 01:27:35PM -0700, Joe Stringer wrote:
>> The calls here were duplicated across each tunnel protocol.
>>
>> Signed-off-by: Joe Stringer <joe at ovn.org>
>> ---
>> lib/dpif-netlink-rtnl.c | 100 +++++++++++++++++++++---------------------------
>> 1 file changed, 43 insertions(+), 57 deletions(-)
>>
>> diff --git a/lib/dpif-netlink-rtnl.c b/lib/dpif-netlink-rtnl.c
>> index 0ca6529e9d82..76ab0fe3fdec 100644
>> --- a/lib/dpif-netlink-rtnl.c
>> +++ b/lib/dpif-netlink-rtnl.c
>> @@ -160,34 +160,23 @@ rtnl_policy_parse(const char *kind, struct ofpbuf *reply,
>>
>> static int
>> dpif_netlink_rtnl_vxlan_verify(const struct netdev_tunnel_config *tnl_cfg,
>> - const char *name, const char *kind)
>> + const char *kind, struct ofpbuf *reply)
>> {
>> - struct ofpbuf *reply;
>> + struct nlattr *vxlan[ARRAY_SIZE(vxlan_policy)];
>> int err;
>>
>> - err = dpif_netlink_rtnl_getlink(name, &reply);
>> -
>> + err = rtnl_policy_parse(kind, reply, vxlan_policy, vxlan,
>> + ARRAY_SIZE(vxlan_policy));
>> if (!err) {
>> - struct nlattr *vxlan[ARRAY_SIZE(vxlan_policy)];
>> -
>> - err = rtnl_policy_parse(kind, reply, vxlan_policy, vxlan,
>> - ARRAY_SIZE(vxlan_policy));
>> - if (!err) {
>> - if (0 != nl_attr_get_u8(vxlan[IFLA_VXLAN_LEARNING])
>> - || 1 != nl_attr_get_u8(vxlan[IFLA_VXLAN_COLLECT_METADATA])
>> - || 1 != nl_attr_get_u8(vxlan[IFLA_VXLAN_UDP_ZERO_CSUM6_RX])
>> - || (tnl_cfg->dst_port
>> - != nl_attr_get_be16(vxlan[IFLA_VXLAN_PORT]))) {
>> - err = EINVAL;
>> - }
>> - }
>> - if (!err) {
>> - if (tnl_cfg->exts & (1 << OVS_VXLAN_EXT_GBP)
>> - && !nl_attr_get_flag(vxlan[IFLA_VXLAN_GBP])) {
>> - err = EINVAL;
>> - }
>> + if (0 != nl_attr_get_u8(vxlan[IFLA_VXLAN_LEARNING])
>> + || 1 != nl_attr_get_u8(vxlan[IFLA_VXLAN_COLLECT_METADATA])
>> + || 1 != nl_attr_get_u8(vxlan[IFLA_VXLAN_UDP_ZERO_CSUM6_RX])
>> + || (tnl_cfg->dst_port
>> + != nl_attr_get_be16(vxlan[IFLA_VXLAN_PORT]))
>> + || (tnl_cfg->exts & (1 << OVS_VXLAN_EXT_GBP)
>> + && !nl_attr_get_flag(vxlan[IFLA_VXLAN_GBP]))) {
>> + err = EINVAL;
>> }
>> - ofpbuf_delete(reply);
>> }
>>
>> return err;
>> @@ -195,24 +184,17 @@ dpif_netlink_rtnl_vxlan_verify(const struct netdev_tunnel_config *tnl_cfg,
>>
>> static int
>> dpif_netlink_rtnl_gre_verify(const struct netdev_tunnel_config OVS_UNUSED *tnl,
>> - const char *name, const char *kind)
>> + const char *kind, struct ofpbuf *reply)
>> {
>> - struct ofpbuf *reply;
>> + struct nlattr *gre[ARRAY_SIZE(gre_policy)];
>> int err;
>>
>> - err = dpif_netlink_rtnl_getlink(name, &reply);
>> -
>> + err = rtnl_policy_parse(kind, reply, gre_policy, gre,
>> + ARRAY_SIZE(gre_policy));
>> if (!err) {
>> - struct nlattr *gre[ARRAY_SIZE(gre_policy)];
>> -
>> - err = rtnl_policy_parse(kind, reply, gre_policy, gre,
>> - ARRAY_SIZE(gre_policy));
>> - if (!err) {
>> - if (!nl_attr_get_flag(gre[IFLA_GRE_COLLECT_METADATA])) {
>> - err = EINVAL;
>> - }
>> + if (!nl_attr_get_flag(gre[IFLA_GRE_COLLECT_METADATA])) {
>> + err = EINVAL;
>> }
>> - ofpbuf_delete(reply);
>> }
>>
>> return err;
>> @@ -220,27 +202,20 @@ dpif_netlink_rtnl_gre_verify(const struct netdev_tunnel_config OVS_UNUSED *tnl,
>>
>> static int
>> dpif_netlink_rtnl_geneve_verify(const struct netdev_tunnel_config *tnl_cfg,
>> - const char *name, const char *kind)
>> + const char *kind, struct ofpbuf *reply)
>> {
>> - struct ofpbuf *reply;
>> + struct nlattr *geneve[ARRAY_SIZE(geneve_policy)];
>> int err;
>>
>> - err = dpif_netlink_rtnl_getlink(name, &reply);
>> -
>> + err = rtnl_policy_parse(kind, reply, geneve_policy, geneve,
>> + ARRAY_SIZE(geneve_policy));
>> if (!err) {
>> - struct nlattr *geneve[ARRAY_SIZE(geneve_policy)];
>> -
>> - err = rtnl_policy_parse(kind, reply, geneve_policy, geneve,
>> - ARRAY_SIZE(geneve_policy));
>> - if (!err) {
>> - if (!nl_attr_get_flag(geneve[IFLA_GENEVE_COLLECT_METADATA])
>> - || 1 != nl_attr_get_u8(geneve[IFLA_GENEVE_UDP_ZERO_CSUM6_RX])
>> - || (tnl_cfg->dst_port
>> - != nl_attr_get_be16(geneve[IFLA_GENEVE_PORT]))) {
>> - err = EINVAL;
>> - }
>> + if (!nl_attr_get_flag(geneve[IFLA_GENEVE_COLLECT_METADATA])
>> + || 1 != nl_attr_get_u8(geneve[IFLA_GENEVE_UDP_ZERO_CSUM6_RX])
>> + || (tnl_cfg->dst_port
>> + != nl_attr_get_be16(geneve[IFLA_GENEVE_PORT]))) {
>> + err = EINVAL;
>> }
>> - ofpbuf_delete(reply);
>> }
>>
>> return err;
>> @@ -250,20 +225,30 @@ static int
>> dpif_netlink_rtnl_verify(const struct netdev_tunnel_config *tnl_cfg,
>> enum ovs_vport_type type, const char *name)
>> {
>> + struct ofpbuf *reply;
>> const char *kind;
>> + int err;
>>
>> kind = vport_type_to_kind(type);
>> if (!kind) {
>> return EOPNOTSUPP;
>> }
>>
>> + err = dpif_netlink_rtnl_getlink(name, &reply);
>> + if (err) {
>> + return err;
>> + }
>> +
>> switch (type) {
>> case OVS_VPORT_TYPE_VXLAN:
>> - return dpif_netlink_rtnl_vxlan_verify(tnl_cfg, name, kind);
>> + err = dpif_netlink_rtnl_vxlan_verify(tnl_cfg, kind, reply);
>> + break;
>> case OVS_VPORT_TYPE_GRE:
>> - return dpif_netlink_rtnl_gre_verify(tnl_cfg, name, kind);
>> + err = dpif_netlink_rtnl_gre_verify(tnl_cfg, kind, reply);
>> + break;
>> case OVS_VPORT_TYPE_GENEVE:
>> - return dpif_netlink_rtnl_geneve_verify(tnl_cfg, name, kind);
>> + err = dpif_netlink_rtnl_geneve_verify(tnl_cfg, kind, reply);
>> + break;
>> case OVS_VPORT_TYPE_NETDEV:
>> case OVS_VPORT_TYPE_INTERNAL:
>> case OVS_VPORT_TYPE_LISP:
>> @@ -271,10 +256,11 @@ dpif_netlink_rtnl_verify(const struct netdev_tunnel_config *tnl_cfg,
>> case OVS_VPORT_TYPE_UNSPEC:
>> case __OVS_VPORT_TYPE_MAX:
>> default:
>> - return EOPNOTSUPP;
>> + err = EOPNOTSUPP;
>> }
>>
>> - return 0;
>> + ofpbuf_delete(reply);
>> + return err;
>> }
>>
>> static int
>> --
>> 2.11.1
>
> Acked-by: Eric Garver <e at erig.me>
Thanks, applied to master.
More information about the dev
mailing list