Skip to contentSkip to conversation

appletalk: Pass IP-over-DDP packets through when 'ipddp0' interface is not present

PATCH In review Adam Seering 2 participants 5 messages Feb 23, 2016 – Mar 20, 2016

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 appletalk: Pass IP-over-DDP packets through when 'ipddp0' interface is not present

Let userspace programs transmit and receive raw IP-over-DDP packets with a kernel where "ipddp" was compiled as a module but is not loaded (so no "ipddp0" network interface is exposed). This makes the "module is not loaded" behavior match the "module was never compiled" behavior.

---

[edit] Re-sending at hopefully a more-appropriate time.

This is a small proposed change to the ddp code. It's also my first attempt at a kernel patch; I'd appreciate any feedback or discussion. I'm working on the Linux "macipgw" port; it duplicates some functionality of the "ipddp" module, but the latter depends on userspace utilities which I can no longer find up-to-date working copies of?

net/appletalk/ddp.c +12 -12
index d5871ac..d30e55f 100644
@@ -1284,17 +1284,10 @@ static __inline__ int is_ip_over_ddp(struct sk_buff *skb)
        return skb->data[12] == 22;
 }
 
-static int handle_ip_over_ddp(struct sk_buff *skb)
+static int handle_ip_over_ddp(struct sk_buff *skb, struct net_device *dev)
 {
-       struct net_device *dev = __dev_get_by_name(&init_net, "ipddp0");
        struct net_device_stats *stats;
 
-       /* This needs to be able to handle ipddp"N" devices */
-       if (!dev) {
-               kfree_skb(skb);
-               return NET_RX_DROP;
-       }
-
        skb->protocol = htons(ETH_P_IP);
        skb_pull(skb, 13);
        skb->dev   = dev;
@@ -1308,7 +1301,7 @@ static int handle_ip_over_ddp(struct sk_buff *skb)
 #else
 /* make it easy for gcc to optimize this test out, i.e. kill the code */
 #define is_ip_over_ddp(skb) 0
-#define handle_ip_over_ddp(skb) 0
+#define handle_ip_over_ddp(skb, dev) 0
 #endif
 
 static int atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
@@ -1418,6 +1411,8 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
        struct sock *sock;
        struct atalk_iface *atif;
        struct sockaddr_at tosat;
+       struct net_device *ipddp_dev;
+
        int origlen;
        __u16 len_hops;
 
@@ -1473,9 +1468,14 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
                return atalk_route_packet(skb, dev, ddp, len_hops, origlen);
        }
 
-       /* if IP over DDP is not selected this code will be optimized out */
-       if (is_ip_over_ddp(skb))
-               return handle_ip_over_ddp(skb);
+       /* if IP over DDP is not selected this code should be optimized out */
+       if (is_ip_over_ddp(skb)) {
+               ipddp_dev = __dev_get_by_name(&init_net, "ipddp0");
+
+               /* This needs to be able to handle ipddp"N" devices */
+               if (ipddp_dev)
+                       return handle_ip_over_ddp(skb, ipddp_dev);
+       }
        /*
         * Which socket - atalk_search_socket() looks for a *full match*
         * of the <net, node, port> tuple.
maintainer
#1 lore raw

From: Adam Seering <[email protected]>
Date: Tue, 23 Feb 2016 09:19:13 -0500

Quoted 6 lines

Let userspace programs transmit and receive raw IP-over-DDP packets with a kernel where "ipddp" was compiled as a module but is not loaded (so no "ipddp0" network interface is exposed). This makes the "module is not loaded" behavior match the "module was never compiled" behavior.

I think a better approache is to somehow autoload the module.

#2 lore raw
Quoted 6 lines · David Miller

From: Adam Seering <[email protected]>
Date: Tue, 23 Feb 2016 09:19:13 -0500

Quoted 2 lines

Let userspace programs transmit and receive raw IP-over-DDP packets with a kernel where "ipddp" was compiled as a module but is not

loaded

Quoted 8 lines
Quoted 1 line

(so no "ipddp0" network interface is exposed). This makes the

"module

Quoted 1 line

is not loaded" behavior match the "module was never compiled"

behavior.

Quoted 2 lines

I think a better approache is to somehow autoload the module.

Could you elaborate? Specifically: the kernel currently suppresses packets on behalf of the module even after the module is unloaded. How would autoloading the module help with that?

#3 lore raw
Quoted 13 lines · Adam Seering
Quoted 12 lines · David Miller

From: Adam Seering <[email protected]>
Date: Tue, 23 Feb 2016 09:19:13 -0500

Quoted 3 lines

Let userspace programs transmit and receive raw IP-over-DDP packets
with a kernel where "ipddp" was compiled as a module but is not

loaded

Quoted 1 line

(so no "ipddp0" network interface is exposed). This makes the

"module

Quoted 1 line

is not loaded" behavior match the "module was never compiled"

behavior.

Quoted 1 line
Quoted 8 lines
Quoted 3 lines
Quoted 1 line

I think a better approache is to somehow autoload the module.

Could you elaborate? Specifically: the kernel currently suppresses packets on behalf of the module even after the module is unloaded.
How
would autoloading the module help with that?

Re-reading this thread -- perhaps I didn't explain the problem well.
Let me elaborate. Apologies if this is obvious to folks here:

I want my userspace program to send and receive DDP packets that encapsulate IP traffic.

Problem: On some kernel builds, these DDP packets are never delivered to the DDP socket opened by my program.

The "ipddp" module is supposed to prevent those packets from being delivered to DDP sockets when it is loaded -- it handles them itself.
Ok, that's fine; I just want to unload that module, right?

Wrong! Unloading the module is not sufficient. I have to re-compile the kernel with the module disabled completely. (No other config options; simply setting the module to not build does the trick.) whose sole purpose is to handle it. If not, unload it. This patch makes that happen. Thoughts?

Thanks,
Adam

#4 lore raw
In reply to Adam Seering
Quoted 13 lines · Adam Seering
Quoted 12 lines · David Miller

From: Adam Seering <[email protected]>
Date: Tue, 23 Feb 2016 09:19:13 -0500

Quoted 3 lines

Let userspace programs transmit and receive raw IP-over-DDP packets
with a kernel where "ipddp" was compiled as a module but is not

loaded

Quoted 1 line

(so no "ipddp0" network interface is exposed). This makes the

"module

Quoted 1 line

is not loaded" behavior match the "module was never compiled"

behavior.

Quoted 1 line
Quoted 9 lines
Quoted 3 lines
Quoted 1 line

I think a better approache is to somehow autoload the module.

Could you elaborate? Specifically: the kernel currently suppresses packets on behalf of the module even after the module is unloaded.
How
would autoloading the module help with that?

I realize and appreciate that I'm not supposed to nag you folks for feedback. But I don't know how to proceed. So, rather than nag you, I've filed a bug:

https://bugzilla.kernel.org/show_bug.cgi?id=115031

I've tested my patch; I believe it to be the simplest change that resolves this bug. I'm happy to write something else if it would be cleaner and/or help others, but I would need a more-detailed explanation of what you're looking for.

I've also filed a ticket downstream: Red Hat appears to not build the ipddp module with their stock kernel release, so their users don't hit this bug. But Ubuntu does build/ship ipddp; if they likewise didn't, that would also solve my problem:

https://bugs.launchpad.net/ubuntu/+source/linux-lts-wily/+bug/1559772

Adam