[DECNET]: Endianess fixes (try #2)

Here are some fixes to endianess problems spotted by Al Viro.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by Steven Whitehouse and committed by David S. Miller 375d9d71 af2c6a4a

+19 -18
+12 -11
net/decnet/af_decnet.c
··· 166 166 if (scp->addr.sdn_flags & SDF_WILD) 167 167 return hlist_empty(&dn_wild_sk) ? &dn_wild_sk : NULL; 168 168 169 - return &dn_sk_hash[scp->addrloc & DN_SK_HASH_MASK]; 169 + return &dn_sk_hash[dn_ntohs(scp->addrloc) & DN_SK_HASH_MASK]; 170 170 } 171 171 172 172 /* ··· 180 180 if (port == 0) 181 181 return -1; 182 182 183 - sk_for_each(sk, node, &dn_sk_hash[port & DN_SK_HASH_MASK]) { 183 + sk_for_each(sk, node, &dn_sk_hash[dn_ntohs(port) & DN_SK_HASH_MASK]) { 184 184 struct dn_scp *scp = DN_SK(sk); 185 185 if (scp->addrloc == port) 186 186 return -1; ··· 194 194 static unsigned short port = 0x2000; 195 195 unsigned short i_port = port; 196 196 197 - while(check_port(++port) != 0) { 197 + while(check_port(dn_htons(++port)) != 0) { 198 198 if (port == i_port) 199 199 return 0; 200 200 } 201 201 202 - scp->addrloc = port; 202 + scp->addrloc = dn_htons(port); 203 203 204 204 return 1; 205 205 } ··· 418 418 struct dn_scp *scp; 419 419 420 420 read_lock(&dn_hash_lock); 421 - sk_for_each(sk, node, &dn_sk_hash[cb->dst_port & DN_SK_HASH_MASK]) { 421 + sk_for_each(sk, node, &dn_sk_hash[dn_ntohs(cb->dst_port) & DN_SK_HASH_MASK]) { 422 422 scp = DN_SK(sk); 423 423 if (cb->src != dn_saddr2dn(&scp->peer)) 424 424 continue; ··· 1016 1016 1017 1017 static void dn_user_copy(struct sk_buff *skb, struct optdata_dn *opt) 1018 1018 { 1019 - unsigned char *ptr = skb->data; 1020 - 1021 - opt->opt_optl = *ptr++; 1022 - opt->opt_status = 0; 1023 - memcpy(opt->opt_data, ptr, opt->opt_optl); 1024 - skb_pull(skb, dn_ntohs(opt->opt_optl) + 1); 1019 + unsigned char *ptr = skb->data; 1020 + u16 len = *ptr++; /* yes, it's 8bit on the wire */ 1025 1021 1022 + BUG_ON(len > 16); /* we've checked the contents earlier */ 1023 + opt->opt_optl = dn_htons(len); 1024 + opt->opt_status = 0; 1025 + memcpy(opt->opt_data, ptr, len); 1026 + skb_pull(skb, len + 1); 1026 1027 } 1027 1028 1028 1029 static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo)
+4 -4
net/decnet/dn_nsp_in.c
··· 360 360 scp->max_window = decnet_no_fc_max_cwnd; 361 361 362 362 if (skb->len > 0) { 363 - unsigned char dlen = *skb->data; 363 + u16 dlen = *skb->data; 364 364 if ((dlen <= 16) && (dlen <= skb->len)) { 365 - scp->conndata_in.opt_optl = dn_htons((__u16)dlen); 365 + scp->conndata_in.opt_optl = dn_htons(dlen); 366 366 memcpy(scp->conndata_in.opt_data, skb->data + 1, dlen); 367 367 } 368 368 } ··· 404 404 memset(scp->discdata_in.opt_data, 0, 16); 405 405 406 406 if (skb->len > 0) { 407 - unsigned char dlen = *skb->data; 407 + u16 dlen = *skb->data; 408 408 if ((dlen <= 16) && (dlen <= skb->len)) { 409 - scp->discdata_in.opt_optl = dn_htons((__u16)dlen); 409 + scp->discdata_in.opt_optl = dn_htons(dlen); 410 410 memcpy(scp->discdata_in.opt_data, skb->data + 1, dlen); 411 411 } 412 412 }
+1 -1
net/decnet/dn_nsp_out.c
··· 526 526 struct nsp_conn_init_msg *msg; 527 527 __u8 len = (__u8)dn_ntohs(scp->conndata_out.opt_optl); 528 528 529 - if ((skb = dn_alloc_skb(sk, 50 + dn_ntohs(scp->conndata_out.opt_optl), gfp)) == NULL) 529 + if ((skb = dn_alloc_skb(sk, 50 + len, gfp)) == NULL) 530 530 return; 531 531 532 532 msg = (struct nsp_conn_init_msg *)skb_put(skb, sizeof(*msg));
+2 -2
net/decnet/dn_rules.c
··· 124 124 static int dn_fib_rule_match(struct fib_rule *rule, struct flowi *fl, int flags) 125 125 { 126 126 struct dn_fib_rule *r = (struct dn_fib_rule *)rule; 127 - u16 daddr = fl->fld_dst; 128 - u16 saddr = fl->fld_src; 127 + __le16 daddr = fl->fld_dst; 128 + __le16 saddr = fl->fld_src; 129 129 130 130 if (((saddr ^ r->src) & r->srcmask) || 131 131 ((daddr ^ r->dst) & r->dstmask))