diff options
author | Daniel Alvarez <dalvarez@redhat.com> | 2017-10-26 14:52:22 +0200 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2017-10-26 09:39:25 -0700 |
commit | 7827edcaebd8a2098ea8b5165130eb9aa7a1d674 (patch) | |
tree | 92ae1654bda2adeb9b7c963286d63e506a731399 /lib | |
parent | 7ebfcd3d93fd4aabe4dc516c3b3c43a4d3f9df3f (diff) | |
download | openvswitch-7827edcaebd8a2098ea8b5165130eb9aa7a1d674.tar.gz |
Add dl_type to flow metadata for correct interpretation of conntrack metadata
When a packet is sent to the controller, dl_type is not stored in the
'ofputil_packet_in_private'. When the packet is resumed, the flow's
dl_type is 0 and this leads to invalid value in ct_orig_tuple in the
pkt_metadata.
This patch adds the dl_type to the metadata so that conntrack
information can be interpreted correctly when packets are resumed.
This is a change from the ordinary practice, since flow_get_metadata() is
only supposed to deal with metadata and dl_type is not metadata. It is
necessary when ct_state is involved, though, because ct_state only applies
in the case of particular Ethertypes (IPv4 and IPv6 currently), so we need
to add it as a kind of prerequisite. (This isn't ideal; maybe we didn't
think through the ct_state mechanism carefully enough.)
Reported-by: Daniel Alvarez Sanchez <dalvarez@redhat.com>
Reported-at: https://mail.openvswitch.org/pipermail/ovs-dev/2017-October/339868.html
Signed-off-by: Daniel Alvarez <dalvarez@redhat.com>
Signed-off-by: Numan Siddique <nusiddiq@redhat.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/flow.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/lib/flow.c b/lib/flow.c index b2b10aa48..4d2b7747a 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -1073,6 +1073,9 @@ flow_get_metadata(const struct flow *flow, struct match *flow_metadata) if (flow->ct_state != 0) { match_set_ct_state(flow_metadata, flow->ct_state); + /* Match dl_type since it is required for the later interpretation of + * the conntrack metadata. */ + match_set_dl_type(flow_metadata, flow->dl_type); if (is_ct_valid(flow, NULL, NULL) && flow->ct_nw_proto != 0) { if (flow->dl_type == htons(ETH_TYPE_IP)) { match_set_ct_nw_src(flow_metadata, flow->ct_nw_src); |