|
@@ -421,6 +421,19 @@ static int validate_sample(const struct nlattr *attr,
|
|
return validate_actions(actions, key, depth + 1);
|
|
return validate_actions(actions, key, depth + 1);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int validate_tp_port(const struct sw_flow_key *flow_key)
|
|
|
|
+{
|
|
|
|
+ if (flow_key->eth.type == htons(ETH_P_IP)) {
|
|
|
|
+ if (flow_key->ipv4.tp.src && flow_key->ipv4.tp.dst)
|
|
|
|
+ return 0;
|
|
|
|
+ } else if (flow_key->eth.type == htons(ETH_P_IPV6)) {
|
|
|
|
+ if (flow_key->ipv6.tp.src && flow_key->ipv6.tp.dst)
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return -EINVAL;
|
|
|
|
+}
|
|
|
|
+
|
|
static int validate_set(const struct nlattr *a,
|
|
static int validate_set(const struct nlattr *a,
|
|
const struct sw_flow_key *flow_key)
|
|
const struct sw_flow_key *flow_key)
|
|
{
|
|
{
|
|
@@ -462,18 +475,13 @@ static int validate_set(const struct nlattr *a,
|
|
if (flow_key->ip.proto != IPPROTO_TCP)
|
|
if (flow_key->ip.proto != IPPROTO_TCP)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
- if (!flow_key->ipv4.tp.src || !flow_key->ipv4.tp.dst)
|
|
|
|
- return -EINVAL;
|
|
|
|
-
|
|
|
|
- break;
|
|
|
|
|
|
+ return validate_tp_port(flow_key);
|
|
|
|
|
|
case OVS_KEY_ATTR_UDP:
|
|
case OVS_KEY_ATTR_UDP:
|
|
if (flow_key->ip.proto != IPPROTO_UDP)
|
|
if (flow_key->ip.proto != IPPROTO_UDP)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
- if (!flow_key->ipv4.tp.src || !flow_key->ipv4.tp.dst)
|
|
|
|
- return -EINVAL;
|
|
|
|
- break;
|
|
|
|
|
|
+ return validate_tp_port(flow_key);
|
|
|
|
|
|
default:
|
|
default:
|
|
return -EINVAL;
|
|
return -EINVAL;
|