All of lore.kernel.org
 help / color / mirror / Atom feed
* [ PATCH v1 0/2] ibmveth gso fix.
@ 2020-10-08 19:05 David Wilder
  2020-10-08 19:05 ` [ PATCH v1 1/2] ibmveth: Switch order of ibmveth_helper calls David Wilder
  2020-10-08 19:05 ` [ PATCH v1 2/2] ibmveth: Identify ingress large send packets David Wilder
  0 siblings, 2 replies; 8+ messages in thread
From: David Wilder @ 2020-10-08 19:05 UTC (permalink / raw)
  To: netdev; +Cc: tlfalcon, cris.forno, pradeeps, wilder

The ibmveth driver is a virtual Ethernet driver used on IBM pSeries systems.
Gso packets can be sent between LPARS (virtual hosts) without segmentation,
by flagging gso packets using one of two methods depending on the firmware
version. Some gso packet may not be correctly identified by the receiver.
This patch-set corrects this issue.

Signed-off-by: David Wilder <dwilder@us.ibm.com>
Reviewed-by: Thomas Falcon <tlfalcon@linux.ibm.com>
Reviewed-by: Cristobal Forno <cris.forno@ibm.com>
Reviewed-by: Pradeep Satyanarayana <pradeeps@linux.vnet.ibm.com>

David Wilder (2):
  ibmveth: Switch order of ibmveth_helper calls.
  ibmveth: Identify ingress large send packets.

 drivers/net/ethernet/ibm/ibmveth.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [ PATCH v1 1/2] ibmveth: Switch order of ibmveth_helper calls.
  2020-10-08 19:05 [ PATCH v1 0/2] ibmveth gso fix David Wilder
@ 2020-10-08 19:05 ` David Wilder
  2020-10-10 16:49   ` Willem de Bruijn
  2020-10-08 19:05 ` [ PATCH v1 2/2] ibmveth: Identify ingress large send packets David Wilder
  1 sibling, 1 reply; 8+ messages in thread
From: David Wilder @ 2020-10-08 19:05 UTC (permalink / raw)
  To: netdev; +Cc: tlfalcon, cris.forno, pradeeps, wilder

ibmveth_rx_csum_helper() must be called after ibmveth_rx_mss_helper()
as ibmveth_rx_csum_helper() may alter ip and tcp checksum values.

Signed-off-by: David Wilder <dwilder@us.ibm.com>
Reviewed-by: Thomas Falcon <tlfalcon@linux.ibm.com>
Reviewed-by: Cristobal Forno <cris.forno@ibm.com>
Reviewed-by: Pradeep Satyanarayana <pradeeps@linux.vnet.ibm.com>
---
 drivers/net/ethernet/ibm/ibmveth.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c
index c5c7326..3935a7e 100644
--- a/drivers/net/ethernet/ibm/ibmveth.c
+++ b/drivers/net/ethernet/ibm/ibmveth.c
@@ -1385,16 +1385,16 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
 			skb_put(skb, length);
 			skb->protocol = eth_type_trans(skb, netdev);
 
-			if (csum_good) {
-				skb->ip_summed = CHECKSUM_UNNECESSARY;
-				ibmveth_rx_csum_helper(skb, adapter);
-			}
-
 			if (length > netdev->mtu + ETH_HLEN) {
 				ibmveth_rx_mss_helper(skb, mss, lrg_pkt);
 				adapter->rx_large_packets++;
 			}
 
+			if (csum_good) {
+				skb->ip_summed = CHECKSUM_UNNECESSARY;
+				ibmveth_rx_csum_helper(skb, adapter);
+			}
+
 			napi_gro_receive(napi, skb);	/* send it up */
 
 			netdev->stats.rx_packets++;
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [ PATCH v1 2/2] ibmveth: Identify ingress large send packets.
  2020-10-08 19:05 [ PATCH v1 0/2] ibmveth gso fix David Wilder
  2020-10-08 19:05 ` [ PATCH v1 1/2] ibmveth: Switch order of ibmveth_helper calls David Wilder
@ 2020-10-08 19:05 ` David Wilder
  2020-10-10 16:40   ` Willem de Bruijn
  1 sibling, 1 reply; 8+ messages in thread
From: David Wilder @ 2020-10-08 19:05 UTC (permalink / raw)
  To: netdev; +Cc: tlfalcon, cris.forno, pradeeps, wilder

Ingress large send packets are identified by either:
The IBMVETH_RXQ_LRG_PKT flag in the receive buffer
or with a -1 placed in the ip header checksum.
The method used depends on firmware version.

Signed-off-by: David Wilder <dwilder@us.ibm.com>
Reviewed-by: Thomas Falcon <tlfalcon@linux.ibm.com>
Reviewed-by: Cristobal Forno <cris.forno@ibm.com>
Reviewed-by: Pradeep Satyanarayana <pradeeps@linux.vnet.ibm.com>
---
 drivers/net/ethernet/ibm/ibmveth.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c
index 3935a7e..e357cbe 100644
--- a/drivers/net/ethernet/ibm/ibmveth.c
+++ b/drivers/net/ethernet/ibm/ibmveth.c
@@ -1349,6 +1349,7 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
 			int offset = ibmveth_rxq_frame_offset(adapter);
 			int csum_good = ibmveth_rxq_csum_good(adapter);
 			int lrg_pkt = ibmveth_rxq_large_packet(adapter);
+			__sum16 iph_check = 0;
 
 			skb = ibmveth_rxq_get_buffer(adapter);
 
@@ -1385,7 +1386,17 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
 			skb_put(skb, length);
 			skb->protocol = eth_type_trans(skb, netdev);
 
-			if (length > netdev->mtu + ETH_HLEN) {
+			/* PHYP without PLSO support places a -1 in the ip
+			 * checksum for large send frames.
+			 */
+			if (be16_to_cpu(skb->protocol) == ETH_P_IP) {
+				struct iphdr *iph = (struct iphdr *)skb->data;
+
+				iph_check = iph->check;
+			}
+
+			if ((length > netdev->mtu + ETH_HLEN) ||
+			    lrg_pkt || iph_check == 0xffff) {
 				ibmveth_rx_mss_helper(skb, mss, lrg_pkt);
 				adapter->rx_large_packets++;
 			}
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [ PATCH v1 2/2] ibmveth: Identify ingress large send packets.
  2020-10-08 19:05 ` [ PATCH v1 2/2] ibmveth: Identify ingress large send packets David Wilder
@ 2020-10-10 16:40   ` Willem de Bruijn
  2020-10-10 16:51     ` Willem de Bruijn
  0 siblings, 1 reply; 8+ messages in thread
From: Willem de Bruijn @ 2020-10-10 16:40 UTC (permalink / raw)
  To: David Wilder; +Cc: Network Development, tlfalcon, cris.forno, pradeeps, wilder

On Thu, Oct 8, 2020 at 3:06 PM David Wilder <dwilder@us.ibm.com> wrote:
>
> Ingress large send packets are identified by either:
> The IBMVETH_RXQ_LRG_PKT flag in the receive buffer
> or with a -1 placed in the ip header checksum.
> The method used depends on firmware version.
>
> Signed-off-by: David Wilder <dwilder@us.ibm.com>
> Reviewed-by: Thomas Falcon <tlfalcon@linux.ibm.com>
> Reviewed-by: Cristobal Forno <cris.forno@ibm.com>
> Reviewed-by: Pradeep Satyanarayana <pradeeps@linux.vnet.ibm.com>
> ---
>  drivers/net/ethernet/ibm/ibmveth.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c
> index 3935a7e..e357cbe 100644
> --- a/drivers/net/ethernet/ibm/ibmveth.c
> +++ b/drivers/net/ethernet/ibm/ibmveth.c
> @@ -1349,6 +1349,7 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
>                         int offset = ibmveth_rxq_frame_offset(adapter);
>                         int csum_good = ibmveth_rxq_csum_good(adapter);
>                         int lrg_pkt = ibmveth_rxq_large_packet(adapter);
> +                       __sum16 iph_check = 0;
>
>                         skb = ibmveth_rxq_get_buffer(adapter);
>
> @@ -1385,7 +1386,17 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
>                         skb_put(skb, length);
>                         skb->protocol = eth_type_trans(skb, netdev);
>
> -                       if (length > netdev->mtu + ETH_HLEN) {
> +                       /* PHYP without PLSO support places a -1 in the ip
> +                        * checksum for large send frames.
> +                        */
> +                       if (be16_to_cpu(skb->protocol) == ETH_P_IP) {
> +                               struct iphdr *iph = (struct iphdr *)skb->data;
> +
> +                               iph_check = iph->check;

Check against truncated/bad packets.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [ PATCH v1 1/2] ibmveth: Switch order of ibmveth_helper calls.
  2020-10-08 19:05 ` [ PATCH v1 1/2] ibmveth: Switch order of ibmveth_helper calls David Wilder
@ 2020-10-10 16:49   ` Willem de Bruijn
  0 siblings, 0 replies; 8+ messages in thread
From: Willem de Bruijn @ 2020-10-10 16:49 UTC (permalink / raw)
  To: David Wilder; +Cc: Network Development, tlfalcon, cris.forno, pradeeps, wilder

On Thu, Oct 8, 2020 at 3:06 PM David Wilder <dwilder@us.ibm.com> wrote:
>
> ibmveth_rx_csum_helper() must be called after ibmveth_rx_mss_helper()
> as ibmveth_rx_csum_helper() may alter ip and tcp checksum values.
>
> Signed-off-by: David Wilder <dwilder@us.ibm.com>
> Reviewed-by: Thomas Falcon <tlfalcon@linux.ibm.com>
> Reviewed-by: Cristobal Forno <cris.forno@ibm.com>
> Reviewed-by: Pradeep Satyanarayana <pradeeps@linux.vnet.ibm.com>

Acked-by: Willem de Bruijn <willemb@google.com>

(for netdrv)

At first glance the two features sound independent, but this device
may pass mss information through the tcp checksum field. Hence that
must not get overwritten first.

"
        /* if mss is not set through Large Packet bit/mss in rx buffer,
         * expect that the mss will be written to the tcp header checksum.
         */
"

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [ PATCH v1 2/2] ibmveth: Identify ingress large send packets.
  2020-10-10 16:40   ` Willem de Bruijn
@ 2020-10-10 16:51     ` Willem de Bruijn
  2020-10-11 18:31       ` Jakub Kicinski
  0 siblings, 1 reply; 8+ messages in thread
From: Willem de Bruijn @ 2020-10-10 16:51 UTC (permalink / raw)
  To: David Wilder; +Cc: Network Development, tlfalcon, cris.forno, pradeeps, wilder

On Sat, Oct 10, 2020 at 12:40 PM Willem de Bruijn
<willemdebruijn.kernel@gmail.com> wrote:
>
> On Thu, Oct 8, 2020 at 3:06 PM David Wilder <dwilder@us.ibm.com> wrote:
> >
> > Ingress large send packets are identified by either:
> > The IBMVETH_RXQ_LRG_PKT flag in the receive buffer
> > or with a -1 placed in the ip header checksum.
> > The method used depends on firmware version.
> >
> > Signed-off-by: David Wilder <dwilder@us.ibm.com>
> > Reviewed-by: Thomas Falcon <tlfalcon@linux.ibm.com>
> > Reviewed-by: Cristobal Forno <cris.forno@ibm.com>
> > Reviewed-by: Pradeep Satyanarayana <pradeeps@linux.vnet.ibm.com>
> > ---
> >  drivers/net/ethernet/ibm/ibmveth.c | 13 ++++++++++++-
> >  1 file changed, 12 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c
> > index 3935a7e..e357cbe 100644
> > --- a/drivers/net/ethernet/ibm/ibmveth.c
> > +++ b/drivers/net/ethernet/ibm/ibmveth.c
> > @@ -1349,6 +1349,7 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
> >                         int offset = ibmveth_rxq_frame_offset(adapter);
> >                         int csum_good = ibmveth_rxq_csum_good(adapter);
> >                         int lrg_pkt = ibmveth_rxq_large_packet(adapter);
> > +                       __sum16 iph_check = 0;
> >
> >                         skb = ibmveth_rxq_get_buffer(adapter);
> >
> > @@ -1385,7 +1386,17 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
> >                         skb_put(skb, length);
> >                         skb->protocol = eth_type_trans(skb, netdev);
> >
> > -                       if (length > netdev->mtu + ETH_HLEN) {
> > +                       /* PHYP without PLSO support places a -1 in the ip
> > +                        * checksum for large send frames.
> > +                        */
> > +                       if (be16_to_cpu(skb->protocol) == ETH_P_IP) {
> > +                               struct iphdr *iph = (struct iphdr *)skb->data;
> > +
> > +                               iph_check = iph->check;
>
> Check against truncated/bad packets.

.. unless I missed context. Other code in this driver seems to peek in
the network and transport layer headers without additional geometry
and integrity checks, too.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [ PATCH v1 2/2] ibmveth: Identify ingress large send packets.
  2020-10-10 16:51     ` Willem de Bruijn
@ 2020-10-11 18:31       ` Jakub Kicinski
  2020-10-12 22:30         ` dwilder
  0 siblings, 1 reply; 8+ messages in thread
From: Jakub Kicinski @ 2020-10-11 18:31 UTC (permalink / raw)
  To: Willem de Bruijn
  Cc: David Wilder, Network Development, tlfalcon, cris.forno,
	pradeeps, wilder

On Sat, 10 Oct 2020 12:51:30 -0400 Willem de Bruijn wrote:
> > > @@ -1385,7 +1386,17 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
> > >                         skb_put(skb, length);
> > >                         skb->protocol = eth_type_trans(skb, netdev);
> > >
> > > -                       if (length > netdev->mtu + ETH_HLEN) {
> > > +                       /* PHYP without PLSO support places a -1 in the ip
> > > +                        * checksum for large send frames.
> > > +                        */
> > > +                       if (be16_to_cpu(skb->protocol) == ETH_P_IP) {

You can byteswap the constant, so its done at compilation time.

> > > +                               struct iphdr *iph = (struct iphdr *)skb->data;
> > > +
> > > +                               iph_check = iph->check;  
> >
> > Check against truncated/bad packets.  
> 
> .. unless I missed context. Other code in this driver seems to peek in
> the network and transport layer headers without additional geometry
> and integrity checks, too.

Good catch, even if we trust the hypervisor to only forward valid
frames this needs to be at least mentioned in the commit message.

Also please add Fixes tags to both patches.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [ PATCH v1 2/2] ibmveth: Identify ingress large send packets.
  2020-10-11 18:31       ` Jakub Kicinski
@ 2020-10-12 22:30         ` dwilder
  0 siblings, 0 replies; 8+ messages in thread
From: dwilder @ 2020-10-12 22:30 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: Willem de Bruijn, Network Development, tlfalcon, cris.forno,
	pradeeps, wilder

On 2020-10-11 11:31, Jakub Kicinski wrote:
> On Sat, 10 Oct 2020 12:51:30 -0400 Willem de Bruijn wrote:
>> > > @@ -1385,7 +1386,17 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
>> > >                         skb_put(skb, length);
>> > >                         skb->protocol = eth_type_trans(skb, netdev);
>> > >
>> > > -                       if (length > netdev->mtu + ETH_HLEN) {
>> > > +                       /* PHYP without PLSO support places a -1 in the ip
>> > > +                        * checksum for large send frames.
>> > > +                        */
>> > > +                       if (be16_to_cpu(skb->protocol) == ETH_P_IP) {
> 
> You can byteswap the constant, so its done at compilation time.

Thanks for the comments.

For V2 of patch I will change above to BE16_TO_CPU()

> 
>> > > +                               struct iphdr *iph = (struct iphdr *)skb->data;
>> > > +
>> > > +                               iph_check = iph->check;
>> >
>> > Check against truncated/bad packets.
>> 
>> .. unless I missed context. Other code in this driver seems to peek in
>> the network and transport layer headers without additional geometry
>> and integrity checks, too.
> 
> Good catch, even if we trust the hypervisor to only forward valid
> frames this needs to be at least mentioned in the commit message.
> 
> Also please add Fixes tags to both patches.

For V2: ( posting soon )
-Will add Fix tags
-update commit message re: validity of frames from Hypervisor.
-switch be16_to_cpu() to BE16_TO_CPU().

Thanks

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-10-12 22:30 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-08 19:05 [ PATCH v1 0/2] ibmveth gso fix David Wilder
2020-10-08 19:05 ` [ PATCH v1 1/2] ibmveth: Switch order of ibmveth_helper calls David Wilder
2020-10-10 16:49   ` Willem de Bruijn
2020-10-08 19:05 ` [ PATCH v1 2/2] ibmveth: Identify ingress large send packets David Wilder
2020-10-10 16:40   ` Willem de Bruijn
2020-10-10 16:51     ` Willem de Bruijn
2020-10-11 18:31       ` Jakub Kicinski
2020-10-12 22:30         ` dwilder

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.