[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:
parent
0c7770c740
commit
98a82febb6
3 changed files with 7 additions and 16 deletions
|
@ -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 @@
|
||||||
#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)
|
||||||
|
|
||||||
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)
|
||||||
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,
|
||||||
|
|
||||||
/* 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,
|
||||||
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,
|
||||||
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)
|
||||||
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 @@
|
||||||
#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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue