summaryrefslogtreecommitdiffstats
path: root/net/packet
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1998-03-17 22:05:47 +0000
committerRalf Baechle <ralf@linux-mips.org>1998-03-17 22:05:47 +0000
commit27cfca1ec98e91261b1a5355d10a8996464b63af (patch)
tree8e895a53e372fa682b4c0a585b9377d67ed70d0e /net/packet
parent6a76fb7214c477ccf6582bd79c5b4ccc4f9c41b1 (diff)
Look Ma' what I found on my harddisk ...
o New faster syscalls for 2.1.x, too o Upgrade to 2.1.89. Don't try to run this. It's flaky as hell. But feel free to debug ...
Diffstat (limited to 'net/packet')
-rw-r--r--net/packet/.cvsignore1
-rw-r--r--net/packet/af_packet.c100
2 files changed, 59 insertions, 42 deletions
diff --git a/net/packet/.cvsignore b/net/packet/.cvsignore
index 4671378ae..857dd22e9 100644
--- a/net/packet/.cvsignore
+++ b/net/packet/.cvsignore
@@ -1 +1,2 @@
.depend
+.*.flags
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index ff7fef131..a098f59b9 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -66,8 +66,16 @@
#include <linux/module.h>
#include <linux/init.h>
-#if defined(CONFIG_DLCI) || defined(CONFIG_DLCI_MODULE)
-#include <linux/if_frad.h>
+#ifdef CONFIG_INET
+#include <net/inet_common.h>
+#endif
+
+#ifdef CONFIG_BRIDGE
+#include <net/br.h>
+#endif
+
+#ifdef CONFIG_DLCI
+extern int dlci_ioctl(unsigned int, void*);
#endif
/*
@@ -211,6 +219,11 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct device *dev, struct pack
* so that this procedure is noop.
*/
+ if (skb->pkt_type == PACKET_LOOPBACK) {
+ kfree_skb(skb);
+ return 0;
+ }
+
skb_push(skb, skb->data-skb->mac.raw);
/*
@@ -228,7 +241,7 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct device *dev, struct pack
if (sock_queue_rcv_skb(sk,skb)<0)
{
- kfree_skb(skb, FREE_READ);
+ kfree_skb(skb);
return 0;
}
@@ -318,16 +331,14 @@ static int packet_sendmsg_spkt(struct socket *sock, struct msghdr *msg, int len,
* notable one here. This should really be fixed at the driver level.
*/
skb_reserve(skb,(dev->hard_header_len+15)&~15);
- skb->mac.raw = skb->nh.raw = skb->data;
+ skb->nh.raw = skb->data;
/* Try to align data part correctly */
if (dev->hard_header) {
skb->data -= dev->hard_header_len;
skb->tail -= dev->hard_header_len;
- skb->mac.raw = skb->data;
}
err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len);
- skb->arp = 1; /* No ARP needs doing on this (complete) frame */
skb->protocol = proto;
skb->dev = dev;
skb->priority = sk->priority;
@@ -351,7 +362,7 @@ static int packet_sendmsg_spkt(struct socket *sock, struct msghdr *msg, int len,
if (err)
{
- kfree_skb(skb, FREE_WRITE);
+ kfree_skb(skb);
return err;
}
@@ -372,9 +383,10 @@ static int packet_rcv(struct sk_buff *skb, struct device *dev, struct packet_ty
sk = (struct sock *) pt->data;
- /*
- * The SOCK_PACKET socket receives _all_ frames.
- */
+ if (skb->pkt_type == PACKET_LOOPBACK) {
+ kfree_skb(skb);
+ return 0;
+ }
skb->dev = dev;
@@ -411,7 +423,7 @@ static int packet_rcv(struct sk_buff *skb, struct device *dev, struct packet_ty
if (sock_queue_rcv_skb(sk,skb)<0)
{
- kfree_skb(skb, FREE_READ);
+ kfree_skb(skb);
return 0;
}
return(0);
@@ -469,18 +481,17 @@ static int packet_sendmsg(struct socket *sock, struct msghdr *msg, int len,
}
skb_reserve(skb, (dev->hard_header_len+15)&~15);
- skb->mac.raw = skb->nh.raw = skb->data;
+ skb->nh.raw = skb->data;
if (dev->hard_header) {
if (dev->hard_header(skb, dev, ntohs(proto),
saddr ? saddr->sll_addr : NULL,
NULL, len) < 0
&& sock->type == SOCK_DGRAM) {
- kfree_skb(skb, FREE_WRITE);
+ kfree_skb(skb);
dev_unlock_list();
return -EINVAL;
}
- skb->mac.raw = skb->data;
if (sock->type != SOCK_DGRAM) {
skb->tail = skb->data;
skb->len = 0;
@@ -488,7 +499,6 @@ static int packet_sendmsg(struct socket *sock, struct msghdr *msg, int len,
}
err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len);
- skb->arp = 1; /* No ARP needs doing on this (complete) frame */
skb->protocol = proto;
skb->dev = dev;
skb->priority = sk->priority;
@@ -506,7 +516,7 @@ static int packet_sendmsg(struct socket *sock, struct msghdr *msg, int len,
}
if (err) {
- kfree_skb(skb, FREE_WRITE);
+ kfree_skb(skb);
return err;
}
@@ -575,7 +585,7 @@ static int packet_release(struct socket *sock, struct socket *peersock)
/* Purge queues */
while ((skb=skb_dequeue(&sk->receive_queue))!=NULL)
- kfree_skb(skb,FREE_READ);
+ kfree_skb(skb);
if (atomic_read(&sk->rmem_alloc) || atomic_read(&sk->wmem_alloc)) {
sk->timer.data=(unsigned long)sk;
@@ -768,9 +778,8 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, int len,
int flags, struct scm_cookie *scm)
{
struct sock *sk = sock->sk;
- int copied=0;
struct sk_buff *skb;
- int err;
+ int copied, err;
#if 0
/* What error should we return now? EUNATTACH? */
@@ -806,7 +815,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, int len,
*/
if(skb==NULL)
- return err;
+ goto out;
/*
* You lose any data beyond the buffer you gave. If it worries a
@@ -814,7 +823,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, int len,
*/
copied = skb->len;
- if(copied>len)
+ if (copied > len)
{
copied=len;
msg->msg_flags|=MSG_TRUNC;
@@ -823,9 +832,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, int len,
/* We can't use skb_copy_datagram here */
err = memcpy_toiovec(msg->msg_iov, skb->data, copied);
if (err)
- {
- return -EFAULT;
- }
+ goto out_free;
sk->stamp=skb->stamp;
@@ -833,13 +840,15 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, int len,
memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
/*
- * Free or return the buffer as appropriate. Again this hides all the
- * races and re-entrancy issues from us.
+ * Free or return the buffer as appropriate. Again this
+ * hides all the races and re-entrancy issues from us.
*/
+ err = copied;
+out_free:
skb_free_datagram(sk, skb);
-
- return(copied);
+out:
+ return err;
}
#ifdef CONFIG_SOCK_PACKET
@@ -1107,7 +1116,9 @@ static int packet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg
err = -EFAULT;
return err;
case SIOCGIFFLAGS:
+#ifndef CONFIG_INET
case SIOCSIFFLAGS:
+#endif
case SIOCGIFCONF:
case SIOCGIFMETRIC:
case SIOCSIFMETRIC:
@@ -1136,24 +1147,29 @@ static int packet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg
return -ENOPKG;
#endif
+#ifdef CONFIG_INET
+ case SIOCADDRT:
+ case SIOCDELRT:
+ case SIOCDARP:
+ case SIOCGARP:
+ case SIOCSARP:
+ case SIOCDRARP:
+ case SIOCGRARP:
+ case SIOCSRARP:
+ case SIOCGIFADDR:
+ case SIOCSIFADDR:
+ case SIOCGIFBRDADDR:
+ case SIOCSIFBRDADDR:
+ case SIOCGIFNETMASK:
+ case SIOCSIFNETMASK:
+ case SIOCGIFDSTADDR:
+ case SIOCSIFDSTADDR:
+ case SIOCSIFFLAGS:
case SIOCADDDLCI:
case SIOCDELDLCI:
-#ifdef CONFIG_DLCI
- return(dlci_ioctl(cmd, (void *) arg));
-#endif
-
-#ifdef CONFIG_DLCI_MODULE
-
-#ifdef CONFIG_KERNELD
- if (dlci_ioctl_hook == NULL)
- request_module("dlci");
+ return inet_dgram_ops.ioctl(sock, cmd, arg);
#endif
- if (dlci_ioctl_hook)
- return((*dlci_ioctl_hook)(cmd, (void *) arg));
-#endif
- return -ENOPKG;
-
default:
if ((cmd >= SIOCDEVPRIVATE) &&
(cmd <= (SIOCDEVPRIVATE + 15)))