Skip to contentSkip to conversation

Convert pppoe to new style protocol

PATCH In review Andi Kleen 5 participants 8 messages Jun 17, 2003 – Jun 18, 2003

Subsystems (2)
lore
Share & tools
lore

Andi Kleen

author
#0 lore raw

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
diff -u linux-2.5.72-work/drivers/net/pppoe.c-o linux-2.5.72-work/drivers/net/pppoe.c
@@ -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,
 };
 
 /***********************************************************************
#1 lore raw

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.

#2 lore raw
Quoted 9 lines · David S. Miller

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

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

#3 lore raw
Quoted 2 lines · David S. Miller

Please don't add new skb_linearize() users, I'm trying to make that only local to net/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/____________________________________________/
#4 lore raw
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 to net/core/dev.c

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...

And the "legacy protocol" setting cannot be used anymore because it triggers a printk for every packet on a SMP kernel.

-Andi

#5 lore raw

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.

#6 lore raw
In reply to Werner Almesberger

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 :-)

#7 lore raw
In reply to Andi Kleen

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.