diff mbox series

[ovs-dev] netdev-native-tnl: Add assertion in vxlan_pop_header.

Message ID 1515778993-60588-1-git-send-email-bhanuprakash.bodireddy@intel.com
State Accepted
Headers show
Series [ovs-dev] netdev-native-tnl: Add assertion in vxlan_pop_header. | expand

Commit Message

Bodireddy, Bhanuprakash Jan. 12, 2018, 5:43 p.m. UTC
During tunnel decapsulation the below steps are performed:
 [1] Tunnel information is populated in packet metadata i.e packet->md->tunnel.
 [2] Outer header gets popped.
 [3] Packet is recirculated.

For [1] to work, the dp_packet L3 and L4 header offsets should be valid.
The offsets in the dp_packet are set as part of miniflow extraction.

If offsets are accidentally reset (or) the pop header operation is performed
prior to miniflow extraction, step [1] fails silently and creates
issues that are harder to debug. Add the assertion to check if the
offsets are valid.

Signed-off-by: Bhanuprakash Bodireddy <bhanuprakash.bodireddy@intel.com>
---
 lib/netdev-native-tnl.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Ben Pfaff Jan. 12, 2018, 6:08 p.m. UTC | #1
On Fri, Jan 12, 2018 at 05:43:13PM +0000, Bhanuprakash Bodireddy wrote:
> During tunnel decapsulation the below steps are performed:
>  [1] Tunnel information is populated in packet metadata i.e packet->md->tunnel.
>  [2] Outer header gets popped.
>  [3] Packet is recirculated.
> 
> For [1] to work, the dp_packet L3 and L4 header offsets should be valid.
> The offsets in the dp_packet are set as part of miniflow extraction.
> 
> If offsets are accidentally reset (or) the pop header operation is performed
> prior to miniflow extraction, step [1] fails silently and creates
> issues that are harder to debug. Add the assertion to check if the
> offsets are valid.
> 
> Signed-off-by: Bhanuprakash Bodireddy <bhanuprakash.bodireddy@intel.com>
> ---
>  lib/netdev-native-tnl.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c
> index 9ce8567..fb5eab0 100644
> --- a/lib/netdev-native-tnl.c
> +++ b/lib/netdev-native-tnl.c
> @@ -508,6 +508,9 @@ netdev_vxlan_pop_header(struct dp_packet *packet)
>      ovs_be32 vx_flags;
>      enum packet_type next_pt = PT_ETH;
>  
> +    ovs_assert(packet->l3_ofs > 0);
> +    ovs_assert(packet->l4_ofs > 0);
> +
>      pkt_metadata_init_tnl(md);
>      if (VXLAN_HLEN > dp_packet_l4_size(packet)) {
>          goto err;

Thanks for working to make OVS more reliable.

How much risk do you think there is of these assertions triggering?  Are
you debugging an issue where they would trigger, and has that been
fixed?  I'm trying to figure out whether it makes more sense to put
assertions here or whether something closer to a log message plus a jump
to "err" would be better.  It's not great for OVS to assert-fail, but on
the other hand if it indicates a genuine bug then sometimes it's the
best thing to do.
Bodireddy, Bhanuprakash Jan. 12, 2018, 7:33 p.m. UTC | #2
Hi Ben,

>On Fri, Jan 12, 2018 at 05:43:13PM +0000, Bhanuprakash Bodireddy wrote:
>> During tunnel decapsulation the below steps are performed:
>>  [1] Tunnel information is populated in packet metadata i.e packet->md-
>>tunnel.
>>  [2] Outer header gets popped.
>>  [3] Packet is recirculated.
>>
>> For [1] to work, the dp_packet L3 and L4 header offsets should be valid.
>> The offsets in the dp_packet are set as part of miniflow extraction.
>>
>> If offsets are accidentally reset (or) the pop header operation is
>> performed prior to miniflow extraction, step [1] fails silently and
>> creates issues that are harder to debug. Add the assertion to check if
>> the offsets are valid.
>>
>> Signed-off-by: Bhanuprakash Bodireddy
>> <bhanuprakash.bodireddy@intel.com>
>> ---
>>  lib/netdev-native-tnl.c | 3 +++
>>  1 file changed, 3 insertions(+)
>>
>> diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c index
>> 9ce8567..fb5eab0 100644
>> --- a/lib/netdev-native-tnl.c
>> +++ b/lib/netdev-native-tnl.c
>> @@ -508,6 +508,9 @@ netdev_vxlan_pop_header(struct dp_packet
>*packet)
>>      ovs_be32 vx_flags;
>>      enum packet_type next_pt = PT_ETH;
>>
>> +    ovs_assert(packet->l3_ofs > 0);
>> +    ovs_assert(packet->l4_ofs > 0);
>> +
>>      pkt_metadata_init_tnl(md);
>>      if (VXLAN_HLEN > dp_packet_l4_size(packet)) {
>>          goto err;
>
>Thanks for working to make OVS more reliable.
>
>How much risk do you think there is of these assertions triggering?  Are you
>debugging an issue where they would trigger, and has that been fixed?  I'm
>trying to figure out whether it makes more sense to put assertions here or
>whether something closer to a log message plus a jump to "err" would be
>better.  It's not great for OVS to assert-fail, but on the other hand if it indicates
>a genuine bug then sometimes it's the best thing to do.

I was working on a RFC patch to skip recirculation for vxlan decap side.  
I posted today @  https://mail.openvswitch.org/pipermail/ovs-dev/2018-January/343103.html

In that implementation vxlan header is popped before the Miniflow extraction and that's when
I ran in to above mentioned problem. 

Also I found that dp_packet_reset_packet() and dp_packet_reset_offsets() when accidentally
called will clear the offsets and any later invocation of *vxlan_pop_header() or for that matter
any code that uses the dp_packet L3/L4 offsets will fail.  So I added an assertion to make it more explicit
for vxlans.

Please note that there isn't any bug on the master code and this was done as a precautionary
measure to improve debugging.

- Bhanuprakash.
Ben Pfaff Jan. 12, 2018, 9:05 p.m. UTC | #3
On Fri, Jan 12, 2018 at 07:33:30PM +0000, Bodireddy, Bhanuprakash wrote:
> Hi Ben,
> 
> >On Fri, Jan 12, 2018 at 05:43:13PM +0000, Bhanuprakash Bodireddy wrote:
> >> During tunnel decapsulation the below steps are performed:
> >>  [1] Tunnel information is populated in packet metadata i.e packet->md-
> >>tunnel.
> >>  [2] Outer header gets popped.
> >>  [3] Packet is recirculated.
> >>
> >> For [1] to work, the dp_packet L3 and L4 header offsets should be valid.
> >> The offsets in the dp_packet are set as part of miniflow extraction.
> >>
> >> If offsets are accidentally reset (or) the pop header operation is
> >> performed prior to miniflow extraction, step [1] fails silently and
> >> creates issues that are harder to debug. Add the assertion to check if
> >> the offsets are valid.
> >>
> >> Signed-off-by: Bhanuprakash Bodireddy
> >> <bhanuprakash.bodireddy@intel.com>
> >> ---
> >>  lib/netdev-native-tnl.c | 3 +++
> >>  1 file changed, 3 insertions(+)
> >>
> >> diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c index
> >> 9ce8567..fb5eab0 100644
> >> --- a/lib/netdev-native-tnl.c
> >> +++ b/lib/netdev-native-tnl.c
> >> @@ -508,6 +508,9 @@ netdev_vxlan_pop_header(struct dp_packet
> >*packet)
> >>      ovs_be32 vx_flags;
> >>      enum packet_type next_pt = PT_ETH;
> >>
> >> +    ovs_assert(packet->l3_ofs > 0);
> >> +    ovs_assert(packet->l4_ofs > 0);
> >> +
> >>      pkt_metadata_init_tnl(md);
> >>      if (VXLAN_HLEN > dp_packet_l4_size(packet)) {
> >>          goto err;
> >
> >Thanks for working to make OVS more reliable.
> >
> >How much risk do you think there is of these assertions triggering?  Are you
> >debugging an issue where they would trigger, and has that been fixed?  I'm
> >trying to figure out whether it makes more sense to put assertions here or
> >whether something closer to a log message plus a jump to "err" would be
> >better.  It's not great for OVS to assert-fail, but on the other hand if it indicates
> >a genuine bug then sometimes it's the best thing to do.
> 
> I was working on a RFC patch to skip recirculation for vxlan decap side.  
> I posted today @  https://mail.openvswitch.org/pipermail/ovs-dev/2018-January/343103.html
> 
> In that implementation vxlan header is popped before the Miniflow extraction and that's when
> I ran in to above mentioned problem. 
> 
> Also I found that dp_packet_reset_packet() and dp_packet_reset_offsets() when accidentally
> called will clear the offsets and any later invocation of *vxlan_pop_header() or for that matter
> any code that uses the dp_packet L3/L4 offsets will fail.  So I added an assertion to make it more explicit
> for vxlans.
> 
> Please note that there isn't any bug on the master code and this was done as a precautionary
> measure to improve debugging.

OK, thanks.

I applied this to master.
diff mbox series

Patch

diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c
index 9ce8567..fb5eab0 100644
--- a/lib/netdev-native-tnl.c
+++ b/lib/netdev-native-tnl.c
@@ -508,6 +508,9 @@  netdev_vxlan_pop_header(struct dp_packet *packet)
     ovs_be32 vx_flags;
     enum packet_type next_pt = PT_ETH;
 
+    ovs_assert(packet->l3_ofs > 0);
+    ovs_assert(packet->l4_ofs > 0);
+
     pkt_metadata_init_tnl(md);
     if (VXLAN_HLEN > dp_packet_l4_size(packet)) {
         goto err;