diff options
Diffstat (limited to 'net/decnet')
| -rw-r--r-- | net/decnet/af_decnet.c | 18 | ||||
| -rw-r--r-- | net/decnet/dn_dev.c | 34 | ||||
| -rw-r--r-- | net/decnet/dn_fib.c | 8 | ||||
| -rw-r--r-- | net/decnet/dn_neigh.c | 24 | ||||
| -rw-r--r-- | net/decnet/dn_nsp_in.c | 28 | ||||
| -rw-r--r-- | net/decnet/dn_nsp_out.c | 38 | ||||
| -rw-r--r-- | net/decnet/dn_route.c | 60 | ||||
| -rw-r--r-- | net/decnet/dn_rules.c | 115 | ||||
| -rw-r--r-- | net/decnet/dn_table.c | 12 | ||||
| -rw-r--r-- | net/decnet/sysctl_net_decnet.c | 12 |
10 files changed, 180 insertions, 169 deletions
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index ce4aaf94860d..2b289ef20ab3 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c | |||
| @@ -172,7 +172,7 @@ static struct hlist_head *dn_find_list(struct sock *sk) | |||
| 172 | /* | 172 | /* |
| 173 | * Valid ports are those greater than zero and not already in use. | 173 | * Valid ports are those greater than zero and not already in use. |
| 174 | */ | 174 | */ |
| 175 | static int check_port(unsigned short port) | 175 | static int check_port(__le16 port) |
| 176 | { | 176 | { |
| 177 | struct sock *sk; | 177 | struct sock *sk; |
| 178 | struct hlist_node *node; | 178 | struct hlist_node *node; |
| @@ -661,7 +661,7 @@ disc_reject: | |||
| 661 | } | 661 | } |
| 662 | } | 662 | } |
| 663 | 663 | ||
| 664 | char *dn_addr2asc(dn_address addr, char *buf) | 664 | char *dn_addr2asc(__u16 addr, char *buf) |
| 665 | { | 665 | { |
| 666 | unsigned short node, area; | 666 | unsigned short node, area; |
| 667 | 667 | ||
| @@ -801,7 +801,7 @@ static int dn_auto_bind(struct socket *sock) | |||
| 801 | /* End of compatibility stuff */ | 801 | /* End of compatibility stuff */ |
| 802 | 802 | ||
| 803 | scp->addr.sdn_add.a_len = dn_htons(2); | 803 | scp->addr.sdn_add.a_len = dn_htons(2); |
| 804 | rv = dn_dev_bind_default((dn_address *)scp->addr.sdn_add.a_addr); | 804 | rv = dn_dev_bind_default((__le16 *)scp->addr.sdn_add.a_addr); |
| 805 | if (rv == 0) { | 805 | if (rv == 0) { |
| 806 | rv = dn_hash_sock(sk); | 806 | rv = dn_hash_sock(sk); |
| 807 | if (rv) | 807 | if (rv) |
| @@ -1021,7 +1021,7 @@ static void dn_user_copy(struct sk_buff *skb, struct optdata_dn *opt) | |||
| 1021 | opt->opt_optl = *ptr++; | 1021 | opt->opt_optl = *ptr++; |
| 1022 | opt->opt_status = 0; | 1022 | opt->opt_status = 0; |
| 1023 | memcpy(opt->opt_data, ptr, opt->opt_optl); | 1023 | memcpy(opt->opt_data, ptr, opt->opt_optl); |
| 1024 | skb_pull(skb, opt->opt_optl + 1); | 1024 | skb_pull(skb, dn_ntohs(opt->opt_optl) + 1); |
| 1025 | 1025 | ||
| 1026 | } | 1026 | } |
| 1027 | 1027 | ||
| @@ -1121,8 +1121,8 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags) | |||
| 1121 | 1121 | ||
| 1122 | skb_pull(skb, dn_username2sockaddr(skb->data, skb->len, &(DN_SK(newsk)->addr), &type)); | 1122 | skb_pull(skb, dn_username2sockaddr(skb->data, skb->len, &(DN_SK(newsk)->addr), &type)); |
| 1123 | skb_pull(skb, dn_username2sockaddr(skb->data, skb->len, &(DN_SK(newsk)->peer), &type)); | 1123 | skb_pull(skb, dn_username2sockaddr(skb->data, skb->len, &(DN_SK(newsk)->peer), &type)); |
| 1124 | *(dn_address *)(DN_SK(newsk)->peer.sdn_add.a_addr) = cb->src; | 1124 | *(__le16 *)(DN_SK(newsk)->peer.sdn_add.a_addr) = cb->src; |
| 1125 | *(dn_address *)(DN_SK(newsk)->addr.sdn_add.a_addr) = cb->dst; | 1125 | *(__le16 *)(DN_SK(newsk)->addr.sdn_add.a_addr) = cb->dst; |
| 1126 | 1126 | ||
| 1127 | menuver = *skb->data; | 1127 | menuver = *skb->data; |
| 1128 | skb_pull(skb, 1); | 1128 | skb_pull(skb, 1); |
| @@ -1365,7 +1365,7 @@ static int __dn_setsockopt(struct socket *sock, int level,int optname, char __us | |||
| 1365 | if (optlen != sizeof(struct optdata_dn)) | 1365 | if (optlen != sizeof(struct optdata_dn)) |
| 1366 | return -EINVAL; | 1366 | return -EINVAL; |
| 1367 | 1367 | ||
| 1368 | if (u.opt.opt_optl > 16) | 1368 | if (dn_ntohs(u.opt.opt_optl) > 16) |
| 1369 | return -EINVAL; | 1369 | return -EINVAL; |
| 1370 | 1370 | ||
| 1371 | memcpy(&scp->conndata_out, &u.opt, optlen); | 1371 | memcpy(&scp->conndata_out, &u.opt, optlen); |
| @@ -1378,7 +1378,7 @@ static int __dn_setsockopt(struct socket *sock, int level,int optname, char __us | |||
| 1378 | if (optlen != sizeof(struct optdata_dn)) | 1378 | if (optlen != sizeof(struct optdata_dn)) |
| 1379 | return -EINVAL; | 1379 | return -EINVAL; |
| 1380 | 1380 | ||
| 1381 | if (u.opt.opt_optl > 16) | 1381 | if (dn_ntohs(u.opt.opt_optl) > 16) |
| 1382 | return -EINVAL; | 1382 | return -EINVAL; |
| 1383 | 1383 | ||
| 1384 | memcpy(&scp->discdata_out, &u.opt, optlen); | 1384 | memcpy(&scp->discdata_out, &u.opt, optlen); |
| @@ -1693,7 +1693,7 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1693 | if (rv) | 1693 | if (rv) |
| 1694 | goto out; | 1694 | goto out; |
| 1695 | 1695 | ||
| 1696 | if (flags & ~(MSG_PEEK|MSG_OOB|MSG_WAITALL|MSG_DONTWAIT|MSG_NOSIGNAL)) { | 1696 | if (flags & ~(MSG_CMSG_COMPAT|MSG_PEEK|MSG_OOB|MSG_WAITALL|MSG_DONTWAIT|MSG_NOSIGNAL)) { |
| 1697 | rv = -EOPNOTSUPP; | 1697 | rv = -EOPNOTSUPP; |
| 1698 | goto out; | 1698 | goto out; |
| 1699 | } | 1699 | } |
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c index efbead83ba7f..cc7b9d9255ef 100644 --- a/net/decnet/dn_dev.c +++ b/net/decnet/dn_dev.c | |||
| @@ -64,7 +64,7 @@ extern struct neigh_table dn_neigh_table; | |||
| 64 | /* | 64 | /* |
| 65 | * decnet_address is kept in network order. | 65 | * decnet_address is kept in network order. |
| 66 | */ | 66 | */ |
| 67 | dn_address decnet_address = 0; | 67 | __le16 decnet_address = 0; |
| 68 | 68 | ||
| 69 | static DEFINE_RWLOCK(dndev_lock); | 69 | static DEFINE_RWLOCK(dndev_lock); |
| 70 | static struct net_device *decnet_default_device; | 70 | static struct net_device *decnet_default_device; |
| @@ -439,7 +439,7 @@ static void dn_dev_del_ifa(struct dn_dev *dn_db, struct dn_ifaddr **ifap, int de | |||
| 439 | *ifap = ifa1->ifa_next; | 439 | *ifap = ifa1->ifa_next; |
| 440 | 440 | ||
| 441 | if (dn_db->dev->type == ARPHRD_ETHER) { | 441 | if (dn_db->dev->type == ARPHRD_ETHER) { |
| 442 | if (ifa1->ifa_local != dn_htons(dn_eth2dn(dev->dev_addr))) { | 442 | if (ifa1->ifa_local != dn_eth2dn(dev->dev_addr)) { |
| 443 | dn_dn2eth(mac_addr, ifa1->ifa_local); | 443 | dn_dn2eth(mac_addr, ifa1->ifa_local); |
| 444 | dev_mc_delete(dev, mac_addr, ETH_ALEN, 0); | 444 | dev_mc_delete(dev, mac_addr, ETH_ALEN, 0); |
| 445 | } | 445 | } |
| @@ -470,7 +470,7 @@ static int dn_dev_insert_ifa(struct dn_dev *dn_db, struct dn_ifaddr *ifa) | |||
| 470 | } | 470 | } |
| 471 | 471 | ||
| 472 | if (dev->type == ARPHRD_ETHER) { | 472 | if (dev->type == ARPHRD_ETHER) { |
| 473 | if (ifa->ifa_local != dn_htons(dn_eth2dn(dev->dev_addr))) { | 473 | if (ifa->ifa_local != dn_eth2dn(dev->dev_addr)) { |
| 474 | dn_dn2eth(mac_addr, ifa->ifa_local); | 474 | dn_dn2eth(mac_addr, ifa->ifa_local); |
| 475 | dev_mc_add(dev, mac_addr, ETH_ALEN, 0); | 475 | dev_mc_add(dev, mac_addr, ETH_ALEN, 0); |
| 476 | dev_mc_upload(dev); | 476 | dev_mc_upload(dev); |
| @@ -561,7 +561,7 @@ int dn_dev_ioctl(unsigned int cmd, void __user *arg) | |||
| 561 | 561 | ||
| 562 | switch(cmd) { | 562 | switch(cmd) { |
| 563 | case SIOCGIFADDR: | 563 | case SIOCGIFADDR: |
| 564 | *((dn_address *)sdn->sdn_nodeaddr) = ifa->ifa_local; | 564 | *((__le16 *)sdn->sdn_nodeaddr) = ifa->ifa_local; |
| 565 | goto rarok; | 565 | goto rarok; |
| 566 | 566 | ||
| 567 | case SIOCSIFADDR: | 567 | case SIOCSIFADDR: |
| @@ -804,7 +804,7 @@ done: | |||
| 804 | return skb->len; | 804 | return skb->len; |
| 805 | } | 805 | } |
| 806 | 806 | ||
| 807 | static int dn_dev_get_first(struct net_device *dev, dn_address *addr) | 807 | static int dn_dev_get_first(struct net_device *dev, __le16 *addr) |
| 808 | { | 808 | { |
| 809 | struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr; | 809 | struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr; |
| 810 | struct dn_ifaddr *ifa; | 810 | struct dn_ifaddr *ifa; |
| @@ -830,7 +830,7 @@ out: | |||
| 830 | * a sensible default. Eventually the routing code will take care of all the | 830 | * a sensible default. Eventually the routing code will take care of all the |
| 831 | * nasties for us I hope. | 831 | * nasties for us I hope. |
| 832 | */ | 832 | */ |
| 833 | int dn_dev_bind_default(dn_address *addr) | 833 | int dn_dev_bind_default(__le16 *addr) |
| 834 | { | 834 | { |
| 835 | struct net_device *dev; | 835 | struct net_device *dev; |
| 836 | int rv; | 836 | int rv; |
| @@ -853,7 +853,7 @@ static void dn_send_endnode_hello(struct net_device *dev, struct dn_ifaddr *ifa) | |||
| 853 | { | 853 | { |
| 854 | struct endnode_hello_message *msg; | 854 | struct endnode_hello_message *msg; |
| 855 | struct sk_buff *skb = NULL; | 855 | struct sk_buff *skb = NULL; |
| 856 | unsigned short int *pktlen; | 856 | __le16 *pktlen; |
| 857 | struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr; | 857 | struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr; |
| 858 | 858 | ||
| 859 | if ((skb = dn_alloc_skb(NULL, sizeof(*msg), GFP_ATOMIC)) == NULL) | 859 | if ((skb = dn_alloc_skb(NULL, sizeof(*msg), GFP_ATOMIC)) == NULL) |
| @@ -882,7 +882,7 @@ static void dn_send_endnode_hello(struct net_device *dev, struct dn_ifaddr *ifa) | |||
| 882 | msg->datalen = 0x02; | 882 | msg->datalen = 0x02; |
| 883 | memset(msg->data, 0xAA, 2); | 883 | memset(msg->data, 0xAA, 2); |
| 884 | 884 | ||
| 885 | pktlen = (unsigned short *)skb_push(skb,2); | 885 | pktlen = (__le16 *)skb_push(skb,2); |
| 886 | *pktlen = dn_htons(skb->len - 2); | 886 | *pktlen = dn_htons(skb->len - 2); |
| 887 | 887 | ||
| 888 | skb->nh.raw = skb->data; | 888 | skb->nh.raw = skb->data; |
| @@ -926,7 +926,7 @@ static void dn_send_router_hello(struct net_device *dev, struct dn_ifaddr *ifa) | |||
| 926 | size_t size; | 926 | size_t size; |
| 927 | unsigned char *ptr; | 927 | unsigned char *ptr; |
| 928 | unsigned char *i1, *i2; | 928 | unsigned char *i1, *i2; |
| 929 | unsigned short *pktlen; | 929 | __le16 *pktlen; |
| 930 | char *src; | 930 | char *src; |
| 931 | 931 | ||
| 932 | if (mtu2blksize(dev) < (26 + 7)) | 932 | if (mtu2blksize(dev) < (26 + 7)) |
| @@ -955,11 +955,11 @@ static void dn_send_router_hello(struct net_device *dev, struct dn_ifaddr *ifa) | |||
| 955 | ptr += ETH_ALEN; | 955 | ptr += ETH_ALEN; |
| 956 | *ptr++ = dn_db->parms.forwarding == 1 ? | 956 | *ptr++ = dn_db->parms.forwarding == 1 ? |
| 957 | DN_RT_INFO_L1RT : DN_RT_INFO_L2RT; | 957 | DN_RT_INFO_L1RT : DN_RT_INFO_L2RT; |
| 958 | *((unsigned short *)ptr) = dn_htons(mtu2blksize(dev)); | 958 | *((__le16 *)ptr) = dn_htons(mtu2blksize(dev)); |
| 959 | ptr += 2; | 959 | ptr += 2; |
| 960 | *ptr++ = dn_db->parms.priority; /* Priority */ | 960 | *ptr++ = dn_db->parms.priority; /* Priority */ |
| 961 | *ptr++ = 0; /* Area: Reserved */ | 961 | *ptr++ = 0; /* Area: Reserved */ |
| 962 | *((unsigned short *)ptr) = dn_htons((unsigned short)dn_db->parms.t3); | 962 | *((__le16 *)ptr) = dn_htons((unsigned short)dn_db->parms.t3); |
| 963 | ptr += 2; | 963 | ptr += 2; |
| 964 | *ptr++ = 0; /* MPD: Reserved */ | 964 | *ptr++ = 0; /* MPD: Reserved */ |
| 965 | i1 = ptr++; | 965 | i1 = ptr++; |
| @@ -974,7 +974,7 @@ static void dn_send_router_hello(struct net_device *dev, struct dn_ifaddr *ifa) | |||
| 974 | 974 | ||
| 975 | skb_trim(skb, (27 + *i2)); | 975 | skb_trim(skb, (27 + *i2)); |
| 976 | 976 | ||
| 977 | pktlen = (unsigned short *)skb_push(skb, 2); | 977 | pktlen = (__le16 *)skb_push(skb, 2); |
| 978 | *pktlen = dn_htons(skb->len - 2); | 978 | *pktlen = dn_htons(skb->len - 2); |
| 979 | 979 | ||
| 980 | skb->nh.raw = skb->data; | 980 | skb->nh.raw = skb->data; |
| @@ -1016,7 +1016,7 @@ static void dn_send_ptp_hello(struct net_device *dev, struct dn_ifaddr *ifa) | |||
| 1016 | ptr = skb_put(skb, 2 + 4 + tdlen); | 1016 | ptr = skb_put(skb, 2 + 4 + tdlen); |
| 1017 | 1017 | ||
| 1018 | *ptr++ = DN_RT_PKT_HELO; | 1018 | *ptr++ = DN_RT_PKT_HELO; |
| 1019 | *((dn_address *)ptr) = ifa->ifa_local; | 1019 | *((__le16 *)ptr) = ifa->ifa_local; |
| 1020 | ptr += 2; | 1020 | ptr += 2; |
| 1021 | *ptr++ = tdlen; | 1021 | *ptr++ = tdlen; |
| 1022 | 1022 | ||
| @@ -1150,7 +1150,7 @@ struct dn_dev *dn_dev_create(struct net_device *dev, int *err) | |||
| 1150 | void dn_dev_up(struct net_device *dev) | 1150 | void dn_dev_up(struct net_device *dev) |
| 1151 | { | 1151 | { |
| 1152 | struct dn_ifaddr *ifa; | 1152 | struct dn_ifaddr *ifa; |
| 1153 | dn_address addr = decnet_address; | 1153 | __le16 addr = decnet_address; |
| 1154 | int maybe_default = 0; | 1154 | int maybe_default = 0; |
| 1155 | struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr; | 1155 | struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr; |
| 1156 | 1156 | ||
| @@ -1173,7 +1173,7 @@ void dn_dev_up(struct net_device *dev) | |||
| 1173 | if (dev->type == ARPHRD_ETHER) { | 1173 | if (dev->type == ARPHRD_ETHER) { |
| 1174 | if (memcmp(dev->dev_addr, dn_hiord, 4) != 0) | 1174 | if (memcmp(dev->dev_addr, dn_hiord, 4) != 0) |
| 1175 | return; | 1175 | return; |
| 1176 | addr = dn_htons(dn_eth2dn(dev->dev_addr)); | 1176 | addr = dn_eth2dn(dev->dev_addr); |
| 1177 | maybe_default = 1; | 1177 | maybe_default = 1; |
| 1178 | } | 1178 | } |
| 1179 | 1179 | ||
| @@ -1385,8 +1385,8 @@ static int dn_dev_seq_show(struct seq_file *seq, void *v) | |||
| 1385 | mtu2blksize(dev), | 1385 | mtu2blksize(dev), |
| 1386 | dn_db->parms.priority, | 1386 | dn_db->parms.priority, |
| 1387 | dn_db->parms.state, dn_db->parms.name, | 1387 | dn_db->parms.state, dn_db->parms.name, |
| 1388 | dn_db->router ? dn_addr2asc(dn_ntohs(*(dn_address *)dn_db->router->primary_key), router_buf) : "", | 1388 | dn_db->router ? dn_addr2asc(dn_ntohs(*(__le16 *)dn_db->router->primary_key), router_buf) : "", |
| 1389 | dn_db->peer ? dn_addr2asc(dn_ntohs(*(dn_address *)dn_db->peer->primary_key), peer_buf) : ""); | 1389 | dn_db->peer ? dn_addr2asc(dn_ntohs(*(__le16 *)dn_db->peer->primary_key), peer_buf) : ""); |
| 1390 | } | 1390 | } |
| 1391 | return 0; | 1391 | return 0; |
| 1392 | } | 1392 | } |
diff --git a/net/decnet/dn_fib.c b/net/decnet/dn_fib.c index 99bc061759c3..bd4ce8681a12 100644 --- a/net/decnet/dn_fib.c +++ b/net/decnet/dn_fib.c | |||
| @@ -143,11 +143,11 @@ static inline struct dn_fib_info *dn_fib_find_info(const struct dn_fib_info *nfi | |||
| 143 | return NULL; | 143 | return NULL; |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | u16 dn_fib_get_attr16(struct rtattr *attr, int attrlen, int type) | 146 | __le16 dn_fib_get_attr16(struct rtattr *attr, int attrlen, int type) |
| 147 | { | 147 | { |
| 148 | while(RTA_OK(attr,attrlen)) { | 148 | while(RTA_OK(attr,attrlen)) { |
| 149 | if (attr->rta_type == type) | 149 | if (attr->rta_type == type) |
| 150 | return *(u16*)RTA_DATA(attr); | 150 | return *(__le16*)RTA_DATA(attr); |
| 151 | attr = RTA_NEXT(attr, attrlen); | 151 | attr = RTA_NEXT(attr, attrlen); |
| 152 | } | 152 | } |
| 153 | 153 | ||
| @@ -565,7 +565,7 @@ int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 565 | return skb->len; | 565 | return skb->len; |
| 566 | } | 566 | } |
| 567 | 567 | ||
| 568 | static void fib_magic(int cmd, int type, __u16 dst, int dst_len, struct dn_ifaddr *ifa) | 568 | static void fib_magic(int cmd, int type, __le16 dst, int dst_len, struct dn_ifaddr *ifa) |
| 569 | { | 569 | { |
| 570 | struct dn_fib_table *tb; | 570 | struct dn_fib_table *tb; |
| 571 | struct { | 571 | struct { |
| @@ -684,7 +684,7 @@ static int dn_fib_dnaddr_event(struct notifier_block *this, unsigned long event, | |||
| 684 | return NOTIFY_DONE; | 684 | return NOTIFY_DONE; |
| 685 | } | 685 | } |
| 686 | 686 | ||
| 687 | int dn_fib_sync_down(dn_address local, struct net_device *dev, int force) | 687 | int dn_fib_sync_down(__le16 local, struct net_device *dev, int force) |
| 688 | { | 688 | { |
| 689 | int ret = 0; | 689 | int ret = 0; |
| 690 | int scope = RT_SCOPE_NOWHERE; | 690 | int scope = RT_SCOPE_NOWHERE; |
diff --git a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c index 33ab256cfd4a..7c8692c26bfe 100644 --- a/net/decnet/dn_neigh.c +++ b/net/decnet/dn_neigh.c | |||
| @@ -95,7 +95,7 @@ static struct neigh_ops dn_phase3_ops = { | |||
| 95 | struct neigh_table dn_neigh_table = { | 95 | struct neigh_table dn_neigh_table = { |
| 96 | .family = PF_DECnet, | 96 | .family = PF_DECnet, |
| 97 | .entry_size = sizeof(struct dn_neigh), | 97 | .entry_size = sizeof(struct dn_neigh), |
| 98 | .key_len = sizeof(dn_address), | 98 | .key_len = sizeof(__le16), |
| 99 | .hash = dn_neigh_hash, | 99 | .hash = dn_neigh_hash, |
| 100 | .constructor = dn_neigh_construct, | 100 | .constructor = dn_neigh_construct, |
| 101 | .id = "dn_neigh_cache", | 101 | .id = "dn_neigh_cache", |
| @@ -123,7 +123,7 @@ struct neigh_table dn_neigh_table = { | |||
| 123 | 123 | ||
| 124 | static u32 dn_neigh_hash(const void *pkey, const struct net_device *dev) | 124 | static u32 dn_neigh_hash(const void *pkey, const struct net_device *dev) |
| 125 | { | 125 | { |
| 126 | return jhash_2words(*(dn_address *)pkey, 0, dn_neigh_table.hash_rnd); | 126 | return jhash_2words(*(__u16 *)pkey, 0, dn_neigh_table.hash_rnd); |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | static int dn_neigh_construct(struct neighbour *neigh) | 129 | static int dn_neigh_construct(struct neighbour *neigh) |
| @@ -249,14 +249,14 @@ static int dn_long_output(struct sk_buff *skb) | |||
| 249 | data = skb_push(skb, sizeof(struct dn_long_packet) + 3); | 249 | data = skb_push(skb, sizeof(struct dn_long_packet) + 3); |
| 250 | lp = (struct dn_long_packet *)(data+3); | 250 | lp = (struct dn_long_packet *)(data+3); |
| 251 | 251 | ||
| 252 | *((unsigned short *)data) = dn_htons(skb->len - 2); | 252 | *((__le16 *)data) = dn_htons(skb->len - 2); |
| 253 | *(data + 2) = 1 | DN_RT_F_PF; /* Padding */ | 253 | *(data + 2) = 1 | DN_RT_F_PF; /* Padding */ |
| 254 | 254 | ||
| 255 | lp->msgflg = DN_RT_PKT_LONG|(cb->rt_flags&(DN_RT_F_IE|DN_RT_F_RQR|DN_RT_F_RTS)); | 255 | lp->msgflg = DN_RT_PKT_LONG|(cb->rt_flags&(DN_RT_F_IE|DN_RT_F_RQR|DN_RT_F_RTS)); |
| 256 | lp->d_area = lp->d_subarea = 0; | 256 | lp->d_area = lp->d_subarea = 0; |
| 257 | dn_dn2eth(lp->d_id, dn_ntohs(cb->dst)); | 257 | dn_dn2eth(lp->d_id, cb->dst); |
| 258 | lp->s_area = lp->s_subarea = 0; | 258 | lp->s_area = lp->s_subarea = 0; |
| 259 | dn_dn2eth(lp->s_id, dn_ntohs(cb->src)); | 259 | dn_dn2eth(lp->s_id, cb->src); |
| 260 | lp->nl2 = 0; | 260 | lp->nl2 = 0; |
| 261 | lp->visit_ct = cb->hops & 0x3f; | 261 | lp->visit_ct = cb->hops & 0x3f; |
| 262 | lp->s_class = 0; | 262 | lp->s_class = 0; |
| @@ -293,7 +293,7 @@ static int dn_short_output(struct sk_buff *skb) | |||
| 293 | } | 293 | } |
| 294 | 294 | ||
| 295 | data = skb_push(skb, sizeof(struct dn_short_packet) + 2); | 295 | data = skb_push(skb, sizeof(struct dn_short_packet) + 2); |
| 296 | *((unsigned short *)data) = dn_htons(skb->len - 2); | 296 | *((__le16 *)data) = dn_htons(skb->len - 2); |
| 297 | sp = (struct dn_short_packet *)(data+2); | 297 | sp = (struct dn_short_packet *)(data+2); |
| 298 | 298 | ||
| 299 | sp->msgflg = DN_RT_PKT_SHORT|(cb->rt_flags&(DN_RT_F_RQR|DN_RT_F_RTS)); | 299 | sp->msgflg = DN_RT_PKT_SHORT|(cb->rt_flags&(DN_RT_F_RQR|DN_RT_F_RTS)); |
| @@ -335,7 +335,7 @@ static int dn_phase3_output(struct sk_buff *skb) | |||
| 335 | } | 335 | } |
| 336 | 336 | ||
| 337 | data = skb_push(skb, sizeof(struct dn_short_packet) + 2); | 337 | data = skb_push(skb, sizeof(struct dn_short_packet) + 2); |
| 338 | *((unsigned short *)data) = dn_htons(skb->len - 2); | 338 | *((__le16 *)data) = dn_htons(skb->len - 2); |
| 339 | sp = (struct dn_short_packet *)(data + 2); | 339 | sp = (struct dn_short_packet *)(data + 2); |
| 340 | 340 | ||
| 341 | sp->msgflg = DN_RT_PKT_SHORT|(cb->rt_flags&(DN_RT_F_RQR|DN_RT_F_RTS)); | 341 | sp->msgflg = DN_RT_PKT_SHORT|(cb->rt_flags&(DN_RT_F_RQR|DN_RT_F_RTS)); |
| @@ -373,9 +373,9 @@ int dn_neigh_router_hello(struct sk_buff *skb) | |||
| 373 | struct neighbour *neigh; | 373 | struct neighbour *neigh; |
| 374 | struct dn_neigh *dn; | 374 | struct dn_neigh *dn; |
| 375 | struct dn_dev *dn_db; | 375 | struct dn_dev *dn_db; |
| 376 | dn_address src; | 376 | __le16 src; |
| 377 | 377 | ||
| 378 | src = dn_htons(dn_eth2dn(msg->id)); | 378 | src = dn_eth2dn(msg->id); |
| 379 | 379 | ||
| 380 | neigh = __neigh_lookup(&dn_neigh_table, &src, skb->dev, 1); | 380 | neigh = __neigh_lookup(&dn_neigh_table, &src, skb->dev, 1); |
| 381 | 381 | ||
| @@ -409,7 +409,7 @@ int dn_neigh_router_hello(struct sk_buff *skb) | |||
| 409 | } | 409 | } |
| 410 | 410 | ||
| 411 | /* Only use routers in our area */ | 411 | /* Only use routers in our area */ |
| 412 | if ((dn_ntohs(src)>>10) == dn_ntohs((decnet_address)>>10)) { | 412 | if ((dn_ntohs(src)>>10) == (dn_ntohs((decnet_address))>>10)) { |
| 413 | if (!dn_db->router) { | 413 | if (!dn_db->router) { |
| 414 | dn_db->router = neigh_clone(neigh); | 414 | dn_db->router = neigh_clone(neigh); |
| 415 | } else { | 415 | } else { |
| @@ -433,9 +433,9 @@ int dn_neigh_endnode_hello(struct sk_buff *skb) | |||
| 433 | struct endnode_hello_message *msg = (struct endnode_hello_message *)skb->data; | 433 | struct endnode_hello_message *msg = (struct endnode_hello_message *)skb->data; |
| 434 | struct neighbour *neigh; | 434 | struct neighbour *neigh; |
| 435 | struct dn_neigh *dn; | 435 | struct dn_neigh *dn; |
| 436 | dn_address src; | 436 | __le16 src; |
| 437 | 437 | ||
| 438 | src = dn_htons(dn_eth2dn(msg->id)); | 438 | src = dn_eth2dn(msg->id); |
| 439 | 439 | ||
| 440 | neigh = __neigh_lookup(&dn_neigh_table, &src, skb->dev, 1); | 440 | neigh = __neigh_lookup(&dn_neigh_table, &src, skb->dev, 1); |
| 441 | 441 | ||
diff --git a/net/decnet/dn_nsp_in.c b/net/decnet/dn_nsp_in.c index 44bda85e678f..547523b41c81 100644 --- a/net/decnet/dn_nsp_in.c +++ b/net/decnet/dn_nsp_in.c | |||
| @@ -85,7 +85,7 @@ static void dn_log_martian(struct sk_buff *skb, const char *msg) | |||
| 85 | if (decnet_log_martians && net_ratelimit()) { | 85 | if (decnet_log_martians && net_ratelimit()) { |
| 86 | char *devname = skb->dev ? skb->dev->name : "???"; | 86 | char *devname = skb->dev ? skb->dev->name : "???"; |
| 87 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 87 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
| 88 | printk(KERN_INFO "DECnet: Martian packet (%s) dev=%s src=0x%04hx dst=0x%04hx srcport=0x%04hx dstport=0x%04hx\n", msg, devname, cb->src, cb->dst, cb->src_port, cb->dst_port); | 88 | printk(KERN_INFO "DECnet: Martian packet (%s) dev=%s src=0x%04hx dst=0x%04hx srcport=0x%04hx dstport=0x%04hx\n", msg, devname, dn_ntohs(cb->src), dn_ntohs(cb->dst), dn_ntohs(cb->src_port), dn_ntohs(cb->dst_port)); |
| 89 | } | 89 | } |
| 90 | } | 90 | } |
| 91 | 91 | ||
| @@ -128,7 +128,7 @@ static void dn_ack(struct sock *sk, struct sk_buff *skb, unsigned short ack) | |||
| 128 | */ | 128 | */ |
| 129 | static int dn_process_ack(struct sock *sk, struct sk_buff *skb, int oth) | 129 | static int dn_process_ack(struct sock *sk, struct sk_buff *skb, int oth) |
| 130 | { | 130 | { |
| 131 | unsigned short *ptr = (unsigned short *)skb->data; | 131 | __le16 *ptr = (__le16 *)skb->data; |
| 132 | int len = 0; | 132 | int len = 0; |
| 133 | unsigned short ack; | 133 | unsigned short ack; |
| 134 | 134 | ||
| @@ -346,7 +346,7 @@ static void dn_nsp_conn_conf(struct sock *sk, struct sk_buff *skb) | |||
| 346 | ptr = skb->data; | 346 | ptr = skb->data; |
| 347 | cb->services = *ptr++; | 347 | cb->services = *ptr++; |
| 348 | cb->info = *ptr++; | 348 | cb->info = *ptr++; |
| 349 | cb->segsize = dn_ntohs(*(__u16 *)ptr); | 349 | cb->segsize = dn_ntohs(*(__le16 *)ptr); |
| 350 | 350 | ||
| 351 | if ((scp->state == DN_CI) || (scp->state == DN_CD)) { | 351 | if ((scp->state == DN_CI) || (scp->state == DN_CD)) { |
| 352 | scp->persist = 0; | 352 | scp->persist = 0; |
| @@ -363,7 +363,7 @@ static void dn_nsp_conn_conf(struct sock *sk, struct sk_buff *skb) | |||
| 363 | if (skb->len > 0) { | 363 | if (skb->len > 0) { |
| 364 | unsigned char dlen = *skb->data; | 364 | unsigned char dlen = *skb->data; |
| 365 | if ((dlen <= 16) && (dlen <= skb->len)) { | 365 | if ((dlen <= 16) && (dlen <= skb->len)) { |
| 366 | scp->conndata_in.opt_optl = dlen; | 366 | scp->conndata_in.opt_optl = dn_htons((__u16)dlen); |
| 367 | memcpy(scp->conndata_in.opt_data, skb->data + 1, dlen); | 367 | memcpy(scp->conndata_in.opt_data, skb->data + 1, dlen); |
| 368 | } | 368 | } |
| 369 | } | 369 | } |
| @@ -397,17 +397,17 @@ static void dn_nsp_disc_init(struct sock *sk, struct sk_buff *skb) | |||
| 397 | if (skb->len < 2) | 397 | if (skb->len < 2) |
| 398 | goto out; | 398 | goto out; |
| 399 | 399 | ||
| 400 | reason = dn_ntohs(*(__u16 *)skb->data); | 400 | reason = dn_ntohs(*(__le16 *)skb->data); |
| 401 | skb_pull(skb, 2); | 401 | skb_pull(skb, 2); |
| 402 | 402 | ||
| 403 | scp->discdata_in.opt_status = reason; | 403 | scp->discdata_in.opt_status = dn_htons(reason); |
| 404 | scp->discdata_in.opt_optl = 0; | 404 | scp->discdata_in.opt_optl = 0; |
| 405 | memset(scp->discdata_in.opt_data, 0, 16); | 405 | memset(scp->discdata_in.opt_data, 0, 16); |
| 406 | 406 | ||
| 407 | if (skb->len > 0) { | 407 | if (skb->len > 0) { |
| 408 | unsigned char dlen = *skb->data; | 408 | unsigned char dlen = *skb->data; |
| 409 | if ((dlen <= 16) && (dlen <= skb->len)) { | 409 | if ((dlen <= 16) && (dlen <= skb->len)) { |
| 410 | scp->discdata_in.opt_optl = dlen; | 410 | scp->discdata_in.opt_optl = dn_htons((__u16)dlen); |
| 411 | memcpy(scp->discdata_in.opt_data, skb->data + 1, dlen); | 411 | memcpy(scp->discdata_in.opt_data, skb->data + 1, dlen); |
| 412 | } | 412 | } |
| 413 | } | 413 | } |
| @@ -464,7 +464,7 @@ static void dn_nsp_disc_conf(struct sock *sk, struct sk_buff *skb) | |||
| 464 | if (skb->len != 2) | 464 | if (skb->len != 2) |
| 465 | goto out; | 465 | goto out; |
| 466 | 466 | ||
| 467 | reason = dn_ntohs(*(__u16 *)skb->data); | 467 | reason = dn_ntohs(*(__le16 *)skb->data); |
| 468 | 468 | ||
| 469 | sk->sk_state = TCP_CLOSE; | 469 | sk->sk_state = TCP_CLOSE; |
| 470 | 470 | ||
| @@ -513,7 +513,7 @@ static void dn_nsp_linkservice(struct sock *sk, struct sk_buff *skb) | |||
| 513 | if (skb->len != 4) | 513 | if (skb->len != 4) |
| 514 | goto out; | 514 | goto out; |
| 515 | 515 | ||
| 516 | segnum = dn_ntohs(*(__u16 *)ptr); | 516 | segnum = dn_ntohs(*(__le16 *)ptr); |
| 517 | ptr += 2; | 517 | ptr += 2; |
| 518 | lsflags = *(unsigned char *)ptr++; | 518 | lsflags = *(unsigned char *)ptr++; |
| 519 | fcval = *ptr; | 519 | fcval = *ptr; |
| @@ -621,7 +621,7 @@ static void dn_nsp_otherdata(struct sock *sk, struct sk_buff *skb) | |||
| 621 | if (skb->len < 2) | 621 | if (skb->len < 2) |
| 622 | goto out; | 622 | goto out; |
| 623 | 623 | ||
| 624 | cb->segnum = segnum = dn_ntohs(*(__u16 *)skb->data); | 624 | cb->segnum = segnum = dn_ntohs(*(__le16 *)skb->data); |
| 625 | skb_pull(skb, 2); | 625 | skb_pull(skb, 2); |
| 626 | 626 | ||
| 627 | if (seq_next(scp->numoth_rcv, segnum)) { | 627 | if (seq_next(scp->numoth_rcv, segnum)) { |
| @@ -649,7 +649,7 @@ static void dn_nsp_data(struct sock *sk, struct sk_buff *skb) | |||
| 649 | if (skb->len < 2) | 649 | if (skb->len < 2) |
| 650 | goto out; | 650 | goto out; |
| 651 | 651 | ||
| 652 | cb->segnum = segnum = dn_ntohs(*(__u16 *)skb->data); | 652 | cb->segnum = segnum = dn_ntohs(*(__le16 *)skb->data); |
| 653 | skb_pull(skb, 2); | 653 | skb_pull(skb, 2); |
| 654 | 654 | ||
| 655 | if (seq_next(scp->numdat_rcv, segnum)) { | 655 | if (seq_next(scp->numdat_rcv, segnum)) { |
| @@ -760,7 +760,7 @@ static int dn_nsp_rx_packet(struct sk_buff *skb) | |||
| 760 | /* | 760 | /* |
| 761 | * Grab the destination address. | 761 | * Grab the destination address. |
| 762 | */ | 762 | */ |
| 763 | cb->dst_port = *(unsigned short *)ptr; | 763 | cb->dst_port = *(__le16 *)ptr; |
| 764 | cb->src_port = 0; | 764 | cb->src_port = 0; |
| 765 | ptr += 2; | 765 | ptr += 2; |
| 766 | 766 | ||
| @@ -768,7 +768,7 @@ static int dn_nsp_rx_packet(struct sk_buff *skb) | |||
| 768 | * If not a connack, grab the source address too. | 768 | * If not a connack, grab the source address too. |
| 769 | */ | 769 | */ |
| 770 | if (pskb_may_pull(skb, 5)) { | 770 | if (pskb_may_pull(skb, 5)) { |
| 771 | cb->src_port = *(unsigned short *)ptr; | 771 | cb->src_port = *(__le16 *)ptr; |
| 772 | ptr += 2; | 772 | ptr += 2; |
| 773 | skb_pull(skb, 5); | 773 | skb_pull(skb, 5); |
| 774 | } | 774 | } |
| @@ -778,7 +778,7 @@ static int dn_nsp_rx_packet(struct sk_buff *skb) | |||
| 778 | * Swap src & dst and look up in the normal way. | 778 | * Swap src & dst and look up in the normal way. |
| 779 | */ | 779 | */ |
| 780 | if (unlikely(cb->rt_flags & DN_RT_F_RTS)) { | 780 | if (unlikely(cb->rt_flags & DN_RT_F_RTS)) { |
| 781 | unsigned short tmp = cb->dst_port; | 781 | __le16 tmp = cb->dst_port; |
| 782 | cb->dst_port = cb->src_port; | 782 | cb->dst_port = cb->src_port; |
| 783 | cb->src_port = tmp; | 783 | cb->src_port = tmp; |
| 784 | tmp = cb->dst; | 784 | tmp = cb->dst; |
diff --git a/net/decnet/dn_nsp_out.c b/net/decnet/dn_nsp_out.c index c96c767b1f74..c2e21cd89b3c 100644 --- a/net/decnet/dn_nsp_out.c +++ b/net/decnet/dn_nsp_out.c | |||
| @@ -287,26 +287,26 @@ int dn_nsp_xmit_timeout(struct sock *sk) | |||
| 287 | return 0; | 287 | return 0; |
| 288 | } | 288 | } |
| 289 | 289 | ||
| 290 | static inline unsigned char *dn_mk_common_header(struct dn_scp *scp, struct sk_buff *skb, unsigned char msgflag, int len) | 290 | static inline __le16 *dn_mk_common_header(struct dn_scp *scp, struct sk_buff *skb, unsigned char msgflag, int len) |
| 291 | { | 291 | { |
| 292 | unsigned char *ptr = skb_push(skb, len); | 292 | unsigned char *ptr = skb_push(skb, len); |
| 293 | 293 | ||
| 294 | BUG_ON(len < 5); | 294 | BUG_ON(len < 5); |
| 295 | 295 | ||
| 296 | *ptr++ = msgflag; | 296 | *ptr++ = msgflag; |
| 297 | *((unsigned short *)ptr) = scp->addrrem; | 297 | *((__le16 *)ptr) = scp->addrrem; |
| 298 | ptr += 2; | 298 | ptr += 2; |
| 299 | *((unsigned short *)ptr) = scp->addrloc; | 299 | *((__le16 *)ptr) = scp->addrloc; |
| 300 | ptr += 2; | 300 | ptr += 2; |
| 301 | return ptr; | 301 | return (__le16 __force *)ptr; |
| 302 | } | 302 | } |
| 303 | 303 | ||
| 304 | static unsigned short *dn_mk_ack_header(struct sock *sk, struct sk_buff *skb, unsigned char msgflag, int hlen, int other) | 304 | static __le16 *dn_mk_ack_header(struct sock *sk, struct sk_buff *skb, unsigned char msgflag, int hlen, int other) |
| 305 | { | 305 | { |
| 306 | struct dn_scp *scp = DN_SK(sk); | 306 | struct dn_scp *scp = DN_SK(sk); |
| 307 | unsigned short acknum = scp->numdat_rcv & 0x0FFF; | 307 | unsigned short acknum = scp->numdat_rcv & 0x0FFF; |
| 308 | unsigned short ackcrs = scp->numoth_rcv & 0x0FFF; | 308 | unsigned short ackcrs = scp->numoth_rcv & 0x0FFF; |
| 309 | unsigned short *ptr; | 309 | __le16 *ptr; |
| 310 | 310 | ||
| 311 | BUG_ON(hlen < 9); | 311 | BUG_ON(hlen < 9); |
| 312 | 312 | ||
| @@ -325,7 +325,7 @@ static unsigned short *dn_mk_ack_header(struct sock *sk, struct sk_buff *skb, un | |||
| 325 | /* Set "cross subchannel" bit in ackcrs */ | 325 | /* Set "cross subchannel" bit in ackcrs */ |
| 326 | ackcrs |= 0x2000; | 326 | ackcrs |= 0x2000; |
| 327 | 327 | ||
| 328 | ptr = (unsigned short *)dn_mk_common_header(scp, skb, msgflag, hlen); | 328 | ptr = (__le16 *)dn_mk_common_header(scp, skb, msgflag, hlen); |
| 329 | 329 | ||
| 330 | *ptr++ = dn_htons(acknum); | 330 | *ptr++ = dn_htons(acknum); |
| 331 | *ptr++ = dn_htons(ackcrs); | 331 | *ptr++ = dn_htons(ackcrs); |
| @@ -333,11 +333,11 @@ static unsigned short *dn_mk_ack_header(struct sock *sk, struct sk_buff *skb, un | |||
| 333 | return ptr; | 333 | return ptr; |
| 334 | } | 334 | } |
| 335 | 335 | ||
| 336 | static unsigned short *dn_nsp_mk_data_header(struct sock *sk, struct sk_buff *skb, int oth) | 336 | static __le16 *dn_nsp_mk_data_header(struct sock *sk, struct sk_buff *skb, int oth) |
| 337 | { | 337 | { |
| 338 | struct dn_scp *scp = DN_SK(sk); | 338 | struct dn_scp *scp = DN_SK(sk); |
| 339 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 339 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
| 340 | unsigned short *ptr = dn_mk_ack_header(sk, skb, cb->nsp_flags, 11, oth); | 340 | __le16 *ptr = dn_mk_ack_header(sk, skb, cb->nsp_flags, 11, oth); |
| 341 | 341 | ||
| 342 | if (unlikely(oth)) { | 342 | if (unlikely(oth)) { |
| 343 | cb->segnum = scp->numoth; | 343 | cb->segnum = scp->numoth; |
| @@ -524,9 +524,9 @@ void dn_send_conn_conf(struct sock *sk, gfp_t gfp) | |||
| 524 | struct dn_scp *scp = DN_SK(sk); | 524 | struct dn_scp *scp = DN_SK(sk); |
| 525 | struct sk_buff *skb = NULL; | 525 | struct sk_buff *skb = NULL; |
| 526 | struct nsp_conn_init_msg *msg; | 526 | struct nsp_conn_init_msg *msg; |
| 527 | unsigned char len = scp->conndata_out.opt_optl; | 527 | __u8 len = (__u8)dn_ntohs(scp->conndata_out.opt_optl); |
| 528 | 528 | ||
| 529 | if ((skb = dn_alloc_skb(sk, 50 + scp->conndata_out.opt_optl, gfp)) == NULL) | 529 | if ((skb = dn_alloc_skb(sk, 50 + dn_ntohs(scp->conndata_out.opt_optl), gfp)) == NULL) |
| 530 | return; | 530 | return; |
| 531 | 531 | ||
| 532 | msg = (struct nsp_conn_init_msg *)skb_put(skb, sizeof(*msg)); | 532 | msg = (struct nsp_conn_init_msg *)skb_put(skb, sizeof(*msg)); |
| @@ -553,7 +553,7 @@ void dn_send_conn_conf(struct sock *sk, gfp_t gfp) | |||
| 553 | static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg, | 553 | static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg, |
| 554 | unsigned short reason, gfp_t gfp, | 554 | unsigned short reason, gfp_t gfp, |
| 555 | struct dst_entry *dst, | 555 | struct dst_entry *dst, |
| 556 | int ddl, unsigned char *dd, __u16 rem, __u16 loc) | 556 | int ddl, unsigned char *dd, __le16 rem, __le16 loc) |
| 557 | { | 557 | { |
| 558 | struct sk_buff *skb = NULL; | 558 | struct sk_buff *skb = NULL; |
| 559 | int size = 7 + ddl + ((msgflg == NSP_DISCINIT) ? 1 : 0); | 559 | int size = 7 + ddl + ((msgflg == NSP_DISCINIT) ? 1 : 0); |
| @@ -561,7 +561,7 @@ static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg, | |||
| 561 | 561 | ||
| 562 | if ((dst == NULL) || (rem == 0)) { | 562 | if ((dst == NULL) || (rem == 0)) { |
| 563 | if (net_ratelimit()) | 563 | if (net_ratelimit()) |
| 564 | printk(KERN_DEBUG "DECnet: dn_nsp_do_disc: BUG! Please report this to SteveW@ACM.org rem=%u dst=%p\n", (unsigned)rem, dst); | 564 | printk(KERN_DEBUG "DECnet: dn_nsp_do_disc: BUG! Please report this to SteveW@ACM.org rem=%u dst=%p\n", dn_ntohs(rem), dst); |
| 565 | return; | 565 | return; |
| 566 | } | 566 | } |
| 567 | 567 | ||
| @@ -570,11 +570,11 @@ static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg, | |||
| 570 | 570 | ||
| 571 | msg = skb_put(skb, size); | 571 | msg = skb_put(skb, size); |
| 572 | *msg++ = msgflg; | 572 | *msg++ = msgflg; |
| 573 | *(__u16 *)msg = rem; | 573 | *(__le16 *)msg = rem; |
| 574 | msg += 2; | 574 | msg += 2; |
| 575 | *(__u16 *)msg = loc; | 575 | *(__le16 *)msg = loc; |
| 576 | msg += 2; | 576 | msg += 2; |
| 577 | *(__u16 *)msg = dn_htons(reason); | 577 | *(__le16 *)msg = dn_htons(reason); |
| 578 | msg += 2; | 578 | msg += 2; |
| 579 | if (msgflg == NSP_DISCINIT) | 579 | if (msgflg == NSP_DISCINIT) |
| 580 | *msg++ = ddl; | 580 | *msg++ = ddl; |
| @@ -600,10 +600,10 @@ void dn_nsp_send_disc(struct sock *sk, unsigned char msgflg, | |||
| 600 | int ddl = 0; | 600 | int ddl = 0; |
| 601 | 601 | ||
| 602 | if (msgflg == NSP_DISCINIT) | 602 | if (msgflg == NSP_DISCINIT) |
| 603 | ddl = scp->discdata_out.opt_optl; | 603 | ddl = dn_ntohs(scp->discdata_out.opt_optl); |
| 604 | 604 | ||
| 605 | if (reason == 0) | 605 | if (reason == 0) |
| 606 | reason = scp->discdata_out.opt_status; | 606 | reason = dn_ntohs(scp->discdata_out.opt_status); |
| 607 | 607 | ||
| 608 | dn_nsp_do_disc(sk, msgflg, reason, gfp, sk->sk_dst_cache, ddl, | 608 | dn_nsp_do_disc(sk, msgflg, reason, gfp, sk->sk_dst_cache, ddl, |
| 609 | scp->discdata_out.opt_data, scp->addrrem, scp->addrloc); | 609 | scp->discdata_out.opt_data, scp->addrrem, scp->addrloc); |
| @@ -708,7 +708,7 @@ void dn_nsp_send_conninit(struct sock *sk, unsigned char msgflg) | |||
| 708 | if (aux > 0) | 708 | if (aux > 0) |
| 709 | memcpy(skb_put(skb, aux), scp->accessdata.acc_acc, aux); | 709 | memcpy(skb_put(skb, aux), scp->accessdata.acc_acc, aux); |
| 710 | 710 | ||
| 711 | aux = scp->conndata_out.opt_optl; | 711 | aux = (__u8)dn_ntohs(scp->conndata_out.opt_optl); |
| 712 | *skb_put(skb, 1) = aux; | 712 | *skb_put(skb, 1) = aux; |
| 713 | if (aux > 0) | 713 | if (aux > 0) |
| 714 | memcpy(skb_put(skb,aux), scp->conndata_out.opt_data, aux); | 714 | memcpy(skb_put(skb,aux), scp->conndata_out.opt_data, aux); |
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 3407f190afe8..e172cf98d7fc 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
| @@ -133,9 +133,9 @@ static struct dst_ops dn_dst_ops = { | |||
| 133 | .entries = ATOMIC_INIT(0), | 133 | .entries = ATOMIC_INIT(0), |
| 134 | }; | 134 | }; |
| 135 | 135 | ||
| 136 | static __inline__ unsigned dn_hash(unsigned short src, unsigned short dst) | 136 | static __inline__ unsigned dn_hash(__le16 src, __le16 dst) |
| 137 | { | 137 | { |
| 138 | unsigned short tmp = src ^ dst; | 138 | __u16 tmp = (__u16 __force)(src ^ dst); |
| 139 | tmp ^= (tmp >> 3); | 139 | tmp ^= (tmp >> 3); |
| 140 | tmp ^= (tmp >> 5); | 140 | tmp ^= (tmp >> 5); |
| 141 | tmp ^= (tmp >> 10); | 141 | tmp ^= (tmp >> 10); |
| @@ -149,8 +149,7 @@ static inline void dnrt_free(struct dn_route *rt) | |||
| 149 | 149 | ||
| 150 | static inline void dnrt_drop(struct dn_route *rt) | 150 | static inline void dnrt_drop(struct dn_route *rt) |
| 151 | { | 151 | { |
| 152 | if (rt) | 152 | dst_release(&rt->u.dst); |
| 153 | dst_release(&rt->u.dst); | ||
| 154 | call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free); | 153 | call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free); |
| 155 | } | 154 | } |
| 156 | 155 | ||
| @@ -379,9 +378,9 @@ static int dn_return_short(struct sk_buff *skb) | |||
| 379 | { | 378 | { |
| 380 | struct dn_skb_cb *cb; | 379 | struct dn_skb_cb *cb; |
| 381 | unsigned char *ptr; | 380 | unsigned char *ptr; |
| 382 | dn_address *src; | 381 | __le16 *src; |
| 383 | dn_address *dst; | 382 | __le16 *dst; |
| 384 | dn_address tmp; | 383 | __le16 tmp; |
| 385 | 384 | ||
| 386 | /* Add back headers */ | 385 | /* Add back headers */ |
| 387 | skb_push(skb, skb->data - skb->nh.raw); | 386 | skb_push(skb, skb->data - skb->nh.raw); |
| @@ -394,9 +393,9 @@ static int dn_return_short(struct sk_buff *skb) | |||
| 394 | ptr = skb->data + 2; | 393 | ptr = skb->data + 2; |
| 395 | *ptr++ = (cb->rt_flags & ~DN_RT_F_RQR) | DN_RT_F_RTS; | 394 | *ptr++ = (cb->rt_flags & ~DN_RT_F_RQR) | DN_RT_F_RTS; |
| 396 | 395 | ||
| 397 | dst = (dn_address *)ptr; | 396 | dst = (__le16 *)ptr; |
| 398 | ptr += 2; | 397 | ptr += 2; |
| 399 | src = (dn_address *)ptr; | 398 | src = (__le16 *)ptr; |
| 400 | ptr += 2; | 399 | ptr += 2; |
| 401 | *ptr = 0; /* Zero hop count */ | 400 | *ptr = 0; /* Zero hop count */ |
| 402 | 401 | ||
| @@ -475,7 +474,8 @@ static int dn_route_rx_packet(struct sk_buff *skb) | |||
| 475 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 474 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
| 476 | printk(KERN_DEBUG | 475 | printk(KERN_DEBUG |
| 477 | "DECnet: dn_route_rx_packet: rt_flags=0x%02x dev=%s len=%d src=0x%04hx dst=0x%04hx err=%d type=%d\n", | 476 | "DECnet: dn_route_rx_packet: rt_flags=0x%02x dev=%s len=%d src=0x%04hx dst=0x%04hx err=%d type=%d\n", |
| 478 | (int)cb->rt_flags, devname, skb->len, cb->src, cb->dst, | 477 | (int)cb->rt_flags, devname, skb->len, |
| 478 | dn_ntohs(cb->src), dn_ntohs(cb->dst), | ||
| 479 | err, skb->pkt_type); | 479 | err, skb->pkt_type); |
| 480 | } | 480 | } |
| 481 | 481 | ||
| @@ -505,7 +505,7 @@ static int dn_route_rx_long(struct sk_buff *skb) | |||
| 505 | 505 | ||
| 506 | /* Destination info */ | 506 | /* Destination info */ |
| 507 | ptr += 2; | 507 | ptr += 2; |
| 508 | cb->dst = dn_htons(dn_eth2dn(ptr)); | 508 | cb->dst = dn_eth2dn(ptr); |
| 509 | if (memcmp(ptr, dn_hiord_addr, 4) != 0) | 509 | if (memcmp(ptr, dn_hiord_addr, 4) != 0) |
| 510 | goto drop_it; | 510 | goto drop_it; |
| 511 | ptr += 6; | 511 | ptr += 6; |
| @@ -513,7 +513,7 @@ static int dn_route_rx_long(struct sk_buff *skb) | |||
| 513 | 513 | ||
| 514 | /* Source info */ | 514 | /* Source info */ |
| 515 | ptr += 2; | 515 | ptr += 2; |
| 516 | cb->src = dn_htons(dn_eth2dn(ptr)); | 516 | cb->src = dn_eth2dn(ptr); |
| 517 | if (memcmp(ptr, dn_hiord_addr, 4) != 0) | 517 | if (memcmp(ptr, dn_hiord_addr, 4) != 0) |
| 518 | goto drop_it; | 518 | goto drop_it; |
| 519 | ptr += 6; | 519 | ptr += 6; |
| @@ -541,9 +541,9 @@ static int dn_route_rx_short(struct sk_buff *skb) | |||
| 541 | skb_pull(skb, 5); | 541 | skb_pull(skb, 5); |
| 542 | skb->h.raw = skb->data; | 542 | skb->h.raw = skb->data; |
| 543 | 543 | ||
| 544 | cb->dst = *(dn_address *)ptr; | 544 | cb->dst = *(__le16 *)ptr; |
| 545 | ptr += 2; | 545 | ptr += 2; |
| 546 | cb->src = *(dn_address *)ptr; | 546 | cb->src = *(__le16 *)ptr; |
| 547 | ptr += 2; | 547 | ptr += 2; |
| 548 | cb->hops = *ptr & 0x3f; | 548 | cb->hops = *ptr & 0x3f; |
| 549 | 549 | ||
| @@ -575,7 +575,7 @@ int dn_route_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type | |||
| 575 | { | 575 | { |
| 576 | struct dn_skb_cb *cb; | 576 | struct dn_skb_cb *cb; |
| 577 | unsigned char flags = 0; | 577 | unsigned char flags = 0; |
| 578 | __u16 len = dn_ntohs(*(__u16 *)skb->data); | 578 | __u16 len = dn_ntohs(*(__le16 *)skb->data); |
| 579 | struct dn_dev *dn = (struct dn_dev *)dev->dn_ptr; | 579 | struct dn_dev *dn = (struct dn_dev *)dev->dn_ptr; |
| 580 | unsigned char padlen = 0; | 580 | unsigned char padlen = 0; |
| 581 | 581 | ||
| @@ -782,7 +782,7 @@ static int dn_rt_bug(struct sk_buff *skb) | |||
| 782 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 782 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
| 783 | 783 | ||
| 784 | printk(KERN_DEBUG "dn_rt_bug: skb from:%04x to:%04x\n", | 784 | printk(KERN_DEBUG "dn_rt_bug: skb from:%04x to:%04x\n", |
| 785 | cb->src, cb->dst); | 785 | dn_ntohs(cb->src), dn_ntohs(cb->dst)); |
| 786 | } | 786 | } |
| 787 | 787 | ||
| 788 | kfree_skb(skb); | 788 | kfree_skb(skb); |
| @@ -823,7 +823,7 @@ static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res) | |||
| 823 | return 0; | 823 | return 0; |
| 824 | } | 824 | } |
| 825 | 825 | ||
| 826 | static inline int dn_match_addr(__u16 addr1, __u16 addr2) | 826 | static inline int dn_match_addr(__le16 addr1, __le16 addr2) |
| 827 | { | 827 | { |
| 828 | __u16 tmp = dn_ntohs(addr1) ^ dn_ntohs(addr2); | 828 | __u16 tmp = dn_ntohs(addr1) ^ dn_ntohs(addr2); |
| 829 | int match = 16; | 829 | int match = 16; |
| @@ -834,9 +834,9 @@ static inline int dn_match_addr(__u16 addr1, __u16 addr2) | |||
| 834 | return match; | 834 | return match; |
| 835 | } | 835 | } |
| 836 | 836 | ||
| 837 | static __u16 dnet_select_source(const struct net_device *dev, __u16 daddr, int scope) | 837 | static __le16 dnet_select_source(const struct net_device *dev, __le16 daddr, int scope) |
| 838 | { | 838 | { |
| 839 | __u16 saddr = 0; | 839 | __le16 saddr = 0; |
| 840 | struct dn_dev *dn_db = dev->dn_ptr; | 840 | struct dn_dev *dn_db = dev->dn_ptr; |
| 841 | struct dn_ifaddr *ifa; | 841 | struct dn_ifaddr *ifa; |
| 842 | int best_match = 0; | 842 | int best_match = 0; |
| @@ -861,14 +861,14 @@ static __u16 dnet_select_source(const struct net_device *dev, __u16 daddr, int s | |||
| 861 | return saddr; | 861 | return saddr; |
| 862 | } | 862 | } |
| 863 | 863 | ||
| 864 | static inline __u16 __dn_fib_res_prefsrc(struct dn_fib_res *res) | 864 | static inline __le16 __dn_fib_res_prefsrc(struct dn_fib_res *res) |
| 865 | { | 865 | { |
| 866 | return dnet_select_source(DN_FIB_RES_DEV(*res), DN_FIB_RES_GW(*res), res->scope); | 866 | return dnet_select_source(DN_FIB_RES_DEV(*res), DN_FIB_RES_GW(*res), res->scope); |
| 867 | } | 867 | } |
| 868 | 868 | ||
| 869 | static inline __u16 dn_fib_rules_map_destination(__u16 daddr, struct dn_fib_res *res) | 869 | static inline __le16 dn_fib_rules_map_destination(__le16 daddr, struct dn_fib_res *res) |
| 870 | { | 870 | { |
| 871 | __u16 mask = dnet_make_mask(res->prefixlen); | 871 | __le16 mask = dnet_make_mask(res->prefixlen); |
| 872 | return (daddr&~mask)|res->fi->fib_nh->nh_gw; | 872 | return (daddr&~mask)|res->fi->fib_nh->nh_gw; |
| 873 | } | 873 | } |
| 874 | 874 | ||
| @@ -892,12 +892,13 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old | |||
| 892 | struct dn_fib_res res = { .fi = NULL, .type = RTN_UNICAST }; | 892 | struct dn_fib_res res = { .fi = NULL, .type = RTN_UNICAST }; |
| 893 | int err; | 893 | int err; |
| 894 | int free_res = 0; | 894 | int free_res = 0; |
| 895 | __u16 gateway = 0; | 895 | __le16 gateway = 0; |
| 896 | 896 | ||
| 897 | if (decnet_debug_level & 16) | 897 | if (decnet_debug_level & 16) |
| 898 | printk(KERN_DEBUG | 898 | printk(KERN_DEBUG |
| 899 | "dn_route_output_slow: dst=%04x src=%04x mark=%d" | 899 | "dn_route_output_slow: dst=%04x src=%04x mark=%d" |
| 900 | " iif=%d oif=%d\n", oldflp->fld_dst, oldflp->fld_src, | 900 | " iif=%d oif=%d\n", dn_ntohs(oldflp->fld_dst), |
| 901 | dn_ntohs(oldflp->fld_src), | ||
| 901 | oldflp->fld_fwmark, loopback_dev.ifindex, oldflp->oif); | 902 | oldflp->fld_fwmark, loopback_dev.ifindex, oldflp->oif); |
| 902 | 903 | ||
| 903 | /* If we have an output interface, verify its a DECnet device */ | 904 | /* If we have an output interface, verify its a DECnet device */ |
| @@ -961,8 +962,9 @@ source_ok: | |||
| 961 | if (decnet_debug_level & 16) | 962 | if (decnet_debug_level & 16) |
| 962 | printk(KERN_DEBUG | 963 | printk(KERN_DEBUG |
| 963 | "dn_route_output_slow: initial checks complete." | 964 | "dn_route_output_slow: initial checks complete." |
| 964 | " dst=%o4x src=%04x oif=%d try_hard=%d\n", fl.fld_dst, | 965 | " dst=%o4x src=%04x oif=%d try_hard=%d\n", |
| 965 | fl.fld_src, fl.oif, try_hard); | 966 | dn_ntohs(fl.fld_dst), dn_ntohs(fl.fld_src), |
| 967 | fl.oif, try_hard); | ||
| 966 | 968 | ||
| 967 | /* | 969 | /* |
| 968 | * N.B. If the kernel is compiled without router support then | 970 | * N.B. If the kernel is compiled without router support then |
| @@ -1218,8 +1220,8 @@ static int dn_route_input_slow(struct sk_buff *skb) | |||
| 1218 | struct neighbour *neigh = NULL; | 1220 | struct neighbour *neigh = NULL; |
| 1219 | unsigned hash; | 1221 | unsigned hash; |
| 1220 | int flags = 0; | 1222 | int flags = 0; |
| 1221 | __u16 gateway = 0; | 1223 | __le16 gateway = 0; |
| 1222 | __u16 local_src = 0; | 1224 | __le16 local_src = 0; |
| 1223 | struct flowi fl = { .nl_u = { .dn_u = | 1225 | struct flowi fl = { .nl_u = { .dn_u = |
| 1224 | { .daddr = cb->dst, | 1226 | { .daddr = cb->dst, |
| 1225 | .saddr = cb->src, | 1227 | .saddr = cb->src, |
| @@ -1266,7 +1268,7 @@ static int dn_route_input_slow(struct sk_buff *skb) | |||
| 1266 | res.type = RTN_LOCAL; | 1268 | res.type = RTN_LOCAL; |
| 1267 | flags |= RTCF_DIRECTSRC; | 1269 | flags |= RTCF_DIRECTSRC; |
| 1268 | } else { | 1270 | } else { |
| 1269 | __u16 src_map = fl.fld_src; | 1271 | __le16 src_map = fl.fld_src; |
| 1270 | free_res = 1; | 1272 | free_res = 1; |
| 1271 | 1273 | ||
| 1272 | out_dev = DN_FIB_RES_DEV(res); | 1274 | out_dev = DN_FIB_RES_DEV(res); |
diff --git a/net/decnet/dn_rules.c b/net/decnet/dn_rules.c index 1060de70bc0c..446faafe2065 100644 --- a/net/decnet/dn_rules.c +++ b/net/decnet/dn_rules.c | |||
| @@ -27,6 +27,8 @@ | |||
| 27 | #include <linux/timer.h> | 27 | #include <linux/timer.h> |
| 28 | #include <linux/spinlock.h> | 28 | #include <linux/spinlock.h> |
| 29 | #include <linux/in_route.h> | 29 | #include <linux/in_route.h> |
| 30 | #include <linux/list.h> | ||
| 31 | #include <linux/rcupdate.h> | ||
| 30 | #include <asm/atomic.h> | 32 | #include <asm/atomic.h> |
| 31 | #include <asm/uaccess.h> | 33 | #include <asm/uaccess.h> |
| 32 | #include <net/neighbour.h> | 34 | #include <net/neighbour.h> |
| @@ -39,18 +41,18 @@ | |||
| 39 | 41 | ||
| 40 | struct dn_fib_rule | 42 | struct dn_fib_rule |
| 41 | { | 43 | { |
| 42 | struct dn_fib_rule *r_next; | 44 | struct hlist_node r_hlist; |
| 43 | atomic_t r_clntref; | 45 | atomic_t r_clntref; |
| 44 | u32 r_preference; | 46 | u32 r_preference; |
| 45 | unsigned char r_table; | 47 | unsigned char r_table; |
| 46 | unsigned char r_action; | 48 | unsigned char r_action; |
| 47 | unsigned char r_dst_len; | 49 | unsigned char r_dst_len; |
| 48 | unsigned char r_src_len; | 50 | unsigned char r_src_len; |
| 49 | dn_address r_src; | 51 | __le16 r_src; |
| 50 | dn_address r_srcmask; | 52 | __le16 r_srcmask; |
| 51 | dn_address r_dst; | 53 | __le16 r_dst; |
| 52 | dn_address r_dstmask; | 54 | __le16 r_dstmask; |
| 53 | dn_address r_srcmap; | 55 | __le16 r_srcmap; |
| 54 | u8 r_flags; | 56 | u8 r_flags; |
| 55 | #ifdef CONFIG_DECNET_ROUTE_FWMARK | 57 | #ifdef CONFIG_DECNET_ROUTE_FWMARK |
| 56 | u32 r_fwmark; | 58 | u32 r_fwmark; |
| @@ -58,6 +60,7 @@ struct dn_fib_rule | |||
| 58 | int r_ifindex; | 60 | int r_ifindex; |
| 59 | char r_ifname[IFNAMSIZ]; | 61 | char r_ifname[IFNAMSIZ]; |
| 60 | int r_dead; | 62 | int r_dead; |
| 63 | struct rcu_head rcu; | ||
| 61 | }; | 64 | }; |
| 62 | 65 | ||
| 63 | static struct dn_fib_rule default_rule = { | 66 | static struct dn_fib_rule default_rule = { |
| @@ -67,18 +70,17 @@ static struct dn_fib_rule default_rule = { | |||
| 67 | .r_action = RTN_UNICAST | 70 | .r_action = RTN_UNICAST |
| 68 | }; | 71 | }; |
| 69 | 72 | ||
| 70 | static struct dn_fib_rule *dn_fib_rules = &default_rule; | 73 | static struct hlist_head dn_fib_rules; |
| 71 | static DEFINE_RWLOCK(dn_fib_rules_lock); | ||
| 72 | |||
| 73 | 74 | ||
| 74 | int dn_fib_rtm_delrule(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | 75 | int dn_fib_rtm_delrule(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) |
| 75 | { | 76 | { |
| 76 | struct rtattr **rta = arg; | 77 | struct rtattr **rta = arg; |
| 77 | struct rtmsg *rtm = NLMSG_DATA(nlh); | 78 | struct rtmsg *rtm = NLMSG_DATA(nlh); |
| 78 | struct dn_fib_rule *r, **rp; | 79 | struct dn_fib_rule *r; |
| 80 | struct hlist_node *node; | ||
| 79 | int err = -ESRCH; | 81 | int err = -ESRCH; |
| 80 | 82 | ||
| 81 | for(rp=&dn_fib_rules; (r=*rp) != NULL; rp = &r->r_next) { | 83 | hlist_for_each_entry(r, node, &dn_fib_rules, r_hlist) { |
| 82 | if ((!rta[RTA_SRC-1] || memcmp(RTA_DATA(rta[RTA_SRC-1]), &r->r_src, 2) == 0) && | 84 | if ((!rta[RTA_SRC-1] || memcmp(RTA_DATA(rta[RTA_SRC-1]), &r->r_src, 2) == 0) && |
| 83 | rtm->rtm_src_len == r->r_src_len && | 85 | rtm->rtm_src_len == r->r_src_len && |
| 84 | rtm->rtm_dst_len == r->r_dst_len && | 86 | rtm->rtm_dst_len == r->r_dst_len && |
| @@ -95,10 +97,8 @@ int dn_fib_rtm_delrule(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
| 95 | if (r == &default_rule) | 97 | if (r == &default_rule) |
| 96 | break; | 98 | break; |
| 97 | 99 | ||
| 98 | write_lock_bh(&dn_fib_rules_lock); | 100 | hlist_del_rcu(&r->r_hlist); |
| 99 | *rp = r->r_next; | ||
| 100 | r->r_dead = 1; | 101 | r->r_dead = 1; |
| 101 | write_unlock_bh(&dn_fib_rules_lock); | ||
| 102 | dn_fib_rule_put(r); | 102 | dn_fib_rule_put(r); |
| 103 | err = 0; | 103 | err = 0; |
| 104 | break; | 104 | break; |
| @@ -108,11 +108,17 @@ int dn_fib_rtm_delrule(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
| 108 | return err; | 108 | return err; |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | static inline void dn_fib_rule_put_rcu(struct rcu_head *head) | ||
| 112 | { | ||
| 113 | struct dn_fib_rule *r = container_of(head, struct dn_fib_rule, rcu); | ||
| 114 | kfree(r); | ||
| 115 | } | ||
| 116 | |||
| 111 | void dn_fib_rule_put(struct dn_fib_rule *r) | 117 | void dn_fib_rule_put(struct dn_fib_rule *r) |
| 112 | { | 118 | { |
| 113 | if (atomic_dec_and_test(&r->r_clntref)) { | 119 | if (atomic_dec_and_test(&r->r_clntref)) { |
| 114 | if (r->r_dead) | 120 | if (r->r_dead) |
| 115 | kfree(r); | 121 | call_rcu(&r->rcu, dn_fib_rule_put_rcu); |
| 116 | else | 122 | else |
| 117 | printk(KERN_DEBUG "Attempt to free alive dn_fib_rule\n"); | 123 | printk(KERN_DEBUG "Attempt to free alive dn_fib_rule\n"); |
| 118 | } | 124 | } |
| @@ -123,7 +129,8 @@ int dn_fib_rtm_newrule(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
| 123 | { | 129 | { |
| 124 | struct rtattr **rta = arg; | 130 | struct rtattr **rta = arg; |
| 125 | struct rtmsg *rtm = NLMSG_DATA(nlh); | 131 | struct rtmsg *rtm = NLMSG_DATA(nlh); |
| 126 | struct dn_fib_rule *r, *new_r, **rp; | 132 | struct dn_fib_rule *r, *new_r, *last = NULL; |
| 133 | struct hlist_node *node = NULL; | ||
| 127 | unsigned char table_id; | 134 | unsigned char table_id; |
| 128 | 135 | ||
| 129 | if (rtm->rtm_src_len > 16 || rtm->rtm_dst_len > 16) | 136 | if (rtm->rtm_src_len > 16 || rtm->rtm_dst_len > 16) |
| @@ -149,6 +156,7 @@ int dn_fib_rtm_newrule(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
| 149 | if (!new_r) | 156 | if (!new_r) |
| 150 | return -ENOMEM; | 157 | return -ENOMEM; |
| 151 | memset(new_r, 0, sizeof(*new_r)); | 158 | memset(new_r, 0, sizeof(*new_r)); |
| 159 | |||
| 152 | if (rta[RTA_SRC-1]) | 160 | if (rta[RTA_SRC-1]) |
| 153 | memcpy(&new_r->r_src, RTA_DATA(rta[RTA_SRC-1]), 2); | 161 | memcpy(&new_r->r_src, RTA_DATA(rta[RTA_SRC-1]), 2); |
| 154 | if (rta[RTA_DST-1]) | 162 | if (rta[RTA_DST-1]) |
| @@ -179,27 +187,26 @@ int dn_fib_rtm_newrule(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
| 179 | } | 187 | } |
| 180 | } | 188 | } |
| 181 | 189 | ||
| 182 | rp = &dn_fib_rules; | 190 | r = container_of(dn_fib_rules.first, struct dn_fib_rule, r_hlist); |
| 183 | if (!new_r->r_preference) { | 191 | if (!new_r->r_preference) { |
| 184 | r = dn_fib_rules; | 192 | if (r && r->r_hlist.next != NULL) { |
| 185 | if (r && (r = r->r_next) != NULL) { | 193 | r = container_of(r->r_hlist.next, struct dn_fib_rule, r_hlist); |
| 186 | rp = &dn_fib_rules->r_next; | ||
| 187 | if (r->r_preference) | 194 | if (r->r_preference) |
| 188 | new_r->r_preference = r->r_preference - 1; | 195 | new_r->r_preference = r->r_preference - 1; |
| 189 | } | 196 | } |
| 190 | } | 197 | } |
| 191 | 198 | ||
| 192 | while((r=*rp) != NULL) { | 199 | hlist_for_each_entry(r, node, &dn_fib_rules, r_hlist) { |
| 193 | if (r->r_preference > new_r->r_preference) | 200 | if (r->r_preference > new_r->r_preference) |
| 194 | break; | 201 | break; |
| 195 | rp = &r->r_next; | 202 | last = r; |
| 196 | } | 203 | } |
| 197 | |||
| 198 | new_r->r_next = r; | ||
| 199 | atomic_inc(&new_r->r_clntref); | 204 | atomic_inc(&new_r->r_clntref); |
| 200 | write_lock_bh(&dn_fib_rules_lock); | 205 | |
| 201 | *rp = new_r; | 206 | if (last) |
| 202 | write_unlock_bh(&dn_fib_rules_lock); | 207 | hlist_add_after_rcu(&last->r_hlist, &new_r->r_hlist); |
| 208 | else | ||
| 209 | hlist_add_before_rcu(&new_r->r_hlist, &r->r_hlist); | ||
| 203 | return 0; | 210 | return 0; |
| 204 | } | 211 | } |
| 205 | 212 | ||
| @@ -208,12 +215,14 @@ int dn_fib_lookup(const struct flowi *flp, struct dn_fib_res *res) | |||
| 208 | { | 215 | { |
| 209 | struct dn_fib_rule *r, *policy; | 216 | struct dn_fib_rule *r, *policy; |
| 210 | struct dn_fib_table *tb; | 217 | struct dn_fib_table *tb; |
| 211 | dn_address saddr = flp->fld_src; | 218 | __le16 saddr = flp->fld_src; |
| 212 | dn_address daddr = flp->fld_dst; | 219 | __le16 daddr = flp->fld_dst; |
| 220 | struct hlist_node *node; | ||
| 213 | int err; | 221 | int err; |
| 214 | 222 | ||
| 215 | read_lock(&dn_fib_rules_lock); | 223 | rcu_read_lock(); |
| 216 | for(r = dn_fib_rules; r; r = r->r_next) { | 224 | |
| 225 | hlist_for_each_entry_rcu(r, node, &dn_fib_rules, r_hlist) { | ||
| 217 | if (((saddr^r->r_src) & r->r_srcmask) || | 226 | if (((saddr^r->r_src) & r->r_srcmask) || |
| 218 | ((daddr^r->r_dst) & r->r_dstmask) || | 227 | ((daddr^r->r_dst) & r->r_dstmask) || |
| 219 | #ifdef CONFIG_DECNET_ROUTE_FWMARK | 228 | #ifdef CONFIG_DECNET_ROUTE_FWMARK |
| @@ -228,14 +237,14 @@ int dn_fib_lookup(const struct flowi *flp, struct dn_fib_res *res) | |||
| 228 | policy = r; | 237 | policy = r; |
| 229 | break; | 238 | break; |
| 230 | case RTN_UNREACHABLE: | 239 | case RTN_UNREACHABLE: |
| 231 | read_unlock(&dn_fib_rules_lock); | 240 | rcu_read_unlock(); |
| 232 | return -ENETUNREACH; | 241 | return -ENETUNREACH; |
| 233 | default: | 242 | default: |
| 234 | case RTN_BLACKHOLE: | 243 | case RTN_BLACKHOLE: |
| 235 | read_unlock(&dn_fib_rules_lock); | 244 | rcu_read_unlock(); |
| 236 | return -EINVAL; | 245 | return -EINVAL; |
| 237 | case RTN_PROHIBIT: | 246 | case RTN_PROHIBIT: |
| 238 | read_unlock(&dn_fib_rules_lock); | 247 | rcu_read_unlock(); |
| 239 | return -EACCES; | 248 | return -EACCES; |
| 240 | } | 249 | } |
| 241 | 250 | ||
| @@ -246,20 +255,20 @@ int dn_fib_lookup(const struct flowi *flp, struct dn_fib_res *res) | |||
| 246 | res->r = policy; | 255 | res->r = policy; |
| 247 | if (policy) | 256 | if (policy) |
| 248 | atomic_inc(&policy->r_clntref); | 257 | atomic_inc(&policy->r_clntref); |
| 249 | read_unlock(&dn_fib_rules_lock); | 258 | rcu_read_unlock(); |
| 250 | return 0; | 259 | return 0; |
| 251 | } | 260 | } |
| 252 | if (err < 0 && err != -EAGAIN) { | 261 | if (err < 0 && err != -EAGAIN) { |
| 253 | read_unlock(&dn_fib_rules_lock); | 262 | rcu_read_unlock(); |
| 254 | return err; | 263 | return err; |
| 255 | } | 264 | } |
| 256 | } | 265 | } |
| 257 | 266 | ||
| 258 | read_unlock(&dn_fib_rules_lock); | 267 | rcu_read_unlock(); |
| 259 | return -ESRCH; | 268 | return -ESRCH; |
| 260 | } | 269 | } |
| 261 | 270 | ||
| 262 | unsigned dnet_addr_type(__u16 addr) | 271 | unsigned dnet_addr_type(__le16 addr) |
| 263 | { | 272 | { |
| 264 | struct flowi fl = { .nl_u = { .dn_u = { .daddr = addr } } }; | 273 | struct flowi fl = { .nl_u = { .dn_u = { .daddr = addr } } }; |
| 265 | struct dn_fib_res res; | 274 | struct dn_fib_res res; |
| @@ -277,7 +286,7 @@ unsigned dnet_addr_type(__u16 addr) | |||
| 277 | return ret; | 286 | return ret; |
| 278 | } | 287 | } |
| 279 | 288 | ||
| 280 | __u16 dn_fib_rules_policy(__u16 saddr, struct dn_fib_res *res, unsigned *flags) | 289 | __le16 dn_fib_rules_policy(__le16 saddr, struct dn_fib_res *res, unsigned *flags) |
| 281 | { | 290 | { |
| 282 | struct dn_fib_rule *r = res->r; | 291 | struct dn_fib_rule *r = res->r; |
| 283 | 292 | ||
| @@ -297,27 +306,23 @@ __u16 dn_fib_rules_policy(__u16 saddr, struct dn_fib_res *res, unsigned *flags) | |||
| 297 | 306 | ||
| 298 | static void dn_fib_rules_detach(struct net_device *dev) | 307 | static void dn_fib_rules_detach(struct net_device *dev) |
| 299 | { | 308 | { |
| 309 | struct hlist_node *node; | ||
| 300 | struct dn_fib_rule *r; | 310 | struct dn_fib_rule *r; |
| 301 | 311 | ||
| 302 | for(r = dn_fib_rules; r; r = r->r_next) { | 312 | hlist_for_each_entry(r, node, &dn_fib_rules, r_hlist) { |
| 303 | if (r->r_ifindex == dev->ifindex) { | 313 | if (r->r_ifindex == dev->ifindex) |
| 304 | write_lock_bh(&dn_fib_rules_lock); | ||
| 305 | r->r_ifindex = -1; | 314 | r->r_ifindex = -1; |
| 306 | write_unlock_bh(&dn_fib_rules_lock); | ||
| 307 | } | ||
| 308 | } | 315 | } |
| 309 | } | 316 | } |
| 310 | 317 | ||
| 311 | static void dn_fib_rules_attach(struct net_device *dev) | 318 | static void dn_fib_rules_attach(struct net_device *dev) |
| 312 | { | 319 | { |
| 320 | struct hlist_node *node; | ||
| 313 | struct dn_fib_rule *r; | 321 | struct dn_fib_rule *r; |
| 314 | 322 | ||
| 315 | for(r = dn_fib_rules; r; r = r->r_next) { | 323 | hlist_for_each_entry(r, node, &dn_fib_rules, r_hlist) { |
| 316 | if (r->r_ifindex == -1 && strcmp(dev->name, r->r_ifname) == 0) { | 324 | if (r->r_ifindex == -1 && strcmp(dev->name, r->r_ifname) == 0) |
| 317 | write_lock_bh(&dn_fib_rules_lock); | ||
| 318 | r->r_ifindex = dev->ifindex; | 325 | r->r_ifindex = dev->ifindex; |
| 319 | write_unlock_bh(&dn_fib_rules_lock); | ||
| 320 | } | ||
| 321 | } | 326 | } |
| 322 | } | 327 | } |
| 323 | 328 | ||
| @@ -387,18 +392,20 @@ rtattr_failure: | |||
| 387 | 392 | ||
| 388 | int dn_fib_dump_rules(struct sk_buff *skb, struct netlink_callback *cb) | 393 | int dn_fib_dump_rules(struct sk_buff *skb, struct netlink_callback *cb) |
| 389 | { | 394 | { |
| 390 | int idx; | 395 | int idx = 0; |
| 391 | int s_idx = cb->args[0]; | 396 | int s_idx = cb->args[0]; |
| 392 | struct dn_fib_rule *r; | 397 | struct dn_fib_rule *r; |
| 398 | struct hlist_node *node; | ||
| 393 | 399 | ||
| 394 | read_lock(&dn_fib_rules_lock); | 400 | rcu_read_lock(); |
| 395 | for(r = dn_fib_rules, idx = 0; r; r = r->r_next, idx++) { | 401 | hlist_for_each_entry(r, node, &dn_fib_rules, r_hlist) { |
| 396 | if (idx < s_idx) | 402 | if (idx < s_idx) |
| 397 | continue; | 403 | continue; |
| 398 | if (dn_fib_fill_rule(skb, r, cb, NLM_F_MULTI) < 0) | 404 | if (dn_fib_fill_rule(skb, r, cb, NLM_F_MULTI) < 0) |
| 399 | break; | 405 | break; |
| 406 | idx++; | ||
| 400 | } | 407 | } |
| 401 | read_unlock(&dn_fib_rules_lock); | 408 | rcu_read_unlock(); |
| 402 | cb->args[0] = idx; | 409 | cb->args[0] = idx; |
| 403 | 410 | ||
| 404 | return skb->len; | 411 | return skb->len; |
| @@ -406,6 +413,8 @@ int dn_fib_dump_rules(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 406 | 413 | ||
| 407 | void __init dn_fib_rules_init(void) | 414 | void __init dn_fib_rules_init(void) |
| 408 | { | 415 | { |
| 416 | INIT_HLIST_HEAD(&dn_fib_rules); | ||
| 417 | hlist_add_head(&default_rule.r_hlist, &dn_fib_rules); | ||
| 409 | register_netdevice_notifier(&dn_fib_rules_notifier); | 418 | register_netdevice_notifier(&dn_fib_rules_notifier); |
| 410 | } | 419 | } |
| 411 | 420 | ||
diff --git a/net/decnet/dn_table.c b/net/decnet/dn_table.c index 6f8b5658cb4e..0ebc46af1bdd 100644 --- a/net/decnet/dn_table.c +++ b/net/decnet/dn_table.c | |||
| @@ -46,7 +46,7 @@ struct dn_zone | |||
| 46 | u32 dz_hashmask; | 46 | u32 dz_hashmask; |
| 47 | #define DZ_HASHMASK(dz) ((dz)->dz_hashmask) | 47 | #define DZ_HASHMASK(dz) ((dz)->dz_hashmask) |
| 48 | int dz_order; | 48 | int dz_order; |
| 49 | u16 dz_mask; | 49 | __le16 dz_mask; |
| 50 | #define DZ_MASK(dz) ((dz)->dz_mask) | 50 | #define DZ_MASK(dz) ((dz)->dz_mask) |
| 51 | }; | 51 | }; |
| 52 | 52 | ||
| @@ -84,14 +84,14 @@ static int dn_fib_hash_zombies; | |||
| 84 | 84 | ||
| 85 | static inline dn_fib_idx_t dn_hash(dn_fib_key_t key, struct dn_zone *dz) | 85 | static inline dn_fib_idx_t dn_hash(dn_fib_key_t key, struct dn_zone *dz) |
| 86 | { | 86 | { |
| 87 | u16 h = ntohs(key.datum)>>(16 - dz->dz_order); | 87 | u16 h = dn_ntohs(key.datum)>>(16 - dz->dz_order); |
| 88 | h ^= (h >> 10); | 88 | h ^= (h >> 10); |
| 89 | h ^= (h >> 6); | 89 | h ^= (h >> 6); |
| 90 | h &= DZ_HASHMASK(dz); | 90 | h &= DZ_HASHMASK(dz); |
| 91 | return *(dn_fib_idx_t *)&h; | 91 | return *(dn_fib_idx_t *)&h; |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | static inline dn_fib_key_t dz_key(u16 dst, struct dn_zone *dz) | 94 | static inline dn_fib_key_t dz_key(__le16 dst, struct dn_zone *dz) |
| 95 | { | 95 | { |
| 96 | dn_fib_key_t k; | 96 | dn_fib_key_t k; |
| 97 | k.datum = dst & DZ_MASK(dz); | 97 | k.datum = dst & DZ_MASK(dz); |
| @@ -250,7 +250,7 @@ static int dn_fib_nh_match(struct rtmsg *r, struct nlmsghdr *nlh, struct dn_kern | |||
| 250 | 250 | ||
| 251 | for_nexthops(fi) { | 251 | for_nexthops(fi) { |
| 252 | int attrlen = nhlen - sizeof(struct rtnexthop); | 252 | int attrlen = nhlen - sizeof(struct rtnexthop); |
| 253 | dn_address gw; | 253 | __le16 gw; |
| 254 | 254 | ||
| 255 | if (attrlen < 0 || (nhlen -= nhp->rtnh_len) < 0) | 255 | if (attrlen < 0 || (nhlen -= nhp->rtnh_len) < 0) |
| 256 | return -EINVAL; | 256 | return -EINVAL; |
| @@ -457,7 +457,7 @@ static int dn_fib_table_insert(struct dn_fib_table *tb, struct rtmsg *r, struct | |||
| 457 | 457 | ||
| 458 | dz_key_0(key); | 458 | dz_key_0(key); |
| 459 | if (rta->rta_dst) { | 459 | if (rta->rta_dst) { |
| 460 | dn_address dst; | 460 | __le16 dst; |
| 461 | memcpy(&dst, rta->rta_dst, 2); | 461 | memcpy(&dst, rta->rta_dst, 2); |
| 462 | if (dst & ~DZ_MASK(dz)) | 462 | if (dst & ~DZ_MASK(dz)) |
| 463 | return -EINVAL; | 463 | return -EINVAL; |
| @@ -593,7 +593,7 @@ static int dn_fib_table_delete(struct dn_fib_table *tb, struct rtmsg *r, struct | |||
| 593 | 593 | ||
| 594 | dz_key_0(key); | 594 | dz_key_0(key); |
| 595 | if (rta->rta_dst) { | 595 | if (rta->rta_dst) { |
| 596 | dn_address dst; | 596 | __le16 dst; |
| 597 | memcpy(&dst, rta->rta_dst, 2); | 597 | memcpy(&dst, rta->rta_dst, 2); |
| 598 | if (dst & ~DZ_MASK(dz)) | 598 | if (dst & ~DZ_MASK(dz)) |
| 599 | return -EINVAL; | 599 | return -EINVAL; |
diff --git a/net/decnet/sysctl_net_decnet.c b/net/decnet/sysctl_net_decnet.c index 0e9d2c571165..bda5920215fd 100644 --- a/net/decnet/sysctl_net_decnet.c +++ b/net/decnet/sysctl_net_decnet.c | |||
| @@ -86,9 +86,9 @@ static void strip_it(char *str) | |||
| 86 | * Simple routine to parse an ascii DECnet address | 86 | * Simple routine to parse an ascii DECnet address |
| 87 | * into a network order address. | 87 | * into a network order address. |
| 88 | */ | 88 | */ |
| 89 | static int parse_addr(dn_address *addr, char *str) | 89 | static int parse_addr(__le16 *addr, char *str) |
| 90 | { | 90 | { |
| 91 | dn_address area, node; | 91 | __u16 area, node; |
| 92 | 92 | ||
| 93 | while(*str && !ISNUM(*str)) str++; | 93 | while(*str && !ISNUM(*str)) str++; |
| 94 | 94 | ||
| @@ -139,7 +139,7 @@ static int dn_node_address_strategy(ctl_table *table, int __user *name, int nlen | |||
| 139 | void **context) | 139 | void **context) |
| 140 | { | 140 | { |
| 141 | size_t len; | 141 | size_t len; |
| 142 | dn_address addr; | 142 | __le16 addr; |
| 143 | 143 | ||
| 144 | if (oldval && oldlenp) { | 144 | if (oldval && oldlenp) { |
| 145 | if (get_user(len, oldlenp)) | 145 | if (get_user(len, oldlenp)) |
| @@ -147,14 +147,14 @@ static int dn_node_address_strategy(ctl_table *table, int __user *name, int nlen | |||
| 147 | if (len) { | 147 | if (len) { |
| 148 | if (len != sizeof(unsigned short)) | 148 | if (len != sizeof(unsigned short)) |
| 149 | return -EINVAL; | 149 | return -EINVAL; |
| 150 | if (put_user(decnet_address, (unsigned short __user *)oldval)) | 150 | if (put_user(decnet_address, (__le16 __user *)oldval)) |
| 151 | return -EFAULT; | 151 | return -EFAULT; |
| 152 | } | 152 | } |
| 153 | } | 153 | } |
| 154 | if (newval && newlen) { | 154 | if (newval && newlen) { |
| 155 | if (newlen != sizeof(unsigned short)) | 155 | if (newlen != sizeof(unsigned short)) |
| 156 | return -EINVAL; | 156 | return -EINVAL; |
| 157 | if (get_user(addr, (unsigned short __user *)newval)) | 157 | if (get_user(addr, (__le16 __user *)newval)) |
| 158 | return -EFAULT; | 158 | return -EFAULT; |
| 159 | 159 | ||
| 160 | dn_dev_devices_off(); | 160 | dn_dev_devices_off(); |
| @@ -173,7 +173,7 @@ static int dn_node_address_handler(ctl_table *table, int write, | |||
| 173 | { | 173 | { |
| 174 | char addr[DN_ASCBUF_LEN]; | 174 | char addr[DN_ASCBUF_LEN]; |
| 175 | size_t len; | 175 | size_t len; |
| 176 | dn_address dnaddr; | 176 | __le16 dnaddr; |
| 177 | 177 | ||
| 178 | if (!*lenp || (*ppos && !write)) { | 178 | if (!*lenp || (*ppos && !write)) { |
| 179 | *lenp = 0; | 179 | *lenp = 0; |
