diff options
Diffstat (limited to 'net/decnet/af_decnet.c')
| -rw-r--r-- | net/decnet/af_decnet.c | 757 | 
1 files changed, 376 insertions, 381 deletions
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index 9ecef9968c3..ae011b46c07 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c @@ -119,7 +119,6 @@ Version 0.0.6    2.1.110   07-aug-98   Eduardo Marcelo Serrat  #include <net/sock.h>  #include <net/tcp_states.h>  #include <net/flow.h> -#include <asm/system.h>  #include <asm/ioctls.h>  #include <linux/capability.h>  #include <linux/mm.h> @@ -176,12 +175,11 @@ static struct hlist_head *dn_find_list(struct sock *sk)  static int check_port(__le16 port)  {  	struct sock *sk; -	struct hlist_node *node;  	if (port == 0)  		return -1; -	sk_for_each(sk, node, &dn_sk_hash[le16_to_cpu(port) & DN_SK_HASH_MASK]) { +	sk_for_each(sk, &dn_sk_hash[le16_to_cpu(port) & DN_SK_HASH_MASK]) {  		struct dn_scp *scp = DN_SK(sk);  		if (scp->addrloc == port)  			return -1; @@ -251,7 +249,7 @@ static void dn_unhash_sock_bh(struct sock *sk)  static struct hlist_head *listen_hash(struct sockaddr_dn *addr)  {  	int i; -	unsigned hash = addr->sdn_objnum; +	unsigned int hash = addr->sdn_objnum;  	if (hash == 0) {  		hash = addr->sdn_objnamel; @@ -291,23 +289,23 @@ int dn_sockaddr2username(struct sockaddr_dn *sdn, unsigned char *buf, unsigned c  	*buf++ = type; -	switch(type) { -		case 0: -			*buf++ = sdn->sdn_objnum; -			break; -		case 1: -			*buf++ = 0; -			*buf++ = le16_to_cpu(sdn->sdn_objnamel); -			memcpy(buf, sdn->sdn_objname, le16_to_cpu(sdn->sdn_objnamel)); -			len = 3 + le16_to_cpu(sdn->sdn_objnamel); -			break; -		case 2: -			memset(buf, 0, 5); -			buf += 5; -			*buf++ = le16_to_cpu(sdn->sdn_objnamel); -			memcpy(buf, sdn->sdn_objname, le16_to_cpu(sdn->sdn_objnamel)); -			len = 7 + le16_to_cpu(sdn->sdn_objnamel); -			break; +	switch (type) { +	case 0: +		*buf++ = sdn->sdn_objnum; +		break; +	case 1: +		*buf++ = 0; +		*buf++ = le16_to_cpu(sdn->sdn_objnamel); +		memcpy(buf, sdn->sdn_objname, le16_to_cpu(sdn->sdn_objnamel)); +		len = 3 + le16_to_cpu(sdn->sdn_objnamel); +		break; +	case 2: +		memset(buf, 0, 5); +		buf += 5; +		*buf++ = le16_to_cpu(sdn->sdn_objnamel); +		memcpy(buf, sdn->sdn_objname, le16_to_cpu(sdn->sdn_objnamel)); +		len = 7 + le16_to_cpu(sdn->sdn_objnamel); +		break;  	}  	return len; @@ -337,23 +335,23 @@ int dn_username2sockaddr(unsigned char *data, int len, struct sockaddr_dn *sdn,  	*fmt = *data++;  	type = *data++; -	switch(*fmt) { -		case 0: -			sdn->sdn_objnum = type; -			return 2; -		case 1: -			namel = 16; -			break; -		case 2: -			len  -= 4; -			data += 4; -			break; -		case 4: -			len  -= 8; -			data += 8; -			break; -		default: -			return -1; +	switch (*fmt) { +	case 0: +		sdn->sdn_objnum = type; +		return 2; +	case 1: +		namel = 16; +		break; +	case 2: +		len  -= 4; +		data += 4; +		break; +	case 4: +		len  -= 8; +		data += 8; +		break; +	default: +		return -1;  	}  	len -= 1; @@ -375,11 +373,10 @@ int dn_username2sockaddr(unsigned char *data, int len, struct sockaddr_dn *sdn,  struct sock *dn_sklist_find_listener(struct sockaddr_dn *addr)  {  	struct hlist_head *list = listen_hash(addr); -	struct hlist_node *node;  	struct sock *sk;  	read_lock(&dn_hash_lock); -	sk_for_each(sk, node, list) { +	sk_for_each(sk, list) {  		struct dn_scp *scp = DN_SK(sk);  		if (sk->sk_state != TCP_LISTEN)  			continue; @@ -415,11 +412,10 @@ struct sock *dn_find_by_skb(struct sk_buff *skb)  {  	struct dn_skb_cb *cb = DN_SKB_CB(skb);  	struct sock *sk; -	struct hlist_node *node;  	struct dn_scp *scp;  	read_lock(&dn_hash_lock); -	sk_for_each(sk, node, &dn_sk_hash[le16_to_cpu(cb->dst_port) & DN_SK_HASH_MASK]) { +	sk_for_each(sk, &dn_sk_hash[le16_to_cpu(cb->dst_port) & DN_SK_HASH_MASK]) {  		scp = DN_SK(sk);  		if (cb->src != dn_saddr2dn(&scp->peer))  			continue; @@ -485,7 +481,7 @@ static struct sock *dn_alloc_sock(struct net *net, struct socket *sock, gfp_t gf  	sk->sk_backlog_rcv = dn_nsp_backlog_rcv;  	sk->sk_destruct    = dn_destruct; -	sk->sk_no_check    = 1; +	sk->sk_no_check_tx = 1;  	sk->sk_family      = PF_DECnet;  	sk->sk_protocol    = 0;  	sk->sk_allocation  = gfp; @@ -575,25 +571,26 @@ int dn_destroy_timer(struct sock *sk)  	scp->persist = dn_nsp_persist(sk); -	switch(scp->state) { -		case DN_DI: -			dn_nsp_send_disc(sk, NSP_DISCINIT, 0, GFP_ATOMIC); -			if (scp->nsp_rxtshift >= decnet_di_count) -				scp->state = DN_CN; -			return 0; +	switch (scp->state) { +	case DN_DI: +		dn_nsp_send_disc(sk, NSP_DISCINIT, 0, GFP_ATOMIC); +		if (scp->nsp_rxtshift >= decnet_di_count) +			scp->state = DN_CN; +		return 0; -		case DN_DR: -			dn_nsp_send_disc(sk, NSP_DISCINIT, 0, GFP_ATOMIC); -			if (scp->nsp_rxtshift >= decnet_dr_count) -				scp->state = DN_DRC; -			return 0; +	case DN_DR: +		dn_nsp_send_disc(sk, NSP_DISCINIT, 0, GFP_ATOMIC); +		if (scp->nsp_rxtshift >= decnet_dr_count) +			scp->state = DN_DRC; +		return 0; -		case DN_DN: -			if (scp->nsp_rxtshift < decnet_dn_count) { -				/* printk(KERN_DEBUG "dn_destroy_timer: DN\n"); */ -				dn_nsp_send_disc(sk, NSP_DISCCONF, NSP_REASON_DC, GFP_ATOMIC); -				return 0; -			} +	case DN_DN: +		if (scp->nsp_rxtshift < decnet_dn_count) { +			/* printk(KERN_DEBUG "dn_destroy_timer: DN\n"); */ +			dn_nsp_send_disc(sk, NSP_DISCCONF, NSP_REASON_DC, +					 GFP_ATOMIC); +			return 0; +		}  	}  	scp->persist = (HZ * decnet_time_wait); @@ -623,42 +620,42 @@ static void dn_destroy_sock(struct sock *sk)  	sk->sk_state = TCP_CLOSE; -	switch(scp->state) { -		case DN_DN: -			dn_nsp_send_disc(sk, NSP_DISCCONF, NSP_REASON_DC, -					 sk->sk_allocation); -			scp->persist_fxn = dn_destroy_timer; -			scp->persist = dn_nsp_persist(sk); -			break; -		case DN_CR: -			scp->state = DN_DR; -			goto disc_reject; -		case DN_RUN: -			scp->state = DN_DI; -		case DN_DI: -		case DN_DR: +	switch (scp->state) { +	case DN_DN: +		dn_nsp_send_disc(sk, NSP_DISCCONF, NSP_REASON_DC, +				 sk->sk_allocation); +		scp->persist_fxn = dn_destroy_timer; +		scp->persist = dn_nsp_persist(sk); +		break; +	case DN_CR: +		scp->state = DN_DR; +		goto disc_reject; +	case DN_RUN: +		scp->state = DN_DI; +	case DN_DI: +	case DN_DR:  disc_reject: -			dn_nsp_send_disc(sk, NSP_DISCINIT, 0, sk->sk_allocation); -		case DN_NC: -		case DN_NR: -		case DN_RJ: -		case DN_DIC: -		case DN_CN: -		case DN_DRC: -		case DN_CI: -		case DN_CD: -			scp->persist_fxn = dn_destroy_timer; -			scp->persist = dn_nsp_persist(sk); -			break; -		default: -			printk(KERN_DEBUG "DECnet: dn_destroy_sock passed socket in invalid state\n"); -		case DN_O: -			dn_stop_slow_timer(sk); +		dn_nsp_send_disc(sk, NSP_DISCINIT, 0, sk->sk_allocation); +	case DN_NC: +	case DN_NR: +	case DN_RJ: +	case DN_DIC: +	case DN_CN: +	case DN_DRC: +	case DN_CI: +	case DN_CD: +		scp->persist_fxn = dn_destroy_timer; +		scp->persist = dn_nsp_persist(sk); +		break; +	default: +		printk(KERN_DEBUG "DECnet: dn_destroy_sock passed socket in invalid state\n"); +	case DN_O: +		dn_stop_slow_timer(sk); -			dn_unhash_sock_bh(sk); -			sock_put(sk); +		dn_unhash_sock_bh(sk); +		sock_put(sk); -			break; +		break;  	}  } @@ -683,15 +680,15 @@ static int dn_create(struct net *net, struct socket *sock, int protocol,  	if (!net_eq(net, &init_net))  		return -EAFNOSUPPORT; -	switch(sock->type) { -		case SOCK_SEQPACKET: -			if (protocol != DNPROTO_NSP) -				return -EPROTONOSUPPORT; -			break; -		case SOCK_STREAM: -			break; -		default: -			return -ESOCKTNOSUPPORT; +	switch (sock->type) { +	case SOCK_SEQPACKET: +		if (protocol != DNPROTO_NSP) +			return -EPROTONOSUPPORT; +		break; +	case SOCK_STREAM: +		break; +	default: +		return -ESOCKTNOSUPPORT;  	} @@ -829,7 +826,7 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation)  		return -EINVAL;  	scp->state = DN_CC; -	scp->segsize_loc = dst_metric(__sk_dst_get(sk), RTAX_ADVMSS); +	scp->segsize_loc = dst_metric_advmss(__sk_dst_get(sk));  	dn_send_conn_conf(sk, allocation);  	prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); @@ -908,7 +905,8 @@ static int __dn_connect(struct sock *sk, struct sockaddr_dn *addr, int addrlen,  	struct socket *sock = sk->sk_socket;  	struct dn_scp *scp = DN_SK(sk);  	int err = -EISCONN; -	struct flowi fl; +	struct flowidn fld; +	struct dst_entry *dst;  	if (sock->state == SS_CONNECTED)  		goto out; @@ -947,18 +945,19 @@ static int __dn_connect(struct sock *sk, struct sockaddr_dn *addr, int addrlen,  	memcpy(&scp->peer, addr, sizeof(struct sockaddr_dn));  	err = -EHOSTUNREACH; -	memset(&fl, 0, sizeof(fl)); -	fl.oif = sk->sk_bound_dev_if; -	fl.fld_dst = dn_saddr2dn(&scp->peer); -	fl.fld_src = dn_saddr2dn(&scp->addr); -	dn_sk_ports_copy(&fl, scp); -	fl.proto = DNPROTO_NSP; -	if (dn_route_output_sock(&sk->sk_dst_cache, &fl, sk, flags) < 0) +	memset(&fld, 0, sizeof(fld)); +	fld.flowidn_oif = sk->sk_bound_dev_if; +	fld.daddr = dn_saddr2dn(&scp->peer); +	fld.saddr = dn_saddr2dn(&scp->addr); +	dn_sk_ports_copy(&fld, scp); +	fld.flowidn_proto = DNPROTO_NSP; +	if (dn_route_output_sock(&sk->sk_dst_cache, &fld, sk, flags) < 0)  		goto out; -	sk->sk_route_caps = sk->sk_dst_cache->dev->features; +	dst = __sk_dst_get(sk); +	sk->sk_route_caps = dst->dev->features;  	sock->state = SS_CONNECTING;  	scp->state = DN_CI; -	scp->segsize_loc = dst_metric(sk->sk_dst_cache, RTAX_ADVMSS); +	scp->segsize_loc = dst_metric_advmss(dst);  	dn_nsp_send_conninit(sk, NSP_CI);  	err = -EINPROGRESS; @@ -987,16 +986,16 @@ static inline int dn_check_state(struct sock *sk, struct sockaddr_dn *addr, int  {  	struct dn_scp *scp = DN_SK(sk); -	switch(scp->state) { -		case DN_RUN: -			return 0; -		case DN_CR: -			return dn_confirm_accept(sk, timeo, sk->sk_allocation); -		case DN_CI: -		case DN_CC: -			return dn_wait_run(sk, timeo); -		case DN_O: -			return __dn_connect(sk, addr, addrlen, timeo, flags); +	switch (scp->state) { +	case DN_RUN: +		return 0; +	case DN_CR: +		return dn_confirm_accept(sk, timeo, sk->sk_allocation); +	case DN_CI: +	case DN_CC: +		return dn_wait_run(sk, timeo); +	case DN_O: +		return __dn_connect(sk, addr, addrlen, timeo, flags);  	}  	return -EINVAL; @@ -1313,10 +1312,10 @@ static int dn_shutdown(struct socket *sock, int how)  	if (scp->state == DN_O)  		goto out; -	if (how != SHUTDOWN_MASK) +	if (how != SHUT_RDWR)  		goto out; -	sk->sk_shutdown = how; +	sk->sk_shutdown = SHUTDOWN_MASK;  	dn_destroy_sock(sk);  	err = 0; @@ -1363,141 +1362,140 @@ static int __dn_setsockopt(struct socket *sock, int level,int optname, char __us  	if (copy_from_user(&u, optval, optlen))  		return -EFAULT; -	switch(optname) { -		case DSO_CONDATA: -			if (sock->state == SS_CONNECTED) -				return -EISCONN; -			if ((scp->state != DN_O) && (scp->state != DN_CR)) -				return -EINVAL; +	switch (optname) { +	case DSO_CONDATA: +		if (sock->state == SS_CONNECTED) +			return -EISCONN; +		if ((scp->state != DN_O) && (scp->state != DN_CR)) +			return -EINVAL; -			if (optlen != sizeof(struct optdata_dn)) -				return -EINVAL; +		if (optlen != sizeof(struct optdata_dn)) +			return -EINVAL; -			if (le16_to_cpu(u.opt.opt_optl) > 16) -				return -EINVAL; +		if (le16_to_cpu(u.opt.opt_optl) > 16) +			return -EINVAL; -			memcpy(&scp->conndata_out, &u.opt, optlen); -			break; - -		case DSO_DISDATA: -			if (sock->state != SS_CONNECTED && scp->accept_mode == ACC_IMMED) -				return -ENOTCONN; - -			if (optlen != sizeof(struct optdata_dn)) -				return -EINVAL; +		memcpy(&scp->conndata_out, &u.opt, optlen); +		break; -			if (le16_to_cpu(u.opt.opt_optl) > 16) -				return -EINVAL; +	case DSO_DISDATA: +		if (sock->state != SS_CONNECTED && +		    scp->accept_mode == ACC_IMMED) +			return -ENOTCONN; -			memcpy(&scp->discdata_out, &u.opt, optlen); -			break; +		if (optlen != sizeof(struct optdata_dn)) +			return -EINVAL; -		case DSO_CONACCESS: -			if (sock->state == SS_CONNECTED) -				return -EISCONN; -			if (scp->state != DN_O) -				return -EINVAL; +		if (le16_to_cpu(u.opt.opt_optl) > 16) +			return -EINVAL; -			if (optlen != sizeof(struct accessdata_dn)) -				return -EINVAL; +		memcpy(&scp->discdata_out, &u.opt, optlen); +		break; -			if ((u.acc.acc_accl > DN_MAXACCL) || -					(u.acc.acc_passl > DN_MAXACCL) || -					(u.acc.acc_userl > DN_MAXACCL)) -				return -EINVAL; +	case DSO_CONACCESS: +		if (sock->state == SS_CONNECTED) +			return -EISCONN; +		if (scp->state != DN_O) +			return -EINVAL; -			memcpy(&scp->accessdata, &u.acc, optlen); -			break; +		if (optlen != sizeof(struct accessdata_dn)) +			return -EINVAL; -		case DSO_ACCEPTMODE: -			if (sock->state == SS_CONNECTED) -				return -EISCONN; -			if (scp->state != DN_O) -				return -EINVAL; +		if ((u.acc.acc_accl > DN_MAXACCL) || +		    (u.acc.acc_passl > DN_MAXACCL) || +		    (u.acc.acc_userl > DN_MAXACCL)) +			return -EINVAL; -			if (optlen != sizeof(int)) -				return -EINVAL; +		memcpy(&scp->accessdata, &u.acc, optlen); +		break; -			if ((u.mode != ACC_IMMED) && (u.mode != ACC_DEFER)) -				return -EINVAL; +	case DSO_ACCEPTMODE: +		if (sock->state == SS_CONNECTED) +			return -EISCONN; +		if (scp->state != DN_O) +			return -EINVAL; -			scp->accept_mode = (unsigned char)u.mode; -			break; +		if (optlen != sizeof(int)) +			return -EINVAL; -		case DSO_CONACCEPT: +		if ((u.mode != ACC_IMMED) && (u.mode != ACC_DEFER)) +			return -EINVAL; -			if (scp->state != DN_CR) -				return -EINVAL; -			timeo = sock_rcvtimeo(sk, 0); -			err = dn_confirm_accept(sk, &timeo, sk->sk_allocation); -			return err; +		scp->accept_mode = (unsigned char)u.mode; +		break; -		case DSO_CONREJECT: +	case DSO_CONACCEPT: +		if (scp->state != DN_CR) +			return -EINVAL; +		timeo = sock_rcvtimeo(sk, 0); +		err = dn_confirm_accept(sk, &timeo, sk->sk_allocation); +		return err; -			if (scp->state != DN_CR) -				return -EINVAL; +	case DSO_CONREJECT: +		if (scp->state != DN_CR) +			return -EINVAL; -			scp->state = DN_DR; -			sk->sk_shutdown = SHUTDOWN_MASK; -			dn_nsp_send_disc(sk, 0x38, 0, sk->sk_allocation); -			break; +		scp->state = DN_DR; +		sk->sk_shutdown = SHUTDOWN_MASK; +		dn_nsp_send_disc(sk, 0x38, 0, sk->sk_allocation); +		break; -		default: +	default:  #ifdef CONFIG_NETFILTER  		return nf_setsockopt(sk, PF_DECnet, optname, optval, optlen);  #endif -		case DSO_LINKINFO: -		case DSO_STREAM: -		case DSO_SEQPACKET: -			return -ENOPROTOOPT; - -		case DSO_MAXWINDOW: -			if (optlen != sizeof(unsigned long)) -				return -EINVAL; -			if (u.win > NSP_MAX_WINDOW) -				u.win = NSP_MAX_WINDOW; -			if (u.win == 0) -				return -EINVAL; -			scp->max_window = u.win; -			if (scp->snd_window > u.win) -				scp->snd_window = u.win; -			break; +	case DSO_LINKINFO: +	case DSO_STREAM: +	case DSO_SEQPACKET: +		return -ENOPROTOOPT; + +	case DSO_MAXWINDOW: +		if (optlen != sizeof(unsigned long)) +			return -EINVAL; +		if (u.win > NSP_MAX_WINDOW) +			u.win = NSP_MAX_WINDOW; +		if (u.win == 0) +			return -EINVAL; +		scp->max_window = u.win; +		if (scp->snd_window > u.win) +			scp->snd_window = u.win; +		break; -		case DSO_NODELAY: -			if (optlen != sizeof(int)) -				return -EINVAL; -			if (scp->nonagle == 2) -				return -EINVAL; -			scp->nonagle = (u.val == 0) ? 0 : 1; -			/* if (scp->nonagle == 1) { Push pending frames } */ -			break; +	case DSO_NODELAY: +		if (optlen != sizeof(int)) +			return -EINVAL; +		if (scp->nonagle == 2) +			return -EINVAL; +		scp->nonagle = (u.val == 0) ? 0 : 1; +		/* if (scp->nonagle == 1) { Push pending frames } */ +		break; -		case DSO_CORK: -			if (optlen != sizeof(int)) -				return -EINVAL; -			if (scp->nonagle == 1) -				return -EINVAL; -			scp->nonagle = (u.val == 0) ? 0 : 2; -			/* if (scp->nonagle == 0) { Push pending frames } */ -			break; +	case DSO_CORK: +		if (optlen != sizeof(int)) +			return -EINVAL; +		if (scp->nonagle == 1) +			return -EINVAL; +		scp->nonagle = (u.val == 0) ? 0 : 2; +		/* if (scp->nonagle == 0) { Push pending frames } */ +		break; -		case DSO_SERVICES: -			if (optlen != sizeof(unsigned char)) -				return -EINVAL; -			if ((u.services & ~NSP_FC_MASK) != 0x01) -				return -EINVAL; -			if ((u.services & NSP_FC_MASK) == NSP_FC_MASK) -				return -EINVAL; -			scp->services_loc = u.services; -			break; +	case DSO_SERVICES: +		if (optlen != sizeof(unsigned char)) +			return -EINVAL; +		if ((u.services & ~NSP_FC_MASK) != 0x01) +			return -EINVAL; +		if ((u.services & NSP_FC_MASK) == NSP_FC_MASK) +			return -EINVAL; +		scp->services_loc = u.services; +		break; -		case DSO_INFO: -			if (optlen != sizeof(unsigned char)) -				return -EINVAL; -			if (u.info & 0xfc) -				return -EINVAL; -			scp->info_loc = u.info; -			break; +	case DSO_INFO: +		if (optlen != sizeof(unsigned char)) +			return -EINVAL; +		if (u.info & 0xfc) +			return -EINVAL; +		scp->info_loc = u.info; +		break;  	}  	return 0; @@ -1527,105 +1525,106 @@ static int __dn_getsockopt(struct socket *sock, int level,int optname, char __us  	if(get_user(r_len , optlen))  		return -EFAULT; -	switch(optname) { -		case DSO_CONDATA: -			if (r_len > sizeof(struct optdata_dn)) -				r_len = sizeof(struct optdata_dn); -			r_data = &scp->conndata_in; -			break; +	switch (optname) { +	case DSO_CONDATA: +		if (r_len > sizeof(struct optdata_dn)) +			r_len = sizeof(struct optdata_dn); +		r_data = &scp->conndata_in; +		break; -		case DSO_DISDATA: -			if (r_len > sizeof(struct optdata_dn)) -				r_len = sizeof(struct optdata_dn); -			r_data = &scp->discdata_in; -			break; +	case DSO_DISDATA: +		if (r_len > sizeof(struct optdata_dn)) +			r_len = sizeof(struct optdata_dn); +		r_data = &scp->discdata_in; +		break; -		case DSO_CONACCESS: -			if (r_len > sizeof(struct accessdata_dn)) -				r_len = sizeof(struct accessdata_dn); -			r_data = &scp->accessdata; -			break; +	case DSO_CONACCESS: +		if (r_len > sizeof(struct accessdata_dn)) +			r_len = sizeof(struct accessdata_dn); +		r_data = &scp->accessdata; +		break; -		case DSO_ACCEPTMODE: -			if (r_len > sizeof(unsigned char)) -				r_len = sizeof(unsigned char); -			r_data = &scp->accept_mode; -			break; +	case DSO_ACCEPTMODE: +		if (r_len > sizeof(unsigned char)) +			r_len = sizeof(unsigned char); +		r_data = &scp->accept_mode; +		break; -		case DSO_LINKINFO: -			if (r_len > sizeof(struct linkinfo_dn)) -				r_len = sizeof(struct linkinfo_dn); +	case DSO_LINKINFO: +		if (r_len > sizeof(struct linkinfo_dn)) +			r_len = sizeof(struct linkinfo_dn); -			switch(sock->state) { -				case SS_CONNECTING: -					link.idn_linkstate = LL_CONNECTING; -					break; -				case SS_DISCONNECTING: -					link.idn_linkstate = LL_DISCONNECTING; -					break; -				case SS_CONNECTED: -					link.idn_linkstate = LL_RUNNING; -					break; -				default: -					link.idn_linkstate = LL_INACTIVE; -			} +		memset(&link, 0, sizeof(link)); -			link.idn_segsize = scp->segsize_rem; -			r_data = &link; +		switch (sock->state) { +		case SS_CONNECTING: +			link.idn_linkstate = LL_CONNECTING; +			break; +		case SS_DISCONNECTING: +			link.idn_linkstate = LL_DISCONNECTING; +			break; +		case SS_CONNECTED: +			link.idn_linkstate = LL_RUNNING;  			break; -  		default: +			link.idn_linkstate = LL_INACTIVE; +		} + +		link.idn_segsize = scp->segsize_rem; +		r_data = &link; +		break; + +	default:  #ifdef CONFIG_NETFILTER -		{ -			int ret, len; +	{ +		int ret, len; -			if(get_user(len, optlen)) -				return -EFAULT; +		if (get_user(len, optlen)) +			return -EFAULT; -			ret = nf_getsockopt(sk, PF_DECnet, optname, -							optval, &len); -			if (ret >= 0) -				ret = put_user(len, optlen); -			return ret; -		} +		ret = nf_getsockopt(sk, PF_DECnet, optname, optval, &len); +		if (ret >= 0) +			ret = put_user(len, optlen); +		return ret; +	}  #endif -		case DSO_STREAM: -		case DSO_SEQPACKET: -		case DSO_CONACCEPT: -		case DSO_CONREJECT: -			return -ENOPROTOOPT; - -		case DSO_MAXWINDOW: -			if (r_len > sizeof(unsigned long)) -				r_len = sizeof(unsigned long); -			r_data = &scp->max_window; -			break; +	case DSO_STREAM: +	case DSO_SEQPACKET: +	case DSO_CONACCEPT: +	case DSO_CONREJECT: +		return -ENOPROTOOPT; + +	case DSO_MAXWINDOW: +		if (r_len > sizeof(unsigned long)) +			r_len = sizeof(unsigned long); +		r_data = &scp->max_window; +		break; -		case DSO_NODELAY: -			if (r_len > sizeof(int)) -				r_len = sizeof(int); -			val = (scp->nonagle == 1); -			r_data = &val; -			break; +	case DSO_NODELAY: +		if (r_len > sizeof(int)) +			r_len = sizeof(int); +		val = (scp->nonagle == 1); +		r_data = &val; +		break; -		case DSO_CORK: -			if (r_len > sizeof(int)) -				r_len = sizeof(int); -			val = (scp->nonagle == 2); -			r_data = &val; -			break; +	case DSO_CORK: +		if (r_len > sizeof(int)) +			r_len = sizeof(int); +		val = (scp->nonagle == 2); +		r_data = &val; +		break; -		case DSO_SERVICES: -			if (r_len > sizeof(unsigned char)) -				r_len = sizeof(unsigned char); -			r_data = &scp->services_rem; -			break; +	case DSO_SERVICES: +		if (r_len > sizeof(unsigned char)) +			r_len = sizeof(unsigned char); +		r_data = &scp->services_rem; +		break; -		case DSO_INFO: -			if (r_len > sizeof(unsigned char)) -				r_len = sizeof(unsigned char); -			r_data = &scp->info_rem; -			break; +	case DSO_INFO: +		if (r_len > sizeof(unsigned char)) +			r_len = sizeof(unsigned char); +		r_data = &scp->info_rem; +		break;  	}  	if (r_data) { @@ -1809,6 +1808,7 @@ out:  		rv = (flags & MSG_PEEK) ? -sk->sk_err : sock_error(sk);  	if ((rv >= 0) && msg->msg_name) { +		__sockaddr_check_size(sizeof(struct sockaddr_dn));  		memcpy(msg->msg_name, &scp->peer, sizeof(struct sockaddr_dn));  		msg->msg_namelen = sizeof(struct sockaddr_dn);  	} @@ -1844,9 +1844,9 @@ static inline int dn_queue_too_long(struct dn_scp *scp, struct sk_buff_head *que   * inclusion (or not) of the two 16 bit acknowledgement fields so it doesn't   * make much practical difference.   */ -unsigned dn_mss_from_pmtu(struct net_device *dev, int mtu) +unsigned int dn_mss_from_pmtu(struct net_device *dev, int mtu)  { -	unsigned mss = 230 - DN_MAX_NSP_DATA_HEADER; +	unsigned int mss = 230 - DN_MAX_NSP_DATA_HEADER;  	if (dev) {  		struct dn_dev *dn_db = rcu_dereference_raw(dev->dn_ptr);  		mtu -= LL_RESERVED_SPACE(dev); @@ -1915,7 +1915,7 @@ static int dn_sendmsg(struct kiocb *iocb, struct socket *sock,  	int err = 0;  	size_t sent = 0;  	int addr_len = msg->msg_namelen; -	struct sockaddr_dn *addr = (struct sockaddr_dn *)msg->msg_name; +	DECLARE_SOCKADDR(struct sockaddr_dn *, addr, msg->msg_name);  	struct sk_buff *skb = NULL;  	struct dn_skb_cb *cb;  	size_t len; @@ -2079,22 +2079,22 @@ out_err:  }  static int dn_device_event(struct notifier_block *this, unsigned long event, -			void *ptr) +			   void *ptr)  { -	struct net_device *dev = (struct net_device *)ptr; +	struct net_device *dev = netdev_notifier_info_to_dev(ptr);  	if (!net_eq(dev_net(dev), &init_net))  		return NOTIFY_DONE; -	switch(event) { -		case NETDEV_UP: -			dn_dev_up(dev); -			break; -		case NETDEV_DOWN: -			dn_dev_down(dev); -			break; -		default: -			break; +	switch (event) { +	case NETDEV_UP: +		dn_dev_up(dev); +		break; +	case NETDEV_DOWN: +		dn_dev_down(dev); +		break; +	default: +		break;  	}  	return NOTIFY_DONE; @@ -2104,8 +2104,6 @@ static struct notifier_block dn_dev_notifier = {  	.notifier_call = dn_device_event,  }; -extern int dn_route_rcv(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); -  static struct packet_type dn_dix_packet_type __read_mostly = {  	.type =		cpu_to_be16(ETH_P_DNA_RT),  	.func =		dn_route_rcv, @@ -2207,54 +2205,54 @@ static void dn_printable_object(struct sockaddr_dn *dn, unsigned char *buf)  	int i;  	switch (le16_to_cpu(dn->sdn_objnamel)) { -		case 0: -			sprintf(buf, "%d", dn->sdn_objnum); -			break; -		default: -			for (i = 0; i < le16_to_cpu(dn->sdn_objnamel); i++) { -				buf[i] = dn->sdn_objname[i]; -				if (IS_NOT_PRINTABLE(buf[i])) -					buf[i] = '.'; -			} -			buf[i] = 0; +	case 0: +		sprintf(buf, "%d", dn->sdn_objnum); +		break; +	default: +		for (i = 0; i < le16_to_cpu(dn->sdn_objnamel); i++) { +			buf[i] = dn->sdn_objname[i]; +			if (IS_NOT_PRINTABLE(buf[i])) +				buf[i] = '.'; +		} +		buf[i] = 0;  	}  }  static char *dn_state2asc(unsigned char state)  { -	switch(state) { -		case DN_O: -			return "OPEN"; -		case DN_CR: -			return "  CR"; -		case DN_DR: -			return "  DR"; -		case DN_DRC: -			return " DRC"; -		case DN_CC: -			return "  CC"; -		case DN_CI: -			return "  CI"; -		case DN_NR: -			return "  NR"; -		case DN_NC: -			return "  NC"; -		case DN_CD: -			return "  CD"; -		case DN_RJ: -			return "  RJ"; -		case DN_RUN: -			return " RUN"; -		case DN_DI: -			return "  DI"; -		case DN_DIC: -			return " DIC"; -		case DN_DN: -			return "  DN"; -		case DN_CL: -			return "  CL"; -		case DN_CN: -			return "  CN"; +	switch (state) { +	case DN_O: +		return "OPEN"; +	case DN_CR: +		return "  CR"; +	case DN_DR: +		return "  DR"; +	case DN_DRC: +		return " DRC"; +	case DN_CC: +		return "  CC"; +	case DN_CI: +		return "  CI"; +	case DN_NR: +		return "  NR"; +	case DN_NC: +		return "  NC"; +	case DN_CD: +		return "  CD"; +	case DN_RJ: +		return "  RJ"; +	case DN_RUN: +		return " RUN"; +	case DN_DI: +		return "  DI"; +	case DN_DIC: +		return " DIC"; +	case DN_DN: +		return "  DN"; +	case DN_CL: +		return "  CL"; +	case DN_CN: +		return "  CN";  	}  	return "????"; @@ -2353,9 +2351,6 @@ static const struct proto_ops dn_proto_ops = {  	.sendpage =	sock_no_sendpage,  }; -void dn_register_sysctl(void); -void dn_unregister_sysctl(void); -  MODULE_DESCRIPTION("The Linux DECnet Network Protocol");  MODULE_AUTHOR("Linux DECnet Project Team");  MODULE_LICENSE("GPL"); @@ -2382,7 +2377,7 @@ static int __init decnet_init(void)  	dev_add_pack(&dn_dix_packet_type);  	register_netdevice_notifier(&dn_dev_notifier); -	proc_net_fops_create(&init_net, "decnet", S_IRUGO, &dn_socket_seq_fops); +	proc_create("decnet", S_IRUGO, init_net.proc_net, &dn_socket_seq_fops);  	dn_register_sysctl();  out:  	return rc; @@ -2411,7 +2406,7 @@ static void __exit decnet_exit(void)  	dn_neigh_cleanup();  	dn_fib_cleanup(); -	proc_net_remove(&init_net, "decnet"); +	remove_proc_entry("decnet", init_net.proc_net);  	proto_unregister(&dn_proto);  | 
