From 1471f525455788c20b130690e0f104df451aeb43 Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Mon, 13 Mar 2000 20:55:15 +0000 Subject: Merge with Linux 2.3.51. --- net/decnet/Config.in | 3 +- net/decnet/Makefile | 4 - net/decnet/TODO | 6 - net/decnet/af_decnet.c | 38 ++--- net/decnet/dn_nsp_in.c | 7 +- net/decnet/dn_nsp_out.c | 5 +- net/decnet/dn_raw.c | 367 ----------------------------------------- net/decnet/dn_route.c | 5 - net/decnet/sysctl_net_decnet.c | 6 +- 9 files changed, 21 insertions(+), 420 deletions(-) delete mode 100644 net/decnet/dn_raw.c (limited to 'net/decnet') 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 #include #include -#include #include #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 #include #include -#include /* @@ -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 - * - * - * Changes: - * Steve Whitehouse - connect() function. - * Steve Whitehouse - SMP changes, removed MOP stubs. MOP will - * be userland only. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -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 #include #include -#include 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; -- cgit v1.2.3