Convert pppoe to new style protocol
Subsystems (2)
PATCH 1/1 Convert pppoe to new style protocol
Convert pppoe to a new style protocol, otherwise it is unusable on SMP compiled kernels because of the printk in deliver*old_ones. It works fine here, but only tested on a UP box.
I checked with paulus and he confirmed that ppp_input is safe to be called with the new softirq semantics. The PPP path also appears to work with shared skbs (never modify skb data, not 100% audited however) but not with non linear skbs.
The pppoe code itself is safe because it never uses timers or does anything complicated.
If someone knows a place in ppp_input that modifies the data area then please contain now so that a skb_copy can be added.
-Andi
drivers/net/pppoe.c renamed from drivers/net/pppoe.c-o +5 -0
@@ -348,6 +348,9 @@struct pppox_opt *po =pppox_sk (sk);struct pppox_opt *relay_po =NULL ; +if (skb_is_nonlinear (skb) &&skb_linearize (skb,GFP_ATOMIC )) + goto abort_kfree; +if (sk->sk_state &PPPOX_BOUND ) {skb_pull (skb,sizeof (struct pppoe_hdr ));ppp_input (&po->chan, skb);
@@ -463,11 +466,13 @@struct packet_type pppoes_ptype = { .type =__constant_htons (ETH_P_PPP_SES ), .func = pppoe_rcv, + .data = (void *)1 , };struct packet_type pppoed_ptype = { .type =__constant_htons (ETH_P_PPP_DISC ), .func = pppoe_disc_rcv, + .data = (void *)1 , };/***********************************************************************
From: Andi Kleen <[email protected]>
Date: Wed, 18 Jun 2003 00:04:20 +0200
Convert pppoe to a new style protocol, otherwise it is unusable on SMP compiled kernels because of the printk in deliver*old_ones. It works fine here, but only tested on a UP box.
Please don't add new skb_linearize() users, I'm trying to make that only local to net/core/dev.c
Otherwise I'm fine with your patch.
Quoted 9 lines · David S. Miller
From: Andi Kleen <[email protected]>
Date: Wed, 18 Jun 2003 00:04:20 +0200Convert pppoe to a new style protocol, otherwise it is unusable on SMP compiled kernels because of the printk in deliver*old_ones. It works fine here, but only tested on a UP box.
Please don't add new
skb_linearize()users, I'm trying to make that only local tonet/core/dev.c
Then offer a flag or something for protocols that also doesn't trigger printks ?
Quoted 2 lines
Otherwise I'm fine with your patch.
How else should it be done?
I'm not going through the whole PPP layer now to audit it for non linear skb cleanliness...
-Andi
Quoted 2 lines · David S. Miller
Please don't add new
skb_linearize()users, I'm trying to make that only local tonet/core/dev.c
I know you find documentation unmanly, but maybe ...
- Werner
skbuff.h renamed from skbuff.h.orig +3 -0
@@ -1126,6 +1126,9 @@* * If there is no free memory -ENOMEM is returned, otherwise zero * is returned and the old skb data released. +* +* DO NOT USE THIS IN NEW CODE ! skb_linearize will be for internal +* use by net/core/dev.c only. */ int skb_linearize (struct sk_buff *skb,int gfp);
Signature · 3 lines
_________________________________________________________________________ / Werner Almesberger, Buenos Aires, Argentina [email protected] / /_http://www.almesberger.net/____________________________________________/
Quoted 5 lines · Werner Almesberger
Quoted 2 lines · David S. Miller
Please don't add new
skb_linearize()users, I'm trying to make that only local tonet/core/dev.cI know you find documentation unmanly, but maybe ...
But what is the replacement? For moving over whole subsystems to non linear skbs it's a bit late in the release...
And the "legacy protocol" setting cannot be used anymore because it triggers a printk for every packet on a SMP kernel.
-Andi
From: Andi Kleen <[email protected]>
Date: 18 Jun 2003 14:51:59 +0200,Wed, 18 Jun 2003 14:51:59 +0200
Quoted 1 line · Werner Almesberger
I know you find documentation unmanly, but maybe ...
But what is the replacement? For moving over whole subsystems to non linear skbs it's a bit late in the release...
We did it for all of netfilter just the other week, networking development still continues, it's not too late.
Stop looking for excuses and just do the work Andi.
From: Werner Almesberger <[email protected]>
Date: Wed, 18 Jun 2003 09:21:26 -0300
+ *
+ * DO NOT USE THIS IN NEW CODE ! skb_linearize will be for internal
+ * use by net/core/dev.c only.
*/
int skb_linearize(struct sk_buff *skb, int gfp);I have a better idea, I just added the __deprecated tag to this function declaration :-)
From: Andi Kleen <[email protected]>
Date: Wed, 18 Jun 2003 10:01:18 +0200
I'm not going through the whole PPP layer now to audit it for non linear skb cleanliness...
Then you're not making it a compatible protocol. And the printk will remain until someone fixes it.
If I could get Rusty to fixup _ALL_ of netfilter, I can get you to fix just _ONE_ thing.