[ovs-dev] [PATCH] datapath: Relax set header validation.
Ethan Jackson
ethan at nicira.com
Fri Aug 3 17:59:18 UTC 2012
Looks good to me. I'd prefer someone who knows the kernel code review
it as well.
Ethan
On Thu, Aug 2, 2012 at 7:39 PM, Jesse Gross <jesse at nicira.com> wrote:
> When installing a flow with an action to set a particular field we
> need to validate that the packets that are part of the flow actually
> contain that header. With IP we use zeroed addresses and with TCP/UDP
> the check is for zeroed ports. This check is overly broad and can catch
> packets like DHCP requests that have a zero source address in a
> legitimate header. This changes the check to look for a zeroed protocol
> number for IP or for both ports be zero for TCP/UDP before considering
> the header to not exist.
>
> Bug #12769
>
> Reported-by: Ethan Jackson <ethan at nicira.com>
> Signed-off-by: Jesse Gross <jesse at nicira.com>
> ---
> datapath/datapath.c | 6 +++---
> lib/odp-util.c | 2 +-
> 2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/datapath/datapath.c b/datapath/datapath.c
> index dc2cfad..7a7dc4c 100644
> --- a/datapath/datapath.c
> +++ b/datapath/datapath.c
> @@ -561,10 +561,10 @@ static int validate_sample(const struct nlattr *attr,
> 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)
> + 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)
> + if (flow_key->ipv6.tp.src || flow_key->ipv6.tp.dst)
> return 0;
> }
>
> @@ -597,7 +597,7 @@ static int validate_set(const struct nlattr *a,
> if (flow_key->eth.type != htons(ETH_P_IP))
> return -EINVAL;
>
> - if (!flow_key->ipv4.addr.src || !flow_key->ipv4.addr.dst)
> + if (!flow_key->ip.proto)
> return -EINVAL;
>
> ipv4_key = nla_data(ovs_key);
> diff --git a/lib/odp-util.c b/lib/odp-util.c
> index 7caab09..901dac3 100644
> --- a/lib/odp-util.c
> +++ b/lib/odp-util.c
> @@ -1976,7 +1976,7 @@ static void
> commit_set_port_action(const struct flow *flow, struct flow *base,
> struct ofpbuf *odp_actions)
> {
> - if (!base->tp_src || !base->tp_dst) {
> + if (!base->tp_src && !base->tp_dst) {
> return;
> }
>
> --
> 1.7.9.5
>
More information about the dev
mailing list