[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: Ralf Baechle DL5RB <ralf@linux-mips.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
0c7770c740
Коммит
98a82febb6
|
@ -9,7 +9,6 @@
|
|||
* Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
|
||||
* Copyright (C) Hans-Joachim Hetscher DD8NE (dd8ne@bnv-bamberg.de)
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/socket.h>
|
||||
|
@ -26,9 +25,7 @@
|
|||
#include <linux/skbuff.h>
|
||||
#include <linux/netfilter.h>
|
||||
#include <net/sock.h>
|
||||
#include <net/ip.h> /* For ip_rcv */
|
||||
#include <net/tcp_states.h>
|
||||
#include <net/arp.h> /* For arp_rcv */
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/fcntl.h>
|
||||
|
@ -114,7 +111,6 @@ int ax25_rx_iframe(ax25_cb *ax25, struct sk_buff *skb)
|
|||
|
||||
pid = *skb->data;
|
||||
|
||||
#ifdef CONFIG_INET
|
||||
if (pid == AX25_P_IP) {
|
||||
/* working around a TCP bug to keep additional listeners
|
||||
* 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)
|
|||
skb->dev = ax25->ax25_dev->dev;
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
skb->protocol = htons(ETH_P_IP);
|
||||
ip_rcv(skb, skb->dev, NULL, skb->dev); /* Wrong ptype */
|
||||
netif_rx(skb);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
if (pid == AX25_P_SEGMENT) {
|
||||
skb_pull(skb, 1); /* Remove PID */
|
||||
return ax25_rx_fragment(ax25, skb);
|
||||
|
@ -250,7 +245,6 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
|
||||
/* Now we are pointing at the pid byte */
|
||||
switch (skb->data[1]) {
|
||||
#ifdef CONFIG_INET
|
||||
case AX25_P_IP:
|
||||
skb_pull(skb,2); /* drop PID/CTRL */
|
||||
skb->h.raw = skb->data;
|
||||
|
@ -258,7 +252,7 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
skb->dev = dev;
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
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;
|
||||
|
||||
case AX25_P_ARP:
|
||||
|
@ -268,9 +262,8 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
skb->dev = dev;
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
skb->protocol = htons(ETH_P_ARP);
|
||||
arp_rcv(skb, dev, ptype, dev); /* Note ptype here is wrong... */
|
||||
netif_rx(skb);
|
||||
break;
|
||||
#endif
|
||||
case AX25_P_TEXT:
|
||||
/* Now find a suitable dgram socket */
|
||||
sk = ax25_get_socket(&dest, &src, SOCK_DGRAM);
|
||||
|
|
|
@ -858,17 +858,16 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
|
|||
frametype = skb->data[19] & 0x0F;
|
||||
flags = skb->data[19] & 0xF0;
|
||||
|
||||
#ifdef CONFIG_INET
|
||||
/*
|
||||
* 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->h.raw = skb->data;
|
||||
|
||||
return nr_rx_ip(skb, dev);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Find an existing socket connection, based on circuit ID, if it's
|
||||
|
|
|
@ -38,8 +38,6 @@
|
|||
#include <net/ax25.h>
|
||||
#include <net/netrom.h>
|
||||
|
||||
#ifdef CONFIG_INET
|
||||
|
||||
/*
|
||||
* 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)
|
|||
skb->nh.raw = skb->data;
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
|
||||
ip_rcv(skb, skb->dev, NULL, skb->dev);
|
||||
netif_rx(skb);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_INET
|
||||
|
||||
static int nr_rebuild_header(struct sk_buff *skb)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче