diff mbox series

[ovs-dev,3/5] bfd: Set proper offsets and flags in BFD packets.

Message ID 20240125214657.734291-3-mkp@redhat.com
State Changes Requested
Headers show
Series [ovs-dev,1/5] dp-packet: Reset offload/offsets when clearing a packet. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation success test: success
ovsrobot/github-robot-_Build_and_Test success github build: passed

Commit Message

Mike Pattrick Jan. 25, 2024, 9:46 p.m. UTC
Previously the BFD packet creation code did not appropriately set
offsets or flags. This contributed to issues involving encapsulation and
the TSO code.

Signed-off-by: Mike Pattrick <mkp@redhat.com>
Fixes: ccc096898c46 ("bfd: Implement Bidirectional Forwarding Detection.")
Signed-off-by: Mike Pattrick <mkp@redhat.com>
---
 lib/bfd.c | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

Comments

Ilya Maximets Jan. 26, 2024, 2:34 p.m. UTC | #1
On 1/25/24 22:46, Mike Pattrick wrote:
> Previously the BFD packet creation code did not appropriately set
> offsets or flags. This contributed to issues involving encapsulation and
> the TSO code.
> 
> Signed-off-by: Mike Pattrick <mkp@redhat.com>
> Fixes: ccc096898c46 ("bfd: Implement Bidirectional Forwarding Detection.")
> Signed-off-by: Mike Pattrick <mkp@redhat.com>

One sign-off too many. :)

> ---
>  lib/bfd.c | 25 ++++++++++++-------------
>  1 file changed, 12 insertions(+), 13 deletions(-)
> 
> diff --git a/lib/bfd.c b/lib/bfd.c
> index 9698576d0..af9998507 100644
> --- a/lib/bfd.c
> +++ b/lib/bfd.c
> @@ -586,7 +586,6 @@ bfd_put_packet(struct bfd *bfd, struct dp_packet *p,
>  {
>      long long int min_tx, min_rx;
>      struct udp_header *udp;
> -    struct eth_header *eth;
>      struct ip_header *ip;
>      struct msg *msg;
>  
> @@ -605,15 +604,13 @@ bfd_put_packet(struct bfd *bfd, struct dp_packet *p,
>       * set. */
>      ovs_assert(!(bfd->flags & FLAG_POLL) || !(bfd->flags & FLAG_FINAL));
>  
> -    dp_packet_reserve(p, 2); /* Properly align after the ethernet header. */
> -    eth = dp_packet_put_uninit(p, sizeof *eth);
> -    eth->eth_src = eth_addr_is_zero(bfd->local_eth_src)
> -        ? eth_src : bfd->local_eth_src;
> -    eth->eth_dst = eth_addr_is_zero(bfd->local_eth_dst)
> -        ? eth_addr_bfd : bfd->local_eth_dst;
> -    eth->eth_type = htons(ETH_TYPE_IP);
> +    ip = eth_compose(p,
> +                     eth_addr_is_zero(bfd->local_eth_dst) ?
> +                        eth_addr_bfd : bfd->local_eth_dst,
> +                     eth_addr_is_zero(bfd->local_eth_src) ?
> +                        eth_src : bfd->local_eth_src,

coding-style.rst:

  """
  Break long lines before the ternary operators ``?`` and ``:``, rather than
  after them
  """

> +                     ETH_TYPE_IP, sizeof *ip + sizeof *udp + sizeof *msg);
>  
> -    ip = dp_packet_put_zeros(p, sizeof *ip);
>      ip->ip_ihl_ver = IP_IHL_VER(5, 4);
>      ip->ip_tot_len = htons(sizeof *ip + sizeof *udp + sizeof *msg);
>      ip->ip_ttl = MAXTTL;
> @@ -621,15 +618,17 @@ bfd_put_packet(struct bfd *bfd, struct dp_packet *p,
>      ip->ip_proto = IPPROTO_UDP;
>      put_16aligned_be32(&ip->ip_src, bfd->ip_src);
>      put_16aligned_be32(&ip->ip_dst, bfd->ip_dst);
> -    /* Checksum has already been zeroed by put_zeros call. */
> -    ip->ip_csum = csum(ip, sizeof *ip);
> +    dp_packet_hwol_set_tx_ipv4(p);
> +    dp_packet_hwol_set_tx_ip_csum(p);

I don't think we can do that.  This code is datapath-agnostic.  And we
will not re-calculate the checksum while sending this packet to the kernel
datapath for actions execution.

> +    dp_packet_set_l4(p, ip + 1);
>  
> -    udp = dp_packet_put_zeros(p, sizeof *udp);
> +    udp = dp_packet_l4(p);
>      udp->udp_src = htons(bfd->udp_src);
>      udp->udp_dst = htons(BFD_DEST_PORT);
>      udp->udp_len = htons(sizeof *udp + sizeof *msg);
> +    /* Checksum already zero from eth_compose. */
>  
> -    msg = dp_packet_put_uninit(p, sizeof *msg);
> +    msg = (struct msg *)(udp + 1);
>      msg->vers_diag = (BFD_VERSION << 5) | bfd->diag;
>      msg->flags = (bfd->state & STATE_MASK) | bfd->flags;
>
diff mbox series

Patch

diff --git a/lib/bfd.c b/lib/bfd.c
index 9698576d0..af9998507 100644
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -586,7 +586,6 @@  bfd_put_packet(struct bfd *bfd, struct dp_packet *p,
 {
     long long int min_tx, min_rx;
     struct udp_header *udp;
-    struct eth_header *eth;
     struct ip_header *ip;
     struct msg *msg;
 
@@ -605,15 +604,13 @@  bfd_put_packet(struct bfd *bfd, struct dp_packet *p,
      * set. */
     ovs_assert(!(bfd->flags & FLAG_POLL) || !(bfd->flags & FLAG_FINAL));
 
-    dp_packet_reserve(p, 2); /* Properly align after the ethernet header. */
-    eth = dp_packet_put_uninit(p, sizeof *eth);
-    eth->eth_src = eth_addr_is_zero(bfd->local_eth_src)
-        ? eth_src : bfd->local_eth_src;
-    eth->eth_dst = eth_addr_is_zero(bfd->local_eth_dst)
-        ? eth_addr_bfd : bfd->local_eth_dst;
-    eth->eth_type = htons(ETH_TYPE_IP);
+    ip = eth_compose(p,
+                     eth_addr_is_zero(bfd->local_eth_dst) ?
+                        eth_addr_bfd : bfd->local_eth_dst,
+                     eth_addr_is_zero(bfd->local_eth_src) ?
+                        eth_src : bfd->local_eth_src,
+                     ETH_TYPE_IP, sizeof *ip + sizeof *udp + sizeof *msg);
 
-    ip = dp_packet_put_zeros(p, sizeof *ip);
     ip->ip_ihl_ver = IP_IHL_VER(5, 4);
     ip->ip_tot_len = htons(sizeof *ip + sizeof *udp + sizeof *msg);
     ip->ip_ttl = MAXTTL;
@@ -621,15 +618,17 @@  bfd_put_packet(struct bfd *bfd, struct dp_packet *p,
     ip->ip_proto = IPPROTO_UDP;
     put_16aligned_be32(&ip->ip_src, bfd->ip_src);
     put_16aligned_be32(&ip->ip_dst, bfd->ip_dst);
-    /* Checksum has already been zeroed by put_zeros call. */
-    ip->ip_csum = csum(ip, sizeof *ip);
+    dp_packet_hwol_set_tx_ipv4(p);
+    dp_packet_hwol_set_tx_ip_csum(p);
+    dp_packet_set_l4(p, ip + 1);
 
-    udp = dp_packet_put_zeros(p, sizeof *udp);
+    udp = dp_packet_l4(p);
     udp->udp_src = htons(bfd->udp_src);
     udp->udp_dst = htons(BFD_DEST_PORT);
     udp->udp_len = htons(sizeof *udp + sizeof *msg);
+    /* Checksum already zero from eth_compose. */
 
-    msg = dp_packet_put_uninit(p, sizeof *msg);
+    msg = (struct msg *)(udp + 1);
     msg->vers_diag = (BFD_VERSION << 5) | bfd->diag;
     msg->flags = (bfd->state & STATE_MASK) | bfd->flags;