summaryrefslogtreecommitdiffstats
path: root/net/decnet
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-03-13 20:55:15 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-03-13 20:55:15 +0000
commit1471f525455788c20b130690e0f104df451aeb43 (patch)
tree3778beba56558beb9a9548ea5b467e9c44ea966f /net/decnet
parente80d2c5456d30ebba5b0eb8a9d33e17d815d4d83 (diff)
Merge with Linux 2.3.51.
Diffstat (limited to 'net/decnet')
-rw-r--r--net/decnet/Config.in3
-rw-r--r--net/decnet/Makefile4
-rw-r--r--net/decnet/TODO6
-rw-r--r--net/decnet/af_decnet.c38
-rw-r--r--net/decnet/dn_nsp_in.c7
-rw-r--r--net/decnet/dn_nsp_out.c5
-rw-r--r--net/decnet/dn_raw.c367
-rw-r--r--net/decnet/dn_route.c5
-rw-r--r--net/decnet/sysctl_net_decnet.c6
9 files changed, 21 insertions, 420 deletions
diff --git a/net/decnet/Config.in b/net/decnet/Config.in
index b11cdfa22..c019d3f59 100644
--- a/net/decnet/Config.in
+++ b/net/decnet/Config.in
@@ -5,7 +5,6 @@ bool ' DECnet: SIOCGIFCONF support' CONFIG_DECNET_SIOCGIFCONF
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
bool ' DECnet: router support (EXPERIMENTAL)' CONFIG_DECNET_ROUTER
if [ "$CONFIG_DECNET_ROUTER" = "y" ]; then
- bool ' DECnet: use FWMARK value as routing key' CONFIG_DECNET_ROUTE_FWMARK
+ bool ' DECnet: use FWMARK value as routing key (EXPERIMENTAL)' CONFIG_DECNET_ROUTE_FWMARK
fi
fi
-bool ' DECnet: raw socket support' CONFIG_DECNET_RAW
diff --git a/net/decnet/Makefile b/net/decnet/Makefile
index 1eeef6b40..03d35cc9c 100644
--- a/net/decnet/Makefile
+++ b/net/decnet/Makefile
@@ -8,10 +8,6 @@ ifeq ($(CONFIG_DECNET_ROUTER),y)
O_OBJS += dn_fib.o dn_rules.o dn_table.o
endif
-ifeq ($(CONFIG_DECNET_RAW),y)
-O_OBJS += dn_raw.o
-endif
-
ifeq ($(CONFIG_DECNET_FW),y)
O_OBJS += dn_fw.o
endif
diff --git a/net/decnet/TODO b/net/decnet/TODO
index 0f5c3a649..72ab936a2 100644
--- a/net/decnet/TODO
+++ b/net/decnet/TODO
@@ -4,8 +4,6 @@ Steve's quick list of things that need finishing off:
o Proper timeouts on each neighbour (in routing mode) rather than
just the 60 second On-Ethernet cache value.
- o Misc. get/set_sockopt() functions [done for the time being, more later]
-
o Support for X.25 linklayer
o Support for DDCMP link layer
@@ -14,10 +12,6 @@ Steve's quick list of things that need finishing off:
o PPP support (rfc1762)
- o sendmsg() in the raw socket layer (yes, its for sending routing messages)
-
- o Fix /proc for raw sockets
-
o Lots of testing with real applications
o Verify errors etc. against POSIX 1003.1g (draft)
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c
index 7860597ab..a2453c06a 100644
--- a/net/decnet/af_decnet.c
+++ b/net/decnet/af_decnet.c
@@ -123,7 +123,6 @@ Version 0.0.6 2.1.110 07-aug-98 Eduardo Marcelo Serrat
#include <net/dn_dev.h>
#include <net/dn_route.h>
#include <net/dn_fib.h>
-#include <net/dn_raw.h>
#include <net/dn_neigh.h>
#define MAX(a,b) ((a)>(b)?(a):(b))
@@ -401,11 +400,6 @@ struct sock *dn_alloc_sock(struct socket *sock, int flags)
goto no_sock;
if (sock) {
-#ifdef CONFIG_DECNET_RAW
- if (sock->type == SOCK_RAW)
- sock->ops = &dn_raw_proto_ops;
- else
-#endif /* CONFIG_DECNET_RAW */
sock->ops = &dn_proto_ops;
}
sock_init_data(sock,sk);
@@ -647,13 +641,6 @@ static int dn_create(struct socket *sock, int protocol)
break;
case SOCK_STREAM:
break;
-#ifdef CONFIG_DECNET_RAW
- case SOCK_RAW:
- if ((protocol != DNPROTO_NSP) &&
- (protocol != DNPROTO_ROU))
- return -EPROTONOSUPPORT;
- break;
-#endif /* CONFIG_DECNET_RAW */
default:
return -ESOCKTNOSUPPORT;
}
@@ -1095,6 +1082,7 @@ static unsigned int dn_poll(struct file *file, struct socket *sock, poll_table
static int dn_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
{
struct sock *sk = sock->sk;
+ struct dn_scp *scp = &sk->protinfo.dn;
int err = -EOPNOTSUPP;
unsigned long amount = 0;
struct sk_buff *skb;
@@ -1221,8 +1209,17 @@ static int dn_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
case TIOCINQ:
lock_sock(sk);
- if ((skb = skb_peek(&sk->receive_queue)) != NULL)
+ if ((skb = skb_peek(&scp->other_receive_queue)) != NULL) {
amount = skb->len;
+ } else {
+ struct sk_buff *skb = sk->receive_queue.next;
+ for(;;) {
+ if (skb == (struct sk_buff *)&sk->receive_queue)
+ break;
+ amount += skb->len;
+ skb = skb->next;
+ }
+ }
release_sock(sk);
err = put_user(amount, (int *)arg);
break;
@@ -2028,11 +2025,7 @@ static int dn_get_info(char *buffer, char **start, off_t offset, int length)
return len;
}
-#ifdef CONFIG_DECNET_RAW
-
-extern int dn_raw_get_info(char *, char **, off_t, int);
-#endif /* CONFIG_DECNET_RAW */
static struct net_proto_family dn_family_ops = {
AF_DECnet,
dn_create
@@ -2066,16 +2059,14 @@ void dn_unregister_sysctl(void);
void __init decnet_proto_init(struct net_proto *pro)
{
- printk(KERN_INFO "NET4: DECnet for Linux: V.2.3.38s (C) 1995-1999 Linux DECnet Project Team\n");
+ printk(KERN_INFO "NET4: DECnet for Linux: V.2.3.49s (C) 1995-2000 Linux DECnet Project Team\n");
sock_register(&dn_family_ops);
dev_add_pack(&dn_dix_packet_type);
register_netdevice_notifier(&dn_dev_notifier);
proc_net_create("decnet", 0, dn_get_info);
-#ifdef CONFIG_DECNET_RAW
- proc_net_create("decnet_raw", 0, dn_raw_get_info);
-#endif
+
dn_neigh_init();
dn_dev_init();
dn_route_init();
@@ -2153,9 +2144,6 @@ void __exit cleanup_module(void)
#endif /* CONFIG_DECNET_ROUTER */
proc_net_remove("decnet");
-#ifdef CONFIG_DECNET_RAW
- proc_net_remove("decnet_raw");
-#endif
dev_remove_pack(&dn_dix_packet_type);
sock_unregister(AF_DECnet);
diff --git a/net/decnet/dn_nsp_in.c b/net/decnet/dn_nsp_in.c
index 66c72b4bd..854ed0e92 100644
--- a/net/decnet/dn_nsp_in.c
+++ b/net/decnet/dn_nsp_in.c
@@ -70,7 +70,6 @@
#include <net/dn_nsp.h>
#include <net/dn_dev.h>
#include <net/dn_route.h>
-#include <net/dn_raw.h>
/*
@@ -320,7 +319,7 @@ static void dn_nsp_disc_conf(struct sock *sk, struct sk_buff *skb)
struct dn_scp *scp = &sk->protinfo.dn;
unsigned short reason;
- if (skb->len < 2)
+ if (skb->len != 2)
goto out;
reason = dn_ntohs(*(__u16 *)skb->data);
@@ -552,10 +551,6 @@ static int dn_nsp_rx_packet(struct sk_buff *skb)
if (decnet_debug_level & 2)
printk(KERN_DEBUG "dn_nsp_rx: Message type 0x%02x\n", (int)cb->nsp_flags);
-#ifdef CONFIG_DECNET_RAW
- dn_raw_rx_nsp(skb);
-#endif /* CONFIG_DECNET_RAW */
-
if (skb->len < 2)
goto free_out;
diff --git a/net/decnet/dn_nsp_out.c b/net/decnet/dn_nsp_out.c
index e4d0adad3..ebbf4163f 100644
--- a/net/decnet/dn_nsp_out.c
+++ b/net/decnet/dn_nsp_out.c
@@ -511,7 +511,7 @@ static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg,
int ddl, unsigned char *dd, __u16 rem, __u16 loc)
{
struct sk_buff *skb = NULL;
- int size = 8 + ddl;
+ int size = 7 + ddl + ((msgflg == NSP_DISCINIT) ? 1 : 0);
unsigned char *msg;
if ((dst == NULL) || (rem == 0)) {
@@ -531,7 +531,8 @@ static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg,
msg += 2;
*(__u16 *)msg = dn_htons(reason);
msg += 2;
- *msg++ = ddl;
+ if (msgflg == NSP_DISCINIT)
+ *msg++ = ddl;
if (ddl) {
memcpy(msg, dd, ddl);
diff --git a/net/decnet/dn_raw.c b/net/decnet/dn_raw.c
deleted file mode 100644
index 90e9b2bad..000000000
--- a/net/decnet/dn_raw.c
+++ /dev/null
@@ -1,367 +0,0 @@
-/*
- * DECnet An implementation of the DECnet protocol suite for the LINUX
- * operating system. DECnet is implemented using the BSD Socket
- * interface as the means of communication with the user level.
- *
- * DECnet Raw Sockets Interface
- *
- * Author: Steve Whitehouse <SteveW@ACM.org>
- *
- *
- * Changes:
- * Steve Whitehouse - connect() function.
- * Steve Whitehouse - SMP changes, removed MOP stubs. MOP will
- * be userland only.
- */
-
-#include <linux/config.h>
-#include <linux/net.h>
-#include <linux/skbuff.h>
-#include <linux/netdevice.h>
-#include <linux/socket.h>
-#include <linux/sockios.h>
-#include <net/sock.h>
-#include <net/dst.h>
-#include <net/dn.h>
-#include <net/dn_raw.h>
-#include <net/dn_route.h>
-
-static rwlock_t dn_raw_hash_lock = RW_LOCK_UNLOCKED;
-static struct sock *dn_raw_nsp_sklist = NULL;
-static struct sock *dn_raw_routing_sklist = NULL;
-
-static void dn_raw_hash(struct sock *sk)
-{
- struct sock **skp;
-
- switch(sk->protocol) {
- case DNPROTO_NSP:
- skp = &dn_raw_nsp_sklist;
- break;
- case DNPROTO_ROU:
- skp = &dn_raw_routing_sklist;
- break;
- default:
- printk(KERN_DEBUG "dn_raw_hash: Unknown protocol\n");
- return;
- }
-
- write_lock_bh(&dn_raw_hash_lock);
- sk->next = *skp;
- sk->pprev = skp;
- *skp = sk;
- write_unlock_bh(&dn_raw_hash_lock);
-}
-
-static void dn_raw_unhash(struct sock *sk)
-{
- struct sock **skp = sk->pprev;
-
- if (skp == NULL)
- return;
-
- write_lock_bh(&dn_raw_hash_lock);
- while(*skp != sk)
- skp = &((*skp)->next);
- *skp = sk->next;
- write_unlock_bh(&dn_raw_hash_lock);
-
- sk->next = NULL;
- sk->pprev = NULL;
-}
-
-static void dn_raw_autobind(struct sock *sk)
-{
- dn_raw_hash(sk);
- sk->zapped = 0;
-}
-
-static int dn_raw_release(struct socket *sock)
-{
- struct sock *sk = sock->sk;
-
- if (sk == NULL)
- return 0;
-
- if (!sk->dead) sk->state_change(sk);
-
- sk->dead = 1;
- sk->socket = NULL;
- sock->sk = NULL;
-
- dn_raw_unhash(sk);
- sock_put(sk);
-
- return 0;
-}
-
-/*
- * Bind does odd things with raw sockets. Its basically used to filter
- * the incoming packets, but this differs with the different layers
- * at which you extract packets.
- *
- * For Routing layer sockets, the object name is a host ordered unsigned
- * short which is a mask for the 16 different types of possible routing
- * packet. I'd like to also select by destination address of the packets
- * but alas, this is rather too difficult to do at the moment.
- */
-static int dn_raw_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
-{
- struct sock *sk = sock->sk;
- struct sockaddr_dn *addr = (struct sockaddr_dn *)uaddr;
-
- if (addr_len != sizeof(struct sockaddr_dn))
- return -EINVAL;
-
- if (sk->zapped == 0)
- return -EINVAL;
-
- switch(sk->protocol) {
- case DNPROTO_ROU:
- if (dn_ntohs(addr->sdn_objnamel) && (dn_ntohs(addr->sdn_objnamel) != 2))
- return -EINVAL;
- /* Fall through here */
- case DNPROTO_NSP:
- if (dn_ntohs(addr->sdn_add.a_len) && (dn_ntohs(addr->sdn_add.a_len) != 2))
- return -EINVAL;
- break;
- default:
- return -EPROTONOSUPPORT;
- }
-
- if (dn_ntohs(addr->sdn_objnamel) > (DN_MAXOBJL-1))
- return -EINVAL;
-
- if (dn_ntohs(addr->sdn_add.a_len) > DN_MAXADDL)
- return -EINVAL;
-
- memcpy(&sk->protinfo.dn.addr, addr, sizeof(struct sockaddr_dn));
-
- dn_raw_autobind(sk);
-
- return 0;
-}
-
-/*
- * This is to allow send() and write() to work. You set the destination address
- * with this function.
- */
-static int dn_raw_connect(struct socket *sock, struct sockaddr *uaddr, int addr_len, int flags)
-{
- struct sock *sk = sock->sk;
- struct dn_scp *scp = &sk->protinfo.dn;
- struct sockaddr_dn *saddr = (struct sockaddr_dn *)uaddr;
- int err;
-
- lock_sock(sk);
-
- err = -EINVAL;
- if (addr_len != sizeof(struct sockaddr_dn))
- goto out;
-
- if (saddr->sdn_family != AF_DECnet)
- goto out;
-
- if (dn_ntohs(saddr->sdn_objnamel) > (DN_MAXOBJL-1))
- goto out;
-
- if (dn_ntohs(saddr->sdn_add.a_len) > DN_MAXADDL)
- goto out;
-
- if (sk->zapped)
- dn_raw_autobind(sk);
-
- if ((err = dn_route_output(&sk->dst_cache, dn_saddr2dn(saddr), dn_saddr2dn(&scp->addr), 0)) < 0)
- goto out;
-
- memcpy(&scp->peer, saddr, sizeof(struct sockaddr_dn));
-out:
- release_sock(sk);
-
- return err;
-}
-
-/*
- * TBD.
- */
-static int dn_raw_sendmsg(struct socket *sock, struct msghdr *hdr, int size,
- struct scm_cookie *scm)
-{
- struct sock *sk = sock->sk;
-
- if (sk->zapped)
- dn_raw_autobind(sk);
-
- if (sk->protocol != DNPROTO_NSP)
- return -EOPNOTSUPP;
-
- return 0;
-}
-
-/*
- * This works fine, execpt that it doesn't report the originating address
- * or anything at the moment.
- */
-static int dn_raw_recvmsg(struct socket *sock, struct msghdr *msg, int size,
- int flags, struct scm_cookie *scm)
-{
- struct sock *sk = sock->sk;
- struct sk_buff *skb;
- int err = 0;
- int copied = 0;
-
- lock_sock(sk);
-
- if (sk->zapped)
- dn_raw_autobind(sk);
-
- if ((skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, flags & MSG_DONTWAIT, &err)) == NULL)
- goto out;
-
- copied = skb->len;
-
- if (copied > size) {
- copied = size;
- msg->msg_flags |= MSG_TRUNC;
- }
-
- if ((err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied)) != 0) {
- if (flags & MSG_PEEK)
- atomic_dec(&skb->users);
- else
- skb_queue_head(&sk->receive_queue, skb);
-
- goto out;
- }
-
- skb_free_datagram(sk, skb);
-
-out:
- release_sock(sk);
-
- return copied ? copied : err;
-}
-
-struct proto_ops dn_raw_proto_ops = {
- AF_DECnet,
-
- dn_raw_release,
- dn_raw_bind,
- dn_raw_connect,
- sock_no_socketpair,
- sock_no_accept,
- sock_no_getname,
- datagram_poll,
- sock_no_ioctl,
- sock_no_listen,
- sock_no_shutdown,
- sock_no_setsockopt,
- sock_no_getsockopt,
- sock_no_fcntl,
- dn_raw_sendmsg,
- dn_raw_recvmsg,
- sock_no_mmap
-};
-
-#ifdef CONFIG_PROC_FS
-int dn_raw_get_info(char *buffer, char **start, off_t offset, int length)
-{
- int len = 0;
- off_t pos = 0;
- off_t begin = 0;
- struct sock *sk;
-
- read_lock_bh(&dn_raw_hash_lock);
- for(sk = dn_raw_nsp_sklist; sk; sk = sk->next) {
- len += sprintf(buffer+len, "NSP\n");
-
- pos = begin + len;
-
- if (pos < offset) {
- len = 0;
- begin = pos;
- }
-
- if (pos > offset + length)
- goto all_done;
-
- }
-
- for(sk = dn_raw_routing_sklist; sk; sk = sk->next) {
- len += sprintf(buffer+len, "ROU\n");
-
- pos = begin + len;
-
- if (pos < offset) {
- len = 0;
- begin = pos;
- }
-
- if (pos > offset + length)
- goto all_done;
- }
-
-all_done:
- read_unlock_bh(&dn_raw_hash_lock);
-
- *start = buffer + (offset - begin);
- len -= (offset - begin);
-
- if (len > length) len = length;
-
- return(len);
-}
-#endif /* CONFIG_PROC_FS */
-
-void dn_raw_rx_nsp(struct sk_buff *skb)
-{
- struct sock *sk;
- struct sk_buff *skb2;
-
- read_lock(&dn_raw_hash_lock);
- for(sk = dn_raw_nsp_sklist; sk != NULL; sk = sk->next) {
- if (skb->len > sock_rspace(sk))
- continue;
- if (sk->dead)
- continue;
- if ((skb2 = skb_clone(skb, GFP_ATOMIC)) != NULL) {
- skb_set_owner_r(skb2, sk);
- skb_queue_tail(&sk->receive_queue, skb2);
- sk->data_ready(sk, skb->len);
- }
- }
- read_unlock(&dn_raw_hash_lock);
-}
-
-void dn_raw_rx_routing(struct sk_buff *skb)
-{
- struct sock *sk;
- struct sk_buff *skb2;
- struct dn_skb_cb *cb = (struct dn_skb_cb *)skb->cb;
- unsigned short rt_flagmask;
- unsigned short objnamel;
- struct dn_scp *scp;
-
- read_lock(&dn_raw_hash_lock);
- for(sk = dn_raw_routing_sklist; sk != NULL; sk = sk->next) {
- if (skb->len > sock_rspace(sk))
- continue;
- if (sk->dead)
- continue;
- scp = &sk->protinfo.dn;
-
- rt_flagmask = dn_ntohs(*(unsigned short *)scp->addr.sdn_objname);
- objnamel = dn_ntohs(scp->addr.sdn_objnamel);
-
- if ((objnamel == 2) && (!((1 << (cb->rt_flags & 0x0f)) & rt_flagmask)))
- continue;
-
- if ((skb2 = skb_clone(skb, GFP_ATOMIC)) != NULL) {
- skb_set_owner_r(skb2, sk);
- skb_queue_tail(&sk->receive_queue, skb2);
- sk->data_ready(sk, skb->len);
- }
- }
- read_unlock(&dn_raw_hash_lock);
-}
-
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c
index 27ff3a10f..5e54a6fa8 100644
--- a/net/decnet/dn_route.c
+++ b/net/decnet/dn_route.c
@@ -77,7 +77,6 @@
#include <net/dn_route.h>
#include <net/dn_neigh.h>
#include <net/dn_fib.h>
-#include <net/dn_raw.h>
struct dn_rt_hash_bucket
{
@@ -427,10 +426,6 @@ int dn_route_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type
(int)flags, (dev) ? dev->name : "???", len, skb->len,
padlen);
-#ifdef CONFIG_DECNET_RAW
- dn_raw_rx_routing(skb);
-#endif /* CONFIG_DECNET_RAW */
-
if (flags & DN_RT_PKT_CNTL) {
switch(flags & DN_RT_CNTL_MSK) {
case DN_RT_PKT_INIT:
diff --git a/net/decnet/sysctl_net_decnet.c b/net/decnet/sysctl_net_decnet.c
index f80e5afc1..ff65e9ae6 100644
--- a/net/decnet/sysctl_net_decnet.c
+++ b/net/decnet/sysctl_net_decnet.c
@@ -29,9 +29,9 @@
int decnet_debug_level = 0;
int decnet_time_wait = 30;
-int decnet_dn_count = 3;
-int decnet_di_count = 5;
-int decnet_dr_count = 5;
+int decnet_dn_count = 1;
+int decnet_di_count = 3;
+int decnet_dr_count = 3;
#ifdef CONFIG_SYSCTL
extern int decnet_dst_gc_interval;