提交 98a82feb 编写于 作者: R Ralf Baechle 提交者: David S. Miller

[AX25/NETROM]: Cleanup direct calls into IP stack

Get rid of the calls to ip_rcv and arp_rcv which were layering
violations anyway.  With those being replaced by netif_rx, less parts
of AX.25 and relatives depend on INET support actually being enabled.
This also will make PF_PACKET sockets work for IP and ARP packets
received over AX.25 and for IP packets over NET/ROM.
Signed-off-by: NRalf Baechle DL5RB <ralf@linux-mips.org>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 0c7770c7
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
* Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de) * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
* Copyright (C) Hans-Joachim Hetscher DD8NE (dd8ne@bnv-bamberg.de) * Copyright (C) Hans-Joachim Hetscher DD8NE (dd8ne@bnv-bamberg.de)
*/ */
#include <linux/config.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -26,9 +25,7 @@ ...@@ -26,9 +25,7 @@
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/netfilter.h> #include <linux/netfilter.h>
#include <net/sock.h> #include <net/sock.h>
#include <net/ip.h> /* For ip_rcv */
#include <net/tcp_states.h> #include <net/tcp_states.h>
#include <net/arp.h> /* For arp_rcv */
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/system.h> #include <asm/system.h>
#include <linux/fcntl.h> #include <linux/fcntl.h>
...@@ -114,7 +111,6 @@ int ax25_rx_iframe(ax25_cb *ax25, struct sk_buff *skb) ...@@ -114,7 +111,6 @@ int ax25_rx_iframe(ax25_cb *ax25, struct sk_buff *skb)
pid = *skb->data; pid = *skb->data;
#ifdef CONFIG_INET
if (pid == AX25_P_IP) { if (pid == AX25_P_IP) {
/* working around a TCP bug to keep additional listeners /* working around a TCP bug to keep additional listeners
* happy. TCP re-uses the buffer and destroys the original * happy. TCP re-uses the buffer and destroys the original
...@@ -132,10 +128,9 @@ int ax25_rx_iframe(ax25_cb *ax25, struct sk_buff *skb) ...@@ -132,10 +128,9 @@ int ax25_rx_iframe(ax25_cb *ax25, struct sk_buff *skb)
skb->dev = ax25->ax25_dev->dev; skb->dev = ax25->ax25_dev->dev;
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
skb->protocol = htons(ETH_P_IP); skb->protocol = htons(ETH_P_IP);
ip_rcv(skb, skb->dev, NULL, skb->dev); /* Wrong ptype */ netif_rx(skb);
return 1; return 1;
} }
#endif
if (pid == AX25_P_SEGMENT) { if (pid == AX25_P_SEGMENT) {
skb_pull(skb, 1); /* Remove PID */ skb_pull(skb, 1); /* Remove PID */
return ax25_rx_fragment(ax25, skb); return ax25_rx_fragment(ax25, skb);
...@@ -250,7 +245,6 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -250,7 +245,6 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
/* Now we are pointing at the pid byte */ /* Now we are pointing at the pid byte */
switch (skb->data[1]) { switch (skb->data[1]) {
#ifdef CONFIG_INET
case AX25_P_IP: case AX25_P_IP:
skb_pull(skb,2); /* drop PID/CTRL */ skb_pull(skb,2); /* drop PID/CTRL */
skb->h.raw = skb->data; skb->h.raw = skb->data;
...@@ -258,7 +252,7 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -258,7 +252,7 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
skb->dev = dev; skb->dev = dev;
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
skb->protocol = htons(ETH_P_IP); skb->protocol = htons(ETH_P_IP);
ip_rcv(skb, dev, ptype, dev); /* Note ptype here is the wrong one, fix me later */ netif_rx(skb);
break; break;
case AX25_P_ARP: case AX25_P_ARP:
...@@ -268,9 +262,8 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -268,9 +262,8 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
skb->dev = dev; skb->dev = dev;
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
skb->protocol = htons(ETH_P_ARP); skb->protocol = htons(ETH_P_ARP);
arp_rcv(skb, dev, ptype, dev); /* Note ptype here is wrong... */ netif_rx(skb);
break; break;
#endif
case AX25_P_TEXT: case AX25_P_TEXT:
/* Now find a suitable dgram socket */ /* Now find a suitable dgram socket */
sk = ax25_get_socket(&dest, &src, SOCK_DGRAM); sk = ax25_get_socket(&dest, &src, SOCK_DGRAM);
......
...@@ -858,17 +858,16 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev) ...@@ -858,17 +858,16 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
frametype = skb->data[19] & 0x0F; frametype = skb->data[19] & 0x0F;
flags = skb->data[19] & 0xF0; flags = skb->data[19] & 0xF0;
#ifdef CONFIG_INET
/* /*
* Check for an incoming IP over NET/ROM frame. * Check for an incoming IP over NET/ROM frame.
*/ */
if (frametype == NR_PROTOEXT && circuit_index == NR_PROTO_IP && circuit_id == NR_PROTO_IP) { if (frametype == NR_PROTOEXT &&
circuit_index == NR_PROTO_IP && circuit_id == NR_PROTO_IP) {
skb_pull(skb, NR_NETWORK_LEN + NR_TRANSPORT_LEN); skb_pull(skb, NR_NETWORK_LEN + NR_TRANSPORT_LEN);
skb->h.raw = skb->data; skb->h.raw = skb->data;
return nr_rx_ip(skb, dev); return nr_rx_ip(skb, dev);
} }
#endif
/* /*
* Find an existing socket connection, based on circuit ID, if it's * Find an existing socket connection, based on circuit ID, if it's
......
...@@ -38,8 +38,6 @@ ...@@ -38,8 +38,6 @@
#include <net/ax25.h> #include <net/ax25.h>
#include <net/netrom.h> #include <net/netrom.h>
#ifdef CONFIG_INET
/* /*
* Only allow IP over NET/ROM frames through if the netrom device is up. * Only allow IP over NET/ROM frames through if the netrom device is up.
*/ */
...@@ -64,11 +62,12 @@ int nr_rx_ip(struct sk_buff *skb, struct net_device *dev) ...@@ -64,11 +62,12 @@ int nr_rx_ip(struct sk_buff *skb, struct net_device *dev)
skb->nh.raw = skb->data; skb->nh.raw = skb->data;
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
ip_rcv(skb, skb->dev, NULL, skb->dev); netif_rx(skb);
return 1; return 1;
} }
#ifdef CONFIG_INET
static int nr_rebuild_header(struct sk_buff *skb) static int nr_rebuild_header(struct sk_buff *skb)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册