Re: [nf-next PATCH] nf_flow_table_offload: offload the PPPoE encap in the flowtable

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2022/5/17 19:18, Pablo Neira Ayuso wrote:
> Hi,
>
> On Tue, May 17, 2022 at 09:56:57AM +0800, wenxu wrote:
>> The patch “netfilter: nft_flow_offload: fix offload with pppoe + vlan”
>>
>> Currently the nf flow table can't offload pppoe encap. So this patch
>> fix the pppoe + vlan  problem for no encap offload logic in the nf tree,  the
>> outdev should be the pppoe device but not vlan device.
> You mean Felix's patch is not correct ?

Felix's patch is correct. Because There is no pppoe encap software offload feature in the nf tree. 

>
>> My patch provide a feature with pppoe encap offload. I think that the difference
>> and maybe I can repost the three patch rebase  to this series?
> Or maybe you mean you would like to repost for review on top once the
> fixes show on nf.git ?
Yes. 
>
> Thanks.
>
>> Any ideas?
>>
>> On 2022/5/16 19:13, Pablo Neira Ayuso wrote:
>>> Hi,
>>>
>>> This is likely clashing with Felix's fixes:
>>>
>>> https://patchwork.ozlabs.org/project/netfilter-devel/patch/20220509122616.65449-1-nbd@xxxxxxxx/
>>> https://patchwork.ozlabs.org/project/netfilter-devel/patch/20220509122616.65449-2-nbd@xxxxxxxx/
>>> https://patchwork.ozlabs.org/project/netfilter-devel/patch/20220509122616.65449-3-nbd@xxxxxxxx/
>>> https://patchwork.ozlabs.org/project/netfilter-devel/patch/20220509122616.65449-4-nbd@xxxxxxxx/
>>>
>>> On Tue, May 10, 2022 at 09:26:16AM -0400, wenxu@xxxxxxxxxxxxxxx wrote:
>>>> From: wenxu <wenxu@xxxxxxxxxxxxxxx>
>>>>
>>>> This patch put the pppoe process in the FLOW_OFFLOAD_XMIT_DIRECT
>>>> mode. Xmit the packet with PPPoE can offload to the underlay device
>>>> directly.
>>>>
>>>> It can support all kinds of VLAN dev path:
>>>> pppoe-->eth
>>>> pppoe-->br0.100-->br0(vlan filter enable)-->eth
>>>> pppoe-->eth.100-->eth
>>>>
>>>> The packet xmit and recv offload to the 'eth' in both original and
>>>> reply direction.
>>>>
>>>> Signed-off-by: wenxu <wenxu@xxxxxxxxxxxxxxx>
>>>> ---
>>>> This patch based on the following one: nf_flow_table_offload: offload the vlan encap in the flowtable
>>>> http://patchwork.ozlabs.org/project/netfilter-devel/patch/1649169515-4337-1-git-send-email-wenx05124561@xxxxxxx/
>>>>
>>>>  include/net/netfilter/nf_flow_table.h | 34 ++++++++++++++++++++++++++++++++++
>>>>  net/netfilter/nf_flow_table_ip.c      |  3 +++
>>>>  net/netfilter/nft_flow_offload.c      | 10 +++-------
>>>>  3 files changed, 40 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/include/net/netfilter/nf_flow_table.h b/include/net/netfilter/nf_flow_table.h
>>>> index 64daafd..8be369c 100644
>>>> --- a/include/net/netfilter/nf_flow_table.h
>>>> +++ b/include/net/netfilter/nf_flow_table.h
>>>> @@ -319,6 +319,40 @@ int nf_flow_rule_route_ipv6(struct net *net, const struct flow_offload *flow,
>>>>  int nf_flow_table_offload_init(void);
>>>>  void nf_flow_table_offload_exit(void);
>>>>  
>>>> +static inline int nf_flow_ppoe_push(struct sk_buff *skb, u16 id)
>>>> +{
>>>> +	struct ppp_hdr {
>>>> +		struct pppoe_hdr hdr;
>>>> +		__be16 proto;
>>>> +	} *ph;
>>>> +	int data_len = skb->len + 2;
>>>> +	__be16 proto;
>>>> +
>>>> +	if (skb_cow_head(skb, PPPOE_SES_HLEN))
>>>> +		return -1;
>>>> +
>>>> +	if (skb->protocol == htons(ETH_P_IP))
>>>> +		proto = htons(PPP_IP);
>>>> +	else if (skb->protocol == htons(ETH_P_IPV6))
>>>> +		proto = htons(PPP_IPV6);
>>>> +	else
>>>> +		return -1;
>>>> +
>>>> +	__skb_push(skb, PPPOE_SES_HLEN);
>>>> +	skb_reset_network_header(skb);
>>>> +
>>>> +	ph = (struct ppp_hdr *)(skb->data);
>>>> +	ph->hdr.ver  = 1;
>>>> +	ph->hdr.type = 1;
>>>> +	ph->hdr.code = 0;
>>>> +	ph->hdr.sid  = htons(id);
>>>> +	ph->hdr.length = htons(data_len);
>>>> +	ph->proto = proto;
>>>> +	skb->protocol = htons(ETH_P_PPP_SES);
>>>> +
>>>> +	return 0;
>>>> +}
>>>> +
>>>>  static inline __be16 nf_flow_pppoe_proto(const struct sk_buff *skb)
>>>>  {
>>>>  	__be16 proto;
>>>> diff --git a/net/netfilter/nf_flow_table_ip.c b/net/netfilter/nf_flow_table_ip.c
>>>> index 99ae2550..d1c0d95 100644
>>>> --- a/net/netfilter/nf_flow_table_ip.c
>>>> +++ b/net/netfilter/nf_flow_table_ip.c
>>>> @@ -295,6 +295,9 @@ static void nf_flow_encap_push(struct sk_buff *skb,
>>>>  				      tuplehash->tuple.encap[i].proto,
>>>>  				      tuplehash->tuple.encap[i].id);
>>>>  			break;
>>>> +		case htons(ETH_P_PPP_SES):
>>>> +			nf_flow_ppoe_push(skb, tuplehash->tuple.encap[i].id);
>>>> +			break;
>>>>  		}
>>>>  	}
>>>>  }
>>>> diff --git a/net/netfilter/nft_flow_offload.c b/net/netfilter/nft_flow_offload.c
>>>> index f9837c9..eea8637 100644
>>>> --- a/net/netfilter/nft_flow_offload.c
>>>> +++ b/net/netfilter/nft_flow_offload.c
>>>> @@ -122,12 +122,9 @@ static void nft_dev_path_info(const struct net_device_path_stack *stack,
>>>>  			info->encap[info->num_encaps].id = path->encap.id;
>>>>  			info->encap[info->num_encaps].proto = path->encap.proto;
>>>>  			info->num_encaps++;
>>>> -			if (path->type == DEV_PATH_PPPOE) {
>>>> -				info->outdev = path->dev;
>>>> +			if (path->type == DEV_PATH_PPPOE)
>>>>  				memcpy(info->h_dest, path->encap.h_dest, ETH_ALEN);
>>>> -			}
>>>> -			if (path->type == DEV_PATH_VLAN)
>>>> -				info->xmit_type = FLOW_OFFLOAD_XMIT_DIRECT;
>>>> +			info->xmit_type = FLOW_OFFLOAD_XMIT_DIRECT;
>>>>  			break;
>>>>  		case DEV_PATH_BRIDGE:
>>>>  			if (is_zero_ether_addr(info->h_source))
>>>> @@ -155,8 +152,7 @@ static void nft_dev_path_info(const struct net_device_path_stack *stack,
>>>>  			break;
>>>>  		}
>>>>  	}
>>>> -	if (!info->outdev)
>>>> -		info->outdev = info->indev;
>>>> +	info->outdev = info->indev;
>>>>  
>>>>  	info->hw_outdev = info->indev;
>>>>  
>>>> -- 
>>>> 1.8.3.1
>>>>



[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux