0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094 #include <linux/module.h>
0095 #include <linux/errno.h>
0096 #include <linux/types.h>
0097 #include <linux/slab.h>
0098 #include <linux/socket.h>
0099 #include <linux/in.h>
0100 #include <linux/kernel.h>
0101 #include <linux/sched/signal.h>
0102 #include <linux/timer.h>
0103 #include <linux/string.h>
0104 #include <linux/sockios.h>
0105 #include <linux/net.h>
0106 #include <linux/netdevice.h>
0107 #include <linux/inet.h>
0108 #include <linux/route.h>
0109 #include <linux/netfilter.h>
0110 #include <linux/seq_file.h>
0111 #include <net/sock.h>
0112 #include <net/tcp_states.h>
0113 #include <net/flow.h>
0114 #include <asm/ioctls.h>
0115 #include <linux/capability.h>
0116 #include <linux/mm.h>
0117 #include <linux/interrupt.h>
0118 #include <linux/proc_fs.h>
0119 #include <linux/stat.h>
0120 #include <linux/init.h>
0121 #include <linux/poll.h>
0122 #include <linux/jiffies.h>
0123 #include <net/net_namespace.h>
0124 #include <net/neighbour.h>
0125 #include <net/dst.h>
0126 #include <net/fib_rules.h>
0127 #include <net/tcp.h>
0128 #include <net/dn.h>
0129 #include <net/dn_nsp.h>
0130 #include <net/dn_dev.h>
0131 #include <net/dn_route.h>
0132 #include <net/dn_fib.h>
0133 #include <net/dn_neigh.h>
0134
0135 struct dn_sock {
0136 struct sock sk;
0137 struct dn_scp scp;
0138 };
0139
0140 static void dn_keepalive(struct sock *sk);
0141
0142 #define DN_SK_HASH_SHIFT 8
0143 #define DN_SK_HASH_SIZE (1 << DN_SK_HASH_SHIFT)
0144 #define DN_SK_HASH_MASK (DN_SK_HASH_SIZE - 1)
0145
0146
0147 static const struct proto_ops dn_proto_ops;
0148 static DEFINE_RWLOCK(dn_hash_lock);
0149 static struct hlist_head dn_sk_hash[DN_SK_HASH_SIZE];
0150 static struct hlist_head dn_wild_sk;
0151 static atomic_long_t decnet_memory_allocated;
0152 static DEFINE_PER_CPU(int, decnet_memory_per_cpu_fw_alloc);
0153
0154 static int __dn_setsockopt(struct socket *sock, int level, int optname,
0155 sockptr_t optval, unsigned int optlen, int flags);
0156 static int __dn_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen, int flags);
0157
0158 static struct hlist_head *dn_find_list(struct sock *sk)
0159 {
0160 struct dn_scp *scp = DN_SK(sk);
0161
0162 if (scp->addr.sdn_flags & SDF_WILD)
0163 return hlist_empty(&dn_wild_sk) ? &dn_wild_sk : NULL;
0164
0165 return &dn_sk_hash[le16_to_cpu(scp->addrloc) & DN_SK_HASH_MASK];
0166 }
0167
0168
0169
0170
0171 static int check_port(__le16 port)
0172 {
0173 struct sock *sk;
0174
0175 if (port == 0)
0176 return -1;
0177
0178 sk_for_each(sk, &dn_sk_hash[le16_to_cpu(port) & DN_SK_HASH_MASK]) {
0179 struct dn_scp *scp = DN_SK(sk);
0180 if (scp->addrloc == port)
0181 return -1;
0182 }
0183 return 0;
0184 }
0185
0186 static unsigned short port_alloc(struct sock *sk)
0187 {
0188 struct dn_scp *scp = DN_SK(sk);
0189 static unsigned short port = 0x2000;
0190 unsigned short i_port = port;
0191
0192 while(check_port(cpu_to_le16(++port)) != 0) {
0193 if (port == i_port)
0194 return 0;
0195 }
0196
0197 scp->addrloc = cpu_to_le16(port);
0198
0199 return 1;
0200 }
0201
0202
0203
0204
0205
0206
0207 static int dn_hash_sock(struct sock *sk)
0208 {
0209 struct dn_scp *scp = DN_SK(sk);
0210 struct hlist_head *list;
0211 int rv = -EUSERS;
0212
0213 BUG_ON(sk_hashed(sk));
0214
0215 write_lock_bh(&dn_hash_lock);
0216
0217 if (!scp->addrloc && !port_alloc(sk))
0218 goto out;
0219
0220 rv = -EADDRINUSE;
0221 if ((list = dn_find_list(sk)) == NULL)
0222 goto out;
0223
0224 sk_add_node(sk, list);
0225 rv = 0;
0226 out:
0227 write_unlock_bh(&dn_hash_lock);
0228 return rv;
0229 }
0230
0231 static void dn_unhash_sock(struct sock *sk)
0232 {
0233 write_lock(&dn_hash_lock);
0234 sk_del_node_init(sk);
0235 write_unlock(&dn_hash_lock);
0236 }
0237
0238 static void dn_unhash_sock_bh(struct sock *sk)
0239 {
0240 write_lock_bh(&dn_hash_lock);
0241 sk_del_node_init(sk);
0242 write_unlock_bh(&dn_hash_lock);
0243 }
0244
0245 static struct hlist_head *listen_hash(struct sockaddr_dn *addr)
0246 {
0247 int i;
0248 unsigned int hash = addr->sdn_objnum;
0249
0250 if (hash == 0) {
0251 hash = addr->sdn_objnamel;
0252 for(i = 0; i < le16_to_cpu(addr->sdn_objnamel); i++) {
0253 hash ^= addr->sdn_objname[i];
0254 hash ^= (hash << 3);
0255 }
0256 }
0257
0258 return &dn_sk_hash[hash & DN_SK_HASH_MASK];
0259 }
0260
0261
0262
0263
0264
0265
0266 static void dn_rehash_sock(struct sock *sk)
0267 {
0268 struct hlist_head *list;
0269 struct dn_scp *scp = DN_SK(sk);
0270
0271 if (scp->addr.sdn_flags & SDF_WILD)
0272 return;
0273
0274 write_lock_bh(&dn_hash_lock);
0275 sk_del_node_init(sk);
0276 DN_SK(sk)->addrloc = 0;
0277 list = listen_hash(&DN_SK(sk)->addr);
0278 sk_add_node(sk, list);
0279 write_unlock_bh(&dn_hash_lock);
0280 }
0281
0282 int dn_sockaddr2username(struct sockaddr_dn *sdn, unsigned char *buf, unsigned char type)
0283 {
0284 int len = 2;
0285
0286 *buf++ = type;
0287
0288 switch (type) {
0289 case 0:
0290 *buf++ = sdn->sdn_objnum;
0291 break;
0292 case 1:
0293 *buf++ = 0;
0294 *buf++ = le16_to_cpu(sdn->sdn_objnamel);
0295 memcpy(buf, sdn->sdn_objname, le16_to_cpu(sdn->sdn_objnamel));
0296 len = 3 + le16_to_cpu(sdn->sdn_objnamel);
0297 break;
0298 case 2:
0299 memset(buf, 0, 5);
0300 buf += 5;
0301 *buf++ = le16_to_cpu(sdn->sdn_objnamel);
0302 memcpy(buf, sdn->sdn_objname, le16_to_cpu(sdn->sdn_objnamel));
0303 len = 7 + le16_to_cpu(sdn->sdn_objnamel);
0304 break;
0305 }
0306
0307 return len;
0308 }
0309
0310
0311
0312
0313
0314
0315
0316
0317 int dn_username2sockaddr(unsigned char *data, int len, struct sockaddr_dn *sdn, unsigned char *fmt)
0318 {
0319 unsigned char type;
0320 int size = len;
0321 int namel = 12;
0322
0323 sdn->sdn_objnum = 0;
0324 sdn->sdn_objnamel = cpu_to_le16(0);
0325 memset(sdn->sdn_objname, 0, DN_MAXOBJL);
0326
0327 if (len < 2)
0328 return -1;
0329
0330 len -= 2;
0331 *fmt = *data++;
0332 type = *data++;
0333
0334 switch (*fmt) {
0335 case 0:
0336 sdn->sdn_objnum = type;
0337 return 2;
0338 case 1:
0339 namel = 16;
0340 break;
0341 case 2:
0342 len -= 4;
0343 data += 4;
0344 break;
0345 case 4:
0346 len -= 8;
0347 data += 8;
0348 break;
0349 default:
0350 return -1;
0351 }
0352
0353 len -= 1;
0354
0355 if (len < 0)
0356 return -1;
0357
0358 sdn->sdn_objnamel = cpu_to_le16(*data++);
0359 len -= le16_to_cpu(sdn->sdn_objnamel);
0360
0361 if ((len < 0) || (le16_to_cpu(sdn->sdn_objnamel) > namel))
0362 return -1;
0363
0364 memcpy(sdn->sdn_objname, data, le16_to_cpu(sdn->sdn_objnamel));
0365
0366 return size - len;
0367 }
0368
0369 struct sock *dn_sklist_find_listener(struct sockaddr_dn *addr)
0370 {
0371 struct hlist_head *list = listen_hash(addr);
0372 struct sock *sk;
0373
0374 read_lock(&dn_hash_lock);
0375 sk_for_each(sk, list) {
0376 struct dn_scp *scp = DN_SK(sk);
0377 if (sk->sk_state != TCP_LISTEN)
0378 continue;
0379 if (scp->addr.sdn_objnum) {
0380 if (scp->addr.sdn_objnum != addr->sdn_objnum)
0381 continue;
0382 } else {
0383 if (addr->sdn_objnum)
0384 continue;
0385 if (scp->addr.sdn_objnamel != addr->sdn_objnamel)
0386 continue;
0387 if (memcmp(scp->addr.sdn_objname, addr->sdn_objname, le16_to_cpu(addr->sdn_objnamel)) != 0)
0388 continue;
0389 }
0390 sock_hold(sk);
0391 read_unlock(&dn_hash_lock);
0392 return sk;
0393 }
0394
0395 sk = sk_head(&dn_wild_sk);
0396 if (sk) {
0397 if (sk->sk_state == TCP_LISTEN)
0398 sock_hold(sk);
0399 else
0400 sk = NULL;
0401 }
0402
0403 read_unlock(&dn_hash_lock);
0404 return sk;
0405 }
0406
0407 struct sock *dn_find_by_skb(struct sk_buff *skb)
0408 {
0409 struct dn_skb_cb *cb = DN_SKB_CB(skb);
0410 struct sock *sk;
0411 struct dn_scp *scp;
0412
0413 read_lock(&dn_hash_lock);
0414 sk_for_each(sk, &dn_sk_hash[le16_to_cpu(cb->dst_port) & DN_SK_HASH_MASK]) {
0415 scp = DN_SK(sk);
0416 if (cb->src != dn_saddr2dn(&scp->peer))
0417 continue;
0418 if (cb->dst_port != scp->addrloc)
0419 continue;
0420 if (scp->addrrem && (cb->src_port != scp->addrrem))
0421 continue;
0422 sock_hold(sk);
0423 goto found;
0424 }
0425 sk = NULL;
0426 found:
0427 read_unlock(&dn_hash_lock);
0428 return sk;
0429 }
0430
0431
0432
0433 static void dn_destruct(struct sock *sk)
0434 {
0435 struct dn_scp *scp = DN_SK(sk);
0436
0437 skb_queue_purge(&scp->data_xmit_queue);
0438 skb_queue_purge(&scp->other_xmit_queue);
0439 skb_queue_purge(&scp->other_receive_queue);
0440
0441 dst_release(rcu_dereference_protected(sk->sk_dst_cache, 1));
0442 }
0443
0444 static unsigned long dn_memory_pressure;
0445
0446 static void dn_enter_memory_pressure(struct sock *sk)
0447 {
0448 if (!dn_memory_pressure) {
0449 dn_memory_pressure = 1;
0450 }
0451 }
0452
0453 static struct proto dn_proto = {
0454 .name = "NSP",
0455 .owner = THIS_MODULE,
0456 .enter_memory_pressure = dn_enter_memory_pressure,
0457 .memory_pressure = &dn_memory_pressure,
0458
0459 .memory_allocated = &decnet_memory_allocated,
0460 .per_cpu_fw_alloc = &decnet_memory_per_cpu_fw_alloc,
0461
0462 .sysctl_mem = sysctl_decnet_mem,
0463 .sysctl_wmem = sysctl_decnet_wmem,
0464 .sysctl_rmem = sysctl_decnet_rmem,
0465 .max_header = DN_MAX_NSP_DATA_HEADER + 64,
0466 .obj_size = sizeof(struct dn_sock),
0467 };
0468
0469 static struct sock *dn_alloc_sock(struct net *net, struct socket *sock, gfp_t gfp, int kern)
0470 {
0471 struct dn_scp *scp;
0472 struct sock *sk = sk_alloc(net, PF_DECnet, gfp, &dn_proto, kern);
0473
0474 if (!sk)
0475 goto out;
0476
0477 if (sock)
0478 sock->ops = &dn_proto_ops;
0479 sock_init_data(sock, sk);
0480
0481 sk->sk_backlog_rcv = dn_nsp_backlog_rcv;
0482 sk->sk_destruct = dn_destruct;
0483 sk->sk_no_check_tx = 1;
0484 sk->sk_family = PF_DECnet;
0485 sk->sk_protocol = 0;
0486 sk->sk_allocation = gfp;
0487 sk->sk_sndbuf = READ_ONCE(sysctl_decnet_wmem[1]);
0488 sk->sk_rcvbuf = READ_ONCE(sysctl_decnet_rmem[1]);
0489
0490
0491 scp = DN_SK(sk);
0492 scp->state = DN_O;
0493 scp->numdat = 1;
0494 scp->numoth = 1;
0495 scp->ackxmt_dat = 0;
0496 scp->ackxmt_oth = 0;
0497 scp->ackrcv_dat = 0;
0498 scp->ackrcv_oth = 0;
0499 scp->flowrem_sw = DN_SEND;
0500 scp->flowloc_sw = DN_SEND;
0501 scp->flowrem_dat = 0;
0502 scp->flowrem_oth = 1;
0503 scp->flowloc_dat = 0;
0504 scp->flowloc_oth = 1;
0505 scp->services_rem = 0;
0506 scp->services_loc = 1 | NSP_FC_NONE;
0507 scp->info_rem = 0;
0508 scp->info_loc = 0x03;
0509 scp->segsize_rem = 230 - DN_MAX_NSP_DATA_HEADER;
0510 scp->nonagle = 0;
0511 scp->multi_ireq = 1;
0512 scp->accept_mode = ACC_IMMED;
0513 scp->addr.sdn_family = AF_DECnet;
0514 scp->peer.sdn_family = AF_DECnet;
0515 scp->accessdata.acc_accl = 5;
0516 memcpy(scp->accessdata.acc_acc, "LINUX", 5);
0517
0518 scp->max_window = NSP_MAX_WINDOW;
0519 scp->snd_window = NSP_MIN_WINDOW;
0520 scp->nsp_srtt = NSP_INITIAL_SRTT;
0521 scp->nsp_rttvar = NSP_INITIAL_RTTVAR;
0522 scp->nsp_rxtshift = 0;
0523
0524 skb_queue_head_init(&scp->data_xmit_queue);
0525 skb_queue_head_init(&scp->other_xmit_queue);
0526 skb_queue_head_init(&scp->other_receive_queue);
0527
0528 scp->persist = 0;
0529 scp->persist_fxn = NULL;
0530 scp->keepalive = 10 * HZ;
0531 scp->keepalive_fxn = dn_keepalive;
0532
0533 dn_start_slow_timer(sk);
0534 out:
0535 return sk;
0536 }
0537
0538
0539
0540
0541
0542 static void dn_keepalive(struct sock *sk)
0543 {
0544 struct dn_scp *scp = DN_SK(sk);
0545
0546
0547
0548
0549
0550
0551 if (skb_queue_empty(&scp->other_xmit_queue))
0552 dn_nsp_send_link(sk, DN_NOCHANGE, 0);
0553 }
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563 int dn_destroy_timer(struct sock *sk)
0564 {
0565 struct dn_scp *scp = DN_SK(sk);
0566
0567 scp->persist = dn_nsp_persist(sk);
0568
0569 switch (scp->state) {
0570 case DN_DI:
0571 dn_nsp_send_disc(sk, NSP_DISCINIT, 0, GFP_ATOMIC);
0572 if (scp->nsp_rxtshift >= decnet_di_count)
0573 scp->state = DN_CN;
0574 return 0;
0575
0576 case DN_DR:
0577 dn_nsp_send_disc(sk, NSP_DISCINIT, 0, GFP_ATOMIC);
0578 if (scp->nsp_rxtshift >= decnet_dr_count)
0579 scp->state = DN_DRC;
0580 return 0;
0581
0582 case DN_DN:
0583 if (scp->nsp_rxtshift < decnet_dn_count) {
0584
0585 dn_nsp_send_disc(sk, NSP_DISCCONF, NSP_REASON_DC,
0586 GFP_ATOMIC);
0587 return 0;
0588 }
0589 }
0590
0591 scp->persist = (HZ * decnet_time_wait);
0592
0593 if (sk->sk_socket)
0594 return 0;
0595
0596 if (time_after_eq(jiffies, scp->stamp + HZ * decnet_time_wait)) {
0597 dn_unhash_sock(sk);
0598 sock_put(sk);
0599 return 1;
0600 }
0601
0602 return 0;
0603 }
0604
0605 static void dn_destroy_sock(struct sock *sk)
0606 {
0607 struct dn_scp *scp = DN_SK(sk);
0608
0609 scp->nsp_rxtshift = 0;
0610
0611 if (sk->sk_socket) {
0612 if (sk->sk_socket->state != SS_UNCONNECTED)
0613 sk->sk_socket->state = SS_DISCONNECTING;
0614 }
0615
0616 sk->sk_state = TCP_CLOSE;
0617
0618 switch (scp->state) {
0619 case DN_DN:
0620 dn_nsp_send_disc(sk, NSP_DISCCONF, NSP_REASON_DC,
0621 sk->sk_allocation);
0622 scp->persist_fxn = dn_destroy_timer;
0623 scp->persist = dn_nsp_persist(sk);
0624 break;
0625 case DN_CR:
0626 scp->state = DN_DR;
0627 goto disc_reject;
0628 case DN_RUN:
0629 scp->state = DN_DI;
0630 fallthrough;
0631 case DN_DI:
0632 case DN_DR:
0633 disc_reject:
0634 dn_nsp_send_disc(sk, NSP_DISCINIT, 0, sk->sk_allocation);
0635 fallthrough;
0636 case DN_NC:
0637 case DN_NR:
0638 case DN_RJ:
0639 case DN_DIC:
0640 case DN_CN:
0641 case DN_DRC:
0642 case DN_CI:
0643 case DN_CD:
0644 scp->persist_fxn = dn_destroy_timer;
0645 scp->persist = dn_nsp_persist(sk);
0646 break;
0647 default:
0648 printk(KERN_DEBUG "DECnet: dn_destroy_sock passed socket in invalid state\n");
0649 fallthrough;
0650 case DN_O:
0651 dn_stop_slow_timer(sk);
0652
0653 dn_unhash_sock_bh(sk);
0654 sock_put(sk);
0655
0656 break;
0657 }
0658 }
0659
0660 char *dn_addr2asc(__u16 addr, char *buf)
0661 {
0662 unsigned short node, area;
0663
0664 node = addr & 0x03ff;
0665 area = addr >> 10;
0666 sprintf(buf, "%hd.%hd", area, node);
0667
0668 return buf;
0669 }
0670
0671
0672
0673 static int dn_create(struct net *net, struct socket *sock, int protocol,
0674 int kern)
0675 {
0676 struct sock *sk;
0677
0678 if (protocol < 0 || protocol > U8_MAX)
0679 return -EINVAL;
0680
0681 if (!net_eq(net, &init_net))
0682 return -EAFNOSUPPORT;
0683
0684 switch (sock->type) {
0685 case SOCK_SEQPACKET:
0686 if (protocol != DNPROTO_NSP)
0687 return -EPROTONOSUPPORT;
0688 break;
0689 case SOCK_STREAM:
0690 break;
0691 default:
0692 return -ESOCKTNOSUPPORT;
0693 }
0694
0695
0696 if ((sk = dn_alloc_sock(net, sock, GFP_KERNEL, kern)) == NULL)
0697 return -ENOBUFS;
0698
0699 sk->sk_protocol = protocol;
0700
0701 return 0;
0702 }
0703
0704
0705 static int
0706 dn_release(struct socket *sock)
0707 {
0708 struct sock *sk = sock->sk;
0709
0710 if (sk) {
0711 sock_orphan(sk);
0712 sock_hold(sk);
0713 lock_sock(sk);
0714 dn_destroy_sock(sk);
0715 release_sock(sk);
0716 sock_put(sk);
0717 }
0718
0719 return 0;
0720 }
0721
0722 static int dn_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
0723 {
0724 struct sock *sk = sock->sk;
0725 struct dn_scp *scp = DN_SK(sk);
0726 struct sockaddr_dn *saddr = (struct sockaddr_dn *)uaddr;
0727 struct net_device *dev, *ldev;
0728 int rv;
0729
0730 if (addr_len != sizeof(struct sockaddr_dn))
0731 return -EINVAL;
0732
0733 if (saddr->sdn_family != AF_DECnet)
0734 return -EINVAL;
0735
0736 if (le16_to_cpu(saddr->sdn_nodeaddrl) && (le16_to_cpu(saddr->sdn_nodeaddrl) != 2))
0737 return -EINVAL;
0738
0739 if (le16_to_cpu(saddr->sdn_objnamel) > DN_MAXOBJL)
0740 return -EINVAL;
0741
0742 if (saddr->sdn_flags & ~SDF_WILD)
0743 return -EINVAL;
0744
0745 if (!capable(CAP_NET_BIND_SERVICE) && (saddr->sdn_objnum ||
0746 (saddr->sdn_flags & SDF_WILD)))
0747 return -EACCES;
0748
0749 if (!(saddr->sdn_flags & SDF_WILD)) {
0750 if (le16_to_cpu(saddr->sdn_nodeaddrl)) {
0751 rcu_read_lock();
0752 ldev = NULL;
0753 for_each_netdev_rcu(&init_net, dev) {
0754 if (!dev->dn_ptr)
0755 continue;
0756 if (dn_dev_islocal(dev, dn_saddr2dn(saddr))) {
0757 ldev = dev;
0758 break;
0759 }
0760 }
0761 rcu_read_unlock();
0762 if (ldev == NULL)
0763 return -EADDRNOTAVAIL;
0764 }
0765 }
0766
0767 rv = -EINVAL;
0768 lock_sock(sk);
0769 if (sock_flag(sk, SOCK_ZAPPED)) {
0770 memcpy(&scp->addr, saddr, addr_len);
0771 sock_reset_flag(sk, SOCK_ZAPPED);
0772
0773 rv = dn_hash_sock(sk);
0774 if (rv)
0775 sock_set_flag(sk, SOCK_ZAPPED);
0776 }
0777 release_sock(sk);
0778
0779 return rv;
0780 }
0781
0782
0783 static int dn_auto_bind(struct socket *sock)
0784 {
0785 struct sock *sk = sock->sk;
0786 struct dn_scp *scp = DN_SK(sk);
0787 int rv;
0788
0789 sock_reset_flag(sk, SOCK_ZAPPED);
0790
0791 scp->addr.sdn_flags = 0;
0792 scp->addr.sdn_objnum = 0;
0793
0794
0795
0796
0797
0798 if ((scp->accessdata.acc_accl != 0) &&
0799 (scp->accessdata.acc_accl <= 12)) {
0800
0801 scp->addr.sdn_objnamel = cpu_to_le16(scp->accessdata.acc_accl);
0802 memcpy(scp->addr.sdn_objname, scp->accessdata.acc_acc, le16_to_cpu(scp->addr.sdn_objnamel));
0803
0804 scp->accessdata.acc_accl = 0;
0805 memset(scp->accessdata.acc_acc, 0, 40);
0806 }
0807
0808
0809 scp->addr.sdn_add.a_len = cpu_to_le16(2);
0810 rv = dn_dev_bind_default((__le16 *)scp->addr.sdn_add.a_addr);
0811 if (rv == 0) {
0812 rv = dn_hash_sock(sk);
0813 if (rv)
0814 sock_set_flag(sk, SOCK_ZAPPED);
0815 }
0816
0817 return rv;
0818 }
0819
0820 static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation)
0821 {
0822 struct dn_scp *scp = DN_SK(sk);
0823 DEFINE_WAIT_FUNC(wait, woken_wake_function);
0824 int err;
0825
0826 if (scp->state != DN_CR)
0827 return -EINVAL;
0828
0829 scp->state = DN_CC;
0830 scp->segsize_loc = dst_metric_advmss(__sk_dst_get(sk));
0831 dn_send_conn_conf(sk, allocation);
0832
0833 add_wait_queue(sk_sleep(sk), &wait);
0834 for(;;) {
0835 release_sock(sk);
0836 if (scp->state == DN_CC)
0837 *timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, *timeo);
0838 lock_sock(sk);
0839 err = 0;
0840 if (scp->state == DN_RUN)
0841 break;
0842 err = sock_error(sk);
0843 if (err)
0844 break;
0845 err = sock_intr_errno(*timeo);
0846 if (signal_pending(current))
0847 break;
0848 err = -EAGAIN;
0849 if (!*timeo)
0850 break;
0851 }
0852 remove_wait_queue(sk_sleep(sk), &wait);
0853 if (err == 0) {
0854 sk->sk_socket->state = SS_CONNECTED;
0855 } else if (scp->state != DN_CC) {
0856 sk->sk_socket->state = SS_UNCONNECTED;
0857 }
0858 return err;
0859 }
0860
0861 static int dn_wait_run(struct sock *sk, long *timeo)
0862 {
0863 struct dn_scp *scp = DN_SK(sk);
0864 DEFINE_WAIT_FUNC(wait, woken_wake_function);
0865 int err = 0;
0866
0867 if (scp->state == DN_RUN)
0868 goto out;
0869
0870 if (!*timeo)
0871 return -EALREADY;
0872
0873 add_wait_queue(sk_sleep(sk), &wait);
0874 for(;;) {
0875 release_sock(sk);
0876 if (scp->state == DN_CI || scp->state == DN_CC)
0877 *timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, *timeo);
0878 lock_sock(sk);
0879 err = 0;
0880 if (scp->state == DN_RUN)
0881 break;
0882 err = sock_error(sk);
0883 if (err)
0884 break;
0885 err = sock_intr_errno(*timeo);
0886 if (signal_pending(current))
0887 break;
0888 err = -ETIMEDOUT;
0889 if (!*timeo)
0890 break;
0891 }
0892 remove_wait_queue(sk_sleep(sk), &wait);
0893 out:
0894 if (err == 0) {
0895 sk->sk_socket->state = SS_CONNECTED;
0896 } else if (scp->state != DN_CI && scp->state != DN_CC) {
0897 sk->sk_socket->state = SS_UNCONNECTED;
0898 }
0899 return err;
0900 }
0901
0902 static int __dn_connect(struct sock *sk, struct sockaddr_dn *addr, int addrlen, long *timeo, int flags)
0903 {
0904 struct socket *sock = sk->sk_socket;
0905 struct dn_scp *scp = DN_SK(sk);
0906 int err = -EISCONN;
0907 struct flowidn fld;
0908 struct dst_entry *dst;
0909
0910 if (sock->state == SS_CONNECTED)
0911 goto out;
0912
0913 if (sock->state == SS_CONNECTING) {
0914 err = 0;
0915 if (scp->state == DN_RUN) {
0916 sock->state = SS_CONNECTED;
0917 goto out;
0918 }
0919 err = -ECONNREFUSED;
0920 if (scp->state != DN_CI && scp->state != DN_CC) {
0921 sock->state = SS_UNCONNECTED;
0922 goto out;
0923 }
0924 return dn_wait_run(sk, timeo);
0925 }
0926
0927 err = -EINVAL;
0928 if (scp->state != DN_O)
0929 goto out;
0930
0931 if (addr == NULL || addrlen != sizeof(struct sockaddr_dn))
0932 goto out;
0933 if (addr->sdn_family != AF_DECnet)
0934 goto out;
0935 if (addr->sdn_flags & SDF_WILD)
0936 goto out;
0937
0938 if (sock_flag(sk, SOCK_ZAPPED)) {
0939 err = dn_auto_bind(sk->sk_socket);
0940 if (err)
0941 goto out;
0942 }
0943
0944 memcpy(&scp->peer, addr, sizeof(struct sockaddr_dn));
0945
0946 err = -EHOSTUNREACH;
0947 memset(&fld, 0, sizeof(fld));
0948 fld.flowidn_oif = sk->sk_bound_dev_if;
0949 fld.daddr = dn_saddr2dn(&scp->peer);
0950 fld.saddr = dn_saddr2dn(&scp->addr);
0951 dn_sk_ports_copy(&fld, scp);
0952 fld.flowidn_proto = DNPROTO_NSP;
0953 if (dn_route_output_sock(&sk->sk_dst_cache, &fld, sk, flags) < 0)
0954 goto out;
0955 dst = __sk_dst_get(sk);
0956 sk->sk_route_caps = dst->dev->features;
0957 sock->state = SS_CONNECTING;
0958 scp->state = DN_CI;
0959 scp->segsize_loc = dst_metric_advmss(dst);
0960
0961 dn_nsp_send_conninit(sk, NSP_CI);
0962 err = -EINPROGRESS;
0963 if (*timeo) {
0964 err = dn_wait_run(sk, timeo);
0965 }
0966 out:
0967 return err;
0968 }
0969
0970 static int dn_connect(struct socket *sock, struct sockaddr *uaddr, int addrlen, int flags)
0971 {
0972 struct sockaddr_dn *addr = (struct sockaddr_dn *)uaddr;
0973 struct sock *sk = sock->sk;
0974 int err;
0975 long timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
0976
0977 lock_sock(sk);
0978 err = __dn_connect(sk, addr, addrlen, &timeo, 0);
0979 release_sock(sk);
0980
0981 return err;
0982 }
0983
0984 static inline int dn_check_state(struct sock *sk, struct sockaddr_dn *addr, int addrlen, long *timeo, int flags)
0985 {
0986 struct dn_scp *scp = DN_SK(sk);
0987
0988 switch (scp->state) {
0989 case DN_RUN:
0990 return 0;
0991 case DN_CR:
0992 return dn_confirm_accept(sk, timeo, sk->sk_allocation);
0993 case DN_CI:
0994 case DN_CC:
0995 return dn_wait_run(sk, timeo);
0996 case DN_O:
0997 return __dn_connect(sk, addr, addrlen, timeo, flags);
0998 }
0999
1000 return -EINVAL;
1001 }
1002
1003
1004 static void dn_access_copy(struct sk_buff *skb, struct accessdata_dn *acc)
1005 {
1006 unsigned char *ptr = skb->data;
1007
1008 acc->acc_userl = *ptr++;
1009 memcpy(&acc->acc_user, ptr, acc->acc_userl);
1010 ptr += acc->acc_userl;
1011
1012 acc->acc_passl = *ptr++;
1013 memcpy(&acc->acc_pass, ptr, acc->acc_passl);
1014 ptr += acc->acc_passl;
1015
1016 acc->acc_accl = *ptr++;
1017 memcpy(&acc->acc_acc, ptr, acc->acc_accl);
1018
1019 skb_pull(skb, acc->acc_accl + acc->acc_passl + acc->acc_userl + 3);
1020
1021 }
1022
1023 static void dn_user_copy(struct sk_buff *skb, struct optdata_dn *opt)
1024 {
1025 unsigned char *ptr = skb->data;
1026 u16 len = *ptr++;
1027
1028 BUG_ON(len > 16);
1029 opt->opt_optl = cpu_to_le16(len);
1030 opt->opt_status = 0;
1031 memcpy(opt->opt_data, ptr, len);
1032 skb_pull(skb, len + 1);
1033 }
1034
1035 static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo)
1036 {
1037 DEFINE_WAIT_FUNC(wait, woken_wake_function);
1038 struct sk_buff *skb = NULL;
1039 int err = 0;
1040
1041 add_wait_queue(sk_sleep(sk), &wait);
1042 for(;;) {
1043 release_sock(sk);
1044 skb = skb_dequeue(&sk->sk_receive_queue);
1045 if (skb == NULL) {
1046 *timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, *timeo);
1047 skb = skb_dequeue(&sk->sk_receive_queue);
1048 }
1049 lock_sock(sk);
1050 if (skb != NULL)
1051 break;
1052 err = -EINVAL;
1053 if (sk->sk_state != TCP_LISTEN)
1054 break;
1055 err = sock_intr_errno(*timeo);
1056 if (signal_pending(current))
1057 break;
1058 err = -EAGAIN;
1059 if (!*timeo)
1060 break;
1061 }
1062 remove_wait_queue(sk_sleep(sk), &wait);
1063
1064 return skb == NULL ? ERR_PTR(err) : skb;
1065 }
1066
1067 static int dn_accept(struct socket *sock, struct socket *newsock, int flags,
1068 bool kern)
1069 {
1070 struct sock *sk = sock->sk, *newsk;
1071 struct sk_buff *skb = NULL;
1072 struct dn_skb_cb *cb;
1073 unsigned char menuver;
1074 int err = 0;
1075 unsigned char type;
1076 long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
1077 struct dst_entry *dst;
1078
1079 lock_sock(sk);
1080
1081 if (sk->sk_state != TCP_LISTEN || DN_SK(sk)->state != DN_O) {
1082 release_sock(sk);
1083 return -EINVAL;
1084 }
1085
1086 skb = skb_dequeue(&sk->sk_receive_queue);
1087 if (skb == NULL) {
1088 skb = dn_wait_for_connect(sk, &timeo);
1089 if (IS_ERR(skb)) {
1090 release_sock(sk);
1091 return PTR_ERR(skb);
1092 }
1093 }
1094
1095 cb = DN_SKB_CB(skb);
1096 sk_acceptq_removed(sk);
1097 newsk = dn_alloc_sock(sock_net(sk), newsock, sk->sk_allocation, kern);
1098 if (newsk == NULL) {
1099 release_sock(sk);
1100 kfree_skb(skb);
1101 return -ENOBUFS;
1102 }
1103 release_sock(sk);
1104
1105 dst = skb_dst(skb);
1106 sk_dst_set(newsk, dst);
1107 skb_dst_set(skb, NULL);
1108
1109 DN_SK(newsk)->state = DN_CR;
1110 DN_SK(newsk)->addrrem = cb->src_port;
1111 DN_SK(newsk)->services_rem = cb->services;
1112 DN_SK(newsk)->info_rem = cb->info;
1113 DN_SK(newsk)->segsize_rem = cb->segsize;
1114 DN_SK(newsk)->accept_mode = DN_SK(sk)->accept_mode;
1115
1116 if (DN_SK(newsk)->segsize_rem < 230)
1117 DN_SK(newsk)->segsize_rem = 230;
1118
1119 if ((DN_SK(newsk)->services_rem & NSP_FC_MASK) == NSP_FC_NONE)
1120 DN_SK(newsk)->max_window = decnet_no_fc_max_cwnd;
1121
1122 newsk->sk_state = TCP_LISTEN;
1123 memcpy(&(DN_SK(newsk)->addr), &(DN_SK(sk)->addr), sizeof(struct sockaddr_dn));
1124
1125
1126
1127
1128
1129 DN_SK(newsk)->addr.sdn_flags &= ~SDF_WILD;
1130
1131 skb_pull(skb, dn_username2sockaddr(skb->data, skb->len, &(DN_SK(newsk)->addr), &type));
1132 skb_pull(skb, dn_username2sockaddr(skb->data, skb->len, &(DN_SK(newsk)->peer), &type));
1133 *(__le16 *)(DN_SK(newsk)->peer.sdn_add.a_addr) = cb->src;
1134 *(__le16 *)(DN_SK(newsk)->addr.sdn_add.a_addr) = cb->dst;
1135
1136 menuver = *skb->data;
1137 skb_pull(skb, 1);
1138
1139 if (menuver & DN_MENUVER_ACC)
1140 dn_access_copy(skb, &(DN_SK(newsk)->accessdata));
1141
1142 if (menuver & DN_MENUVER_USR)
1143 dn_user_copy(skb, &(DN_SK(newsk)->conndata_in));
1144
1145 if (menuver & DN_MENUVER_PRX)
1146 DN_SK(newsk)->peer.sdn_flags |= SDF_PROXY;
1147
1148 if (menuver & DN_MENUVER_UIC)
1149 DN_SK(newsk)->peer.sdn_flags |= SDF_UICPROXY;
1150
1151 kfree_skb(skb);
1152
1153 memcpy(&(DN_SK(newsk)->conndata_out), &(DN_SK(sk)->conndata_out),
1154 sizeof(struct optdata_dn));
1155 memcpy(&(DN_SK(newsk)->discdata_out), &(DN_SK(sk)->discdata_out),
1156 sizeof(struct optdata_dn));
1157
1158 lock_sock(newsk);
1159 err = dn_hash_sock(newsk);
1160 if (err == 0) {
1161 sock_reset_flag(newsk, SOCK_ZAPPED);
1162 dn_send_conn_ack(newsk);
1163
1164
1165
1166
1167
1168 if (DN_SK(newsk)->accept_mode == ACC_IMMED)
1169 err = dn_confirm_accept(newsk, &timeo,
1170 sk->sk_allocation);
1171 }
1172 release_sock(newsk);
1173 return err;
1174 }
1175
1176
1177 static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int peer)
1178 {
1179 struct sockaddr_dn *sa = (struct sockaddr_dn *)uaddr;
1180 struct sock *sk = sock->sk;
1181 struct dn_scp *scp = DN_SK(sk);
1182
1183 lock_sock(sk);
1184
1185 if (peer) {
1186 if ((sock->state != SS_CONNECTED &&
1187 sock->state != SS_CONNECTING) &&
1188 scp->accept_mode == ACC_IMMED) {
1189 release_sock(sk);
1190 return -ENOTCONN;
1191 }
1192
1193 memcpy(sa, &scp->peer, sizeof(struct sockaddr_dn));
1194 } else {
1195 memcpy(sa, &scp->addr, sizeof(struct sockaddr_dn));
1196 }
1197
1198 release_sock(sk);
1199
1200 return sizeof(struct sockaddr_dn);
1201 }
1202
1203
1204 static __poll_t dn_poll(struct file *file, struct socket *sock, poll_table *wait)
1205 {
1206 struct sock *sk = sock->sk;
1207 struct dn_scp *scp = DN_SK(sk);
1208 __poll_t mask = datagram_poll(file, sock, wait);
1209
1210 if (!skb_queue_empty_lockless(&scp->other_receive_queue))
1211 mask |= EPOLLRDBAND;
1212
1213 return mask;
1214 }
1215
1216 static int dn_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1217 {
1218 struct sock *sk = sock->sk;
1219 struct dn_scp *scp = DN_SK(sk);
1220 int err = -EOPNOTSUPP;
1221 long amount = 0;
1222 struct sk_buff *skb;
1223 int val;
1224
1225 switch(cmd)
1226 {
1227 case SIOCGIFADDR:
1228 case SIOCSIFADDR:
1229 return dn_dev_ioctl(cmd, (void __user *)arg);
1230
1231 case SIOCATMARK:
1232 lock_sock(sk);
1233 val = !skb_queue_empty(&scp->other_receive_queue);
1234 if (scp->state != DN_RUN)
1235 val = -ENOTCONN;
1236 release_sock(sk);
1237 return val;
1238
1239 case TIOCOUTQ:
1240 amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
1241 if (amount < 0)
1242 amount = 0;
1243 err = put_user(amount, (int __user *)arg);
1244 break;
1245
1246 case TIOCINQ:
1247 lock_sock(sk);
1248 skb = skb_peek(&scp->other_receive_queue);
1249 if (skb) {
1250 amount = skb->len;
1251 } else {
1252 skb_queue_walk(&sk->sk_receive_queue, skb)
1253 amount += skb->len;
1254 }
1255 release_sock(sk);
1256 err = put_user(amount, (int __user *)arg);
1257 break;
1258
1259 default:
1260 err = -ENOIOCTLCMD;
1261 break;
1262 }
1263
1264 return err;
1265 }
1266
1267 static int dn_listen(struct socket *sock, int backlog)
1268 {
1269 struct sock *sk = sock->sk;
1270 int err = -EINVAL;
1271
1272 lock_sock(sk);
1273
1274 if (sock_flag(sk, SOCK_ZAPPED))
1275 goto out;
1276
1277 if ((DN_SK(sk)->state != DN_O) || (sk->sk_state == TCP_LISTEN))
1278 goto out;
1279
1280 sk->sk_max_ack_backlog = backlog;
1281 sk->sk_ack_backlog = 0;
1282 sk->sk_state = TCP_LISTEN;
1283 err = 0;
1284 dn_rehash_sock(sk);
1285
1286 out:
1287 release_sock(sk);
1288
1289 return err;
1290 }
1291
1292
1293 static int dn_shutdown(struct socket *sock, int how)
1294 {
1295 struct sock *sk = sock->sk;
1296 struct dn_scp *scp = DN_SK(sk);
1297 int err = -ENOTCONN;
1298
1299 lock_sock(sk);
1300
1301 if (sock->state == SS_UNCONNECTED)
1302 goto out;
1303
1304 err = 0;
1305 if (sock->state == SS_DISCONNECTING)
1306 goto out;
1307
1308 err = -EINVAL;
1309 if (scp->state == DN_O)
1310 goto out;
1311
1312 if (how != SHUT_RDWR)
1313 goto out;
1314
1315 sk->sk_shutdown = SHUTDOWN_MASK;
1316 dn_destroy_sock(sk);
1317 err = 0;
1318
1319 out:
1320 release_sock(sk);
1321
1322 return err;
1323 }
1324
1325 static int dn_setsockopt(struct socket *sock, int level, int optname,
1326 sockptr_t optval, unsigned int optlen)
1327 {
1328 struct sock *sk = sock->sk;
1329 int err;
1330
1331 lock_sock(sk);
1332 err = __dn_setsockopt(sock, level, optname, optval, optlen, 0);
1333 release_sock(sk);
1334 #ifdef CONFIG_NETFILTER
1335
1336 if (err == -ENOPROTOOPT && optname != DSO_LINKINFO &&
1337 optname != DSO_STREAM && optname != DSO_SEQPACKET)
1338 err = nf_setsockopt(sk, PF_DECnet, optname, optval, optlen);
1339 #endif
1340
1341 return err;
1342 }
1343
1344 static int __dn_setsockopt(struct socket *sock, int level, int optname,
1345 sockptr_t optval, unsigned int optlen, int flags)
1346 {
1347 struct sock *sk = sock->sk;
1348 struct dn_scp *scp = DN_SK(sk);
1349 long timeo;
1350 union {
1351 struct optdata_dn opt;
1352 struct accessdata_dn acc;
1353 int mode;
1354 unsigned long win;
1355 int val;
1356 unsigned char services;
1357 unsigned char info;
1358 } u;
1359 int err;
1360
1361 if (optlen && sockptr_is_null(optval))
1362 return -EINVAL;
1363
1364 if (optlen > sizeof(u))
1365 return -EINVAL;
1366
1367 if (copy_from_sockptr(&u, optval, optlen))
1368 return -EFAULT;
1369
1370 switch (optname) {
1371 case DSO_CONDATA:
1372 if (sock->state == SS_CONNECTED)
1373 return -EISCONN;
1374 if ((scp->state != DN_O) && (scp->state != DN_CR))
1375 return -EINVAL;
1376
1377 if (optlen != sizeof(struct optdata_dn))
1378 return -EINVAL;
1379
1380 if (le16_to_cpu(u.opt.opt_optl) > 16)
1381 return -EINVAL;
1382
1383 memcpy(&scp->conndata_out, &u.opt, optlen);
1384 break;
1385
1386 case DSO_DISDATA:
1387 if (sock->state != SS_CONNECTED &&
1388 scp->accept_mode == ACC_IMMED)
1389 return -ENOTCONN;
1390
1391 if (optlen != sizeof(struct optdata_dn))
1392 return -EINVAL;
1393
1394 if (le16_to_cpu(u.opt.opt_optl) > 16)
1395 return -EINVAL;
1396
1397 memcpy(&scp->discdata_out, &u.opt, optlen);
1398 break;
1399
1400 case DSO_CONACCESS:
1401 if (sock->state == SS_CONNECTED)
1402 return -EISCONN;
1403 if (scp->state != DN_O)
1404 return -EINVAL;
1405
1406 if (optlen != sizeof(struct accessdata_dn))
1407 return -EINVAL;
1408
1409 if ((u.acc.acc_accl > DN_MAXACCL) ||
1410 (u.acc.acc_passl > DN_MAXACCL) ||
1411 (u.acc.acc_userl > DN_MAXACCL))
1412 return -EINVAL;
1413
1414 memcpy(&scp->accessdata, &u.acc, optlen);
1415 break;
1416
1417 case DSO_ACCEPTMODE:
1418 if (sock->state == SS_CONNECTED)
1419 return -EISCONN;
1420 if (scp->state != DN_O)
1421 return -EINVAL;
1422
1423 if (optlen != sizeof(int))
1424 return -EINVAL;
1425
1426 if ((u.mode != ACC_IMMED) && (u.mode != ACC_DEFER))
1427 return -EINVAL;
1428
1429 scp->accept_mode = (unsigned char)u.mode;
1430 break;
1431
1432 case DSO_CONACCEPT:
1433 if (scp->state != DN_CR)
1434 return -EINVAL;
1435 timeo = sock_rcvtimeo(sk, 0);
1436 err = dn_confirm_accept(sk, &timeo, sk->sk_allocation);
1437 return err;
1438
1439 case DSO_CONREJECT:
1440 if (scp->state != DN_CR)
1441 return -EINVAL;
1442
1443 scp->state = DN_DR;
1444 sk->sk_shutdown = SHUTDOWN_MASK;
1445 dn_nsp_send_disc(sk, 0x38, 0, sk->sk_allocation);
1446 break;
1447
1448 case DSO_MAXWINDOW:
1449 if (optlen != sizeof(unsigned long))
1450 return -EINVAL;
1451 if (u.win > NSP_MAX_WINDOW)
1452 u.win = NSP_MAX_WINDOW;
1453 if (u.win == 0)
1454 return -EINVAL;
1455 scp->max_window = u.win;
1456 if (scp->snd_window > u.win)
1457 scp->snd_window = u.win;
1458 break;
1459
1460 case DSO_NODELAY:
1461 if (optlen != sizeof(int))
1462 return -EINVAL;
1463 if (scp->nonagle == TCP_NAGLE_CORK)
1464 return -EINVAL;
1465 scp->nonagle = (u.val == 0) ? 0 : TCP_NAGLE_OFF;
1466
1467 break;
1468
1469 case DSO_CORK:
1470 if (optlen != sizeof(int))
1471 return -EINVAL;
1472 if (scp->nonagle == TCP_NAGLE_OFF)
1473 return -EINVAL;
1474 scp->nonagle = (u.val == 0) ? 0 : TCP_NAGLE_CORK;
1475
1476 break;
1477
1478 case DSO_SERVICES:
1479 if (optlen != sizeof(unsigned char))
1480 return -EINVAL;
1481 if ((u.services & ~NSP_FC_MASK) != 0x01)
1482 return -EINVAL;
1483 if ((u.services & NSP_FC_MASK) == NSP_FC_MASK)
1484 return -EINVAL;
1485 scp->services_loc = u.services;
1486 break;
1487
1488 case DSO_INFO:
1489 if (optlen != sizeof(unsigned char))
1490 return -EINVAL;
1491 if (u.info & 0xfc)
1492 return -EINVAL;
1493 scp->info_loc = u.info;
1494 break;
1495
1496 case DSO_LINKINFO:
1497 case DSO_STREAM:
1498 case DSO_SEQPACKET:
1499 default:
1500 return -ENOPROTOOPT;
1501 }
1502
1503 return 0;
1504 }
1505
1506 static int dn_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
1507 {
1508 struct sock *sk = sock->sk;
1509 int err;
1510
1511 lock_sock(sk);
1512 err = __dn_getsockopt(sock, level, optname, optval, optlen, 0);
1513 release_sock(sk);
1514 #ifdef CONFIG_NETFILTER
1515 if (err == -ENOPROTOOPT && optname != DSO_STREAM &&
1516 optname != DSO_SEQPACKET && optname != DSO_CONACCEPT &&
1517 optname != DSO_CONREJECT) {
1518 int len;
1519
1520 if (get_user(len, optlen))
1521 return -EFAULT;
1522
1523 err = nf_getsockopt(sk, PF_DECnet, optname, optval, &len);
1524 if (err >= 0)
1525 err = put_user(len, optlen);
1526 }
1527 #endif
1528
1529 return err;
1530 }
1531
1532 static int __dn_getsockopt(struct socket *sock, int level,int optname, char __user *optval,int __user *optlen, int flags)
1533 {
1534 struct sock *sk = sock->sk;
1535 struct dn_scp *scp = DN_SK(sk);
1536 struct linkinfo_dn link;
1537 unsigned int r_len;
1538 void *r_data = NULL;
1539 unsigned int val;
1540
1541 if(get_user(r_len , optlen))
1542 return -EFAULT;
1543
1544 switch (optname) {
1545 case DSO_CONDATA:
1546 if (r_len > sizeof(struct optdata_dn))
1547 r_len = sizeof(struct optdata_dn);
1548 r_data = &scp->conndata_in;
1549 break;
1550
1551 case DSO_DISDATA:
1552 if (r_len > sizeof(struct optdata_dn))
1553 r_len = sizeof(struct optdata_dn);
1554 r_data = &scp->discdata_in;
1555 break;
1556
1557 case DSO_CONACCESS:
1558 if (r_len > sizeof(struct accessdata_dn))
1559 r_len = sizeof(struct accessdata_dn);
1560 r_data = &scp->accessdata;
1561 break;
1562
1563 case DSO_ACCEPTMODE:
1564 if (r_len > sizeof(unsigned char))
1565 r_len = sizeof(unsigned char);
1566 r_data = &scp->accept_mode;
1567 break;
1568
1569 case DSO_LINKINFO:
1570 if (r_len > sizeof(struct linkinfo_dn))
1571 r_len = sizeof(struct linkinfo_dn);
1572
1573 memset(&link, 0, sizeof(link));
1574
1575 switch (sock->state) {
1576 case SS_CONNECTING:
1577 link.idn_linkstate = LL_CONNECTING;
1578 break;
1579 case SS_DISCONNECTING:
1580 link.idn_linkstate = LL_DISCONNECTING;
1581 break;
1582 case SS_CONNECTED:
1583 link.idn_linkstate = LL_RUNNING;
1584 break;
1585 default:
1586 link.idn_linkstate = LL_INACTIVE;
1587 }
1588
1589 link.idn_segsize = scp->segsize_rem;
1590 r_data = &link;
1591 break;
1592
1593 case DSO_MAXWINDOW:
1594 if (r_len > sizeof(unsigned long))
1595 r_len = sizeof(unsigned long);
1596 r_data = &scp->max_window;
1597 break;
1598
1599 case DSO_NODELAY:
1600 if (r_len > sizeof(int))
1601 r_len = sizeof(int);
1602 val = (scp->nonagle == TCP_NAGLE_OFF);
1603 r_data = &val;
1604 break;
1605
1606 case DSO_CORK:
1607 if (r_len > sizeof(int))
1608 r_len = sizeof(int);
1609 val = (scp->nonagle == TCP_NAGLE_CORK);
1610 r_data = &val;
1611 break;
1612
1613 case DSO_SERVICES:
1614 if (r_len > sizeof(unsigned char))
1615 r_len = sizeof(unsigned char);
1616 r_data = &scp->services_rem;
1617 break;
1618
1619 case DSO_INFO:
1620 if (r_len > sizeof(unsigned char))
1621 r_len = sizeof(unsigned char);
1622 r_data = &scp->info_rem;
1623 break;
1624
1625 case DSO_STREAM:
1626 case DSO_SEQPACKET:
1627 case DSO_CONACCEPT:
1628 case DSO_CONREJECT:
1629 default:
1630 return -ENOPROTOOPT;
1631 }
1632
1633 if (r_data) {
1634 if (copy_to_user(optval, r_data, r_len))
1635 return -EFAULT;
1636 if (put_user(r_len, optlen))
1637 return -EFAULT;
1638 }
1639
1640 return 0;
1641 }
1642
1643
1644 static int dn_data_ready(struct sock *sk, struct sk_buff_head *q, int flags, int target)
1645 {
1646 struct sk_buff *skb;
1647 int len = 0;
1648
1649 if (flags & MSG_OOB)
1650 return !skb_queue_empty(q) ? 1 : 0;
1651
1652 skb_queue_walk(q, skb) {
1653 struct dn_skb_cb *cb = DN_SKB_CB(skb);
1654 len += skb->len;
1655
1656 if (cb->nsp_flags & 0x40) {
1657
1658 if (sk->sk_type == SOCK_SEQPACKET)
1659 return 1;
1660
1661 if (!(flags & MSG_WAITALL))
1662 return 1;
1663 }
1664
1665
1666 if (len >= target)
1667 return 1;
1668 }
1669
1670 return 0;
1671 }
1672
1673
1674 static int dn_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
1675 int flags)
1676 {
1677 struct sock *sk = sock->sk;
1678 struct dn_scp *scp = DN_SK(sk);
1679 struct sk_buff_head *queue = &sk->sk_receive_queue;
1680 size_t target = size > 1 ? 1 : 0;
1681 size_t copied = 0;
1682 int rv = 0;
1683 struct sk_buff *skb, *n;
1684 struct dn_skb_cb *cb = NULL;
1685 unsigned char eor = 0;
1686 long timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
1687
1688 lock_sock(sk);
1689
1690 if (sock_flag(sk, SOCK_ZAPPED)) {
1691 rv = -EADDRNOTAVAIL;
1692 goto out;
1693 }
1694
1695 if (sk->sk_shutdown & RCV_SHUTDOWN) {
1696 rv = 0;
1697 goto out;
1698 }
1699
1700 rv = dn_check_state(sk, NULL, 0, &timeo, flags);
1701 if (rv)
1702 goto out;
1703
1704 if (flags & ~(MSG_CMSG_COMPAT|MSG_PEEK|MSG_OOB|MSG_WAITALL|MSG_DONTWAIT|MSG_NOSIGNAL)) {
1705 rv = -EOPNOTSUPP;
1706 goto out;
1707 }
1708
1709 if (flags & MSG_OOB)
1710 queue = &scp->other_receive_queue;
1711
1712 if (flags & MSG_WAITALL)
1713 target = size;
1714
1715
1716
1717
1718
1719 for(;;) {
1720 DEFINE_WAIT_FUNC(wait, woken_wake_function);
1721
1722 if (sk->sk_err)
1723 goto out;
1724
1725 if (!skb_queue_empty(&scp->other_receive_queue)) {
1726 if (!(flags & MSG_OOB)) {
1727 msg->msg_flags |= MSG_OOB;
1728 if (!scp->other_report) {
1729 scp->other_report = 1;
1730 goto out;
1731 }
1732 }
1733 }
1734
1735 if (scp->state != DN_RUN)
1736 goto out;
1737
1738 if (signal_pending(current)) {
1739 rv = sock_intr_errno(timeo);
1740 goto out;
1741 }
1742
1743 if (dn_data_ready(sk, queue, flags, target))
1744 break;
1745
1746 if (flags & MSG_DONTWAIT) {
1747 rv = -EWOULDBLOCK;
1748 goto out;
1749 }
1750
1751 add_wait_queue(sk_sleep(sk), &wait);
1752 sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
1753 sk_wait_event(sk, &timeo, dn_data_ready(sk, queue, flags, target), &wait);
1754 sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
1755 remove_wait_queue(sk_sleep(sk), &wait);
1756 }
1757
1758 skb_queue_walk_safe(queue, skb, n) {
1759 unsigned int chunk = skb->len;
1760 cb = DN_SKB_CB(skb);
1761
1762 if ((chunk + copied) > size)
1763 chunk = size - copied;
1764
1765 if (memcpy_to_msg(msg, skb->data, chunk)) {
1766 rv = -EFAULT;
1767 break;
1768 }
1769 copied += chunk;
1770
1771 if (!(flags & MSG_PEEK))
1772 skb_pull(skb, chunk);
1773
1774 eor = cb->nsp_flags & 0x40;
1775
1776 if (skb->len == 0) {
1777 skb_unlink(skb, queue);
1778 kfree_skb(skb);
1779
1780
1781
1782
1783 if ((scp->flowloc_sw == DN_DONTSEND) && !dn_congested(sk)) {
1784 scp->flowloc_sw = DN_SEND;
1785 dn_nsp_send_link(sk, DN_SEND, 0);
1786 }
1787 }
1788
1789 if (eor) {
1790 if (sk->sk_type == SOCK_SEQPACKET)
1791 break;
1792 if (!(flags & MSG_WAITALL))
1793 break;
1794 }
1795
1796 if (flags & MSG_OOB)
1797 break;
1798
1799 if (copied >= target)
1800 break;
1801 }
1802
1803 rv = copied;
1804
1805
1806 if (eor && (sk->sk_type == SOCK_SEQPACKET))
1807 msg->msg_flags |= MSG_EOR;
1808
1809 out:
1810 if (rv == 0)
1811 rv = (flags & MSG_PEEK) ? -sk->sk_err : sock_error(sk);
1812
1813 if ((rv >= 0) && msg->msg_name) {
1814 __sockaddr_check_size(sizeof(struct sockaddr_dn));
1815 memcpy(msg->msg_name, &scp->peer, sizeof(struct sockaddr_dn));
1816 msg->msg_namelen = sizeof(struct sockaddr_dn);
1817 }
1818
1819 release_sock(sk);
1820
1821 return rv;
1822 }
1823
1824
1825 static inline int dn_queue_too_long(struct dn_scp *scp, struct sk_buff_head *queue, int flags)
1826 {
1827 unsigned char fctype = scp->services_rem & NSP_FC_MASK;
1828 if (skb_queue_len(queue) >= scp->snd_window)
1829 return 1;
1830 if (fctype != NSP_FC_NONE) {
1831 if (flags & MSG_OOB) {
1832 if (scp->flowrem_oth == 0)
1833 return 1;
1834 } else {
1835 if (scp->flowrem_dat == 0)
1836 return 1;
1837 }
1838 }
1839 return 0;
1840 }
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850 unsigned int dn_mss_from_pmtu(struct net_device *dev, int mtu)
1851 {
1852 unsigned int mss = 230 - DN_MAX_NSP_DATA_HEADER;
1853 if (dev) {
1854 struct dn_dev *dn_db = rcu_dereference_raw(dev->dn_ptr);
1855 mtu -= LL_RESERVED_SPACE(dev);
1856 if (dn_db->use_long)
1857 mtu -= 21;
1858 else
1859 mtu -= 6;
1860 mtu -= DN_MAX_NSP_DATA_HEADER;
1861 } else {
1862
1863
1864
1865 mtu -= (21 + DN_MAX_NSP_DATA_HEADER + 16);
1866 }
1867 if (mtu > mss)
1868 mss = mtu;
1869 return mss;
1870 }
1871
1872 static inline unsigned int dn_current_mss(struct sock *sk, int flags)
1873 {
1874 struct dst_entry *dst = __sk_dst_get(sk);
1875 struct dn_scp *scp = DN_SK(sk);
1876 int mss_now = min_t(int, scp->segsize_loc, scp->segsize_rem);
1877
1878
1879 if (flags & MSG_OOB)
1880 return 16;
1881
1882
1883 if (dst) {
1884 u32 mtu = dst_mtu(dst);
1885 mss_now = min_t(int, dn_mss_from_pmtu(dst->dev, mtu), mss_now);
1886 }
1887
1888 return mss_now;
1889 }
1890
1891
1892
1893
1894
1895
1896
1897 static inline struct sk_buff *dn_alloc_send_pskb(struct sock *sk,
1898 unsigned long datalen, int noblock,
1899 int *errcode)
1900 {
1901 struct sk_buff *skb = sock_alloc_send_skb(sk, datalen,
1902 noblock, errcode);
1903 if (skb) {
1904 skb->protocol = htons(ETH_P_DNA_RT);
1905 skb->pkt_type = PACKET_OUTGOING;
1906 }
1907 return skb;
1908 }
1909
1910 static int dn_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
1911 {
1912 struct sock *sk = sock->sk;
1913 struct dn_scp *scp = DN_SK(sk);
1914 size_t mss;
1915 struct sk_buff_head *queue = &scp->data_xmit_queue;
1916 int flags = msg->msg_flags;
1917 int err = 0;
1918 size_t sent = 0;
1919 int addr_len = msg->msg_namelen;
1920 DECLARE_SOCKADDR(struct sockaddr_dn *, addr, msg->msg_name);
1921 struct sk_buff *skb = NULL;
1922 struct dn_skb_cb *cb;
1923 size_t len;
1924 unsigned char fctype;
1925 long timeo;
1926
1927 if (flags & ~(MSG_TRYHARD|MSG_OOB|MSG_DONTWAIT|MSG_EOR|MSG_NOSIGNAL|MSG_MORE|MSG_CMSG_COMPAT))
1928 return -EOPNOTSUPP;
1929
1930 if (addr_len && (addr_len != sizeof(struct sockaddr_dn)))
1931 return -EINVAL;
1932
1933 lock_sock(sk);
1934 timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
1935
1936
1937
1938
1939
1940 if (sock->type == SOCK_STREAM) {
1941 if (flags & MSG_EOR) {
1942 err = -EINVAL;
1943 goto out;
1944 }
1945 flags |= MSG_EOR;
1946 }
1947
1948
1949 err = dn_check_state(sk, addr, addr_len, &timeo, flags);
1950 if (err)
1951 goto out_err;
1952
1953 if (sk->sk_shutdown & SEND_SHUTDOWN) {
1954 err = -EPIPE;
1955 if (!(flags & MSG_NOSIGNAL))
1956 send_sig(SIGPIPE, current, 0);
1957 goto out_err;
1958 }
1959
1960 if ((flags & MSG_TRYHARD) && sk->sk_dst_cache)
1961 dst_negative_advice(sk);
1962
1963 mss = scp->segsize_rem;
1964 fctype = scp->services_rem & NSP_FC_MASK;
1965
1966 mss = dn_current_mss(sk, flags);
1967
1968 if (flags & MSG_OOB) {
1969 queue = &scp->other_xmit_queue;
1970 if (size > mss) {
1971 err = -EMSGSIZE;
1972 goto out;
1973 }
1974 }
1975
1976 scp->persist_fxn = dn_nsp_xmit_timeout;
1977
1978 while(sent < size) {
1979 err = sock_error(sk);
1980 if (err)
1981 goto out;
1982
1983 if (signal_pending(current)) {
1984 err = sock_intr_errno(timeo);
1985 goto out;
1986 }
1987
1988
1989
1990
1991 len = size - sent;
1992
1993 if (len > mss)
1994 len = mss;
1995
1996
1997
1998
1999
2000 if (dn_queue_too_long(scp, queue, flags)) {
2001 DEFINE_WAIT_FUNC(wait, woken_wake_function);
2002
2003 if (flags & MSG_DONTWAIT) {
2004 err = -EWOULDBLOCK;
2005 goto out;
2006 }
2007
2008 add_wait_queue(sk_sleep(sk), &wait);
2009 sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
2010 sk_wait_event(sk, &timeo,
2011 !dn_queue_too_long(scp, queue, flags), &wait);
2012 sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
2013 remove_wait_queue(sk_sleep(sk), &wait);
2014 continue;
2015 }
2016
2017
2018
2019
2020
2021
2022
2023 skb = dn_alloc_send_pskb(sk, len + 64 + DN_MAX_NSP_DATA_HEADER,
2024 flags & MSG_DONTWAIT, &err);
2025
2026 if (err)
2027 break;
2028
2029 if (!skb)
2030 continue;
2031
2032 cb = DN_SKB_CB(skb);
2033
2034 skb_reserve(skb, 64 + DN_MAX_NSP_DATA_HEADER);
2035
2036 if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
2037 err = -EFAULT;
2038 goto out;
2039 }
2040
2041 if (flags & MSG_OOB) {
2042 cb->nsp_flags = 0x30;
2043 if (fctype != NSP_FC_NONE)
2044 scp->flowrem_oth--;
2045 } else {
2046 cb->nsp_flags = 0x00;
2047 if (scp->seg_total == 0)
2048 cb->nsp_flags |= 0x20;
2049
2050 scp->seg_total += len;
2051
2052 if (((sent + len) == size) && (flags & MSG_EOR)) {
2053 cb->nsp_flags |= 0x40;
2054 scp->seg_total = 0;
2055 if (fctype == NSP_FC_SCMC)
2056 scp->flowrem_dat--;
2057 }
2058 if (fctype == NSP_FC_SRC)
2059 scp->flowrem_dat--;
2060 }
2061
2062 sent += len;
2063 dn_nsp_queue_xmit(sk, skb, sk->sk_allocation, flags & MSG_OOB);
2064 skb = NULL;
2065
2066 scp->persist = dn_nsp_persist(sk);
2067
2068 }
2069 out:
2070
2071 kfree_skb(skb);
2072
2073 release_sock(sk);
2074
2075 return sent ? sent : err;
2076
2077 out_err:
2078 err = sk_stream_error(sk, flags, err);
2079 release_sock(sk);
2080 return err;
2081 }
2082
2083 static int dn_device_event(struct notifier_block *this, unsigned long event,
2084 void *ptr)
2085 {
2086 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
2087
2088 if (!net_eq(dev_net(dev), &init_net))
2089 return NOTIFY_DONE;
2090
2091 switch (event) {
2092 case NETDEV_UP:
2093 dn_dev_up(dev);
2094 break;
2095 case NETDEV_DOWN:
2096 dn_dev_down(dev);
2097 break;
2098 default:
2099 break;
2100 }
2101
2102 return NOTIFY_DONE;
2103 }
2104
2105 static struct notifier_block dn_dev_notifier = {
2106 .notifier_call = dn_device_event,
2107 };
2108
2109 static struct packet_type dn_dix_packet_type __read_mostly = {
2110 .type = cpu_to_be16(ETH_P_DNA_RT),
2111 .func = dn_route_rcv,
2112 };
2113
2114 #ifdef CONFIG_PROC_FS
2115 struct dn_iter_state {
2116 int bucket;
2117 };
2118
2119 static struct sock *dn_socket_get_first(struct seq_file *seq)
2120 {
2121 struct dn_iter_state *state = seq->private;
2122 struct sock *n = NULL;
2123
2124 for(state->bucket = 0;
2125 state->bucket < DN_SK_HASH_SIZE;
2126 ++state->bucket) {
2127 n = sk_head(&dn_sk_hash[state->bucket]);
2128 if (n)
2129 break;
2130 }
2131
2132 return n;
2133 }
2134
2135 static struct sock *dn_socket_get_next(struct seq_file *seq,
2136 struct sock *n)
2137 {
2138 struct dn_iter_state *state = seq->private;
2139
2140 n = sk_next(n);
2141 while (!n) {
2142 if (++state->bucket >= DN_SK_HASH_SIZE)
2143 break;
2144 n = sk_head(&dn_sk_hash[state->bucket]);
2145 }
2146 return n;
2147 }
2148
2149 static struct sock *socket_get_idx(struct seq_file *seq, loff_t *pos)
2150 {
2151 struct sock *sk = dn_socket_get_first(seq);
2152
2153 if (sk) {
2154 while(*pos && (sk = dn_socket_get_next(seq, sk)))
2155 --*pos;
2156 }
2157 return *pos ? NULL : sk;
2158 }
2159
2160 static void *dn_socket_get_idx(struct seq_file *seq, loff_t pos)
2161 {
2162 void *rc;
2163 read_lock_bh(&dn_hash_lock);
2164 rc = socket_get_idx(seq, &pos);
2165 if (!rc) {
2166 read_unlock_bh(&dn_hash_lock);
2167 }
2168 return rc;
2169 }
2170
2171 static void *dn_socket_seq_start(struct seq_file *seq, loff_t *pos)
2172 {
2173 return *pos ? dn_socket_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
2174 }
2175
2176 static void *dn_socket_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2177 {
2178 void *rc;
2179
2180 if (v == SEQ_START_TOKEN) {
2181 rc = dn_socket_get_idx(seq, 0);
2182 goto out;
2183 }
2184
2185 rc = dn_socket_get_next(seq, v);
2186 if (rc)
2187 goto out;
2188 read_unlock_bh(&dn_hash_lock);
2189 out:
2190 ++*pos;
2191 return rc;
2192 }
2193
2194 static void dn_socket_seq_stop(struct seq_file *seq, void *v)
2195 {
2196 if (v && v != SEQ_START_TOKEN)
2197 read_unlock_bh(&dn_hash_lock);
2198 }
2199
2200 #define IS_NOT_PRINTABLE(x) ((x) < 32 || (x) > 126)
2201
2202 static void dn_printable_object(struct sockaddr_dn *dn, unsigned char *buf)
2203 {
2204 int i;
2205
2206 switch (le16_to_cpu(dn->sdn_objnamel)) {
2207 case 0:
2208 sprintf(buf, "%d", dn->sdn_objnum);
2209 break;
2210 default:
2211 for (i = 0; i < le16_to_cpu(dn->sdn_objnamel); i++) {
2212 buf[i] = dn->sdn_objname[i];
2213 if (IS_NOT_PRINTABLE(buf[i]))
2214 buf[i] = '.';
2215 }
2216 buf[i] = 0;
2217 }
2218 }
2219
2220 static char *dn_state2asc(unsigned char state)
2221 {
2222 switch (state) {
2223 case DN_O:
2224 return "OPEN";
2225 case DN_CR:
2226 return " CR";
2227 case DN_DR:
2228 return " DR";
2229 case DN_DRC:
2230 return " DRC";
2231 case DN_CC:
2232 return " CC";
2233 case DN_CI:
2234 return " CI";
2235 case DN_NR:
2236 return " NR";
2237 case DN_NC:
2238 return " NC";
2239 case DN_CD:
2240 return " CD";
2241 case DN_RJ:
2242 return " RJ";
2243 case DN_RUN:
2244 return " RUN";
2245 case DN_DI:
2246 return " DI";
2247 case DN_DIC:
2248 return " DIC";
2249 case DN_DN:
2250 return " DN";
2251 case DN_CL:
2252 return " CL";
2253 case DN_CN:
2254 return " CN";
2255 }
2256
2257 return "????";
2258 }
2259
2260 static inline void dn_socket_format_entry(struct seq_file *seq, struct sock *sk)
2261 {
2262 struct dn_scp *scp = DN_SK(sk);
2263 char buf1[DN_ASCBUF_LEN];
2264 char buf2[DN_ASCBUF_LEN];
2265 char local_object[DN_MAXOBJL+3];
2266 char remote_object[DN_MAXOBJL+3];
2267
2268 dn_printable_object(&scp->addr, local_object);
2269 dn_printable_object(&scp->peer, remote_object);
2270
2271 seq_printf(seq,
2272 "%6s/%04X %04d:%04d %04d:%04d %01d %-16s "
2273 "%6s/%04X %04d:%04d %04d:%04d %01d %-16s %4s %s\n",
2274 dn_addr2asc(le16_to_cpu(dn_saddr2dn(&scp->addr)), buf1),
2275 scp->addrloc,
2276 scp->numdat,
2277 scp->numoth,
2278 scp->ackxmt_dat,
2279 scp->ackxmt_oth,
2280 scp->flowloc_sw,
2281 local_object,
2282 dn_addr2asc(le16_to_cpu(dn_saddr2dn(&scp->peer)), buf2),
2283 scp->addrrem,
2284 scp->numdat_rcv,
2285 scp->numoth_rcv,
2286 scp->ackrcv_dat,
2287 scp->ackrcv_oth,
2288 scp->flowrem_sw,
2289 remote_object,
2290 dn_state2asc(scp->state),
2291 ((scp->accept_mode == ACC_IMMED) ? "IMMED" : "DEFER"));
2292 }
2293
2294 static int dn_socket_seq_show(struct seq_file *seq, void *v)
2295 {
2296 if (v == SEQ_START_TOKEN) {
2297 seq_puts(seq, "Local Remote\n");
2298 } else {
2299 dn_socket_format_entry(seq, v);
2300 }
2301 return 0;
2302 }
2303
2304 static const struct seq_operations dn_socket_seq_ops = {
2305 .start = dn_socket_seq_start,
2306 .next = dn_socket_seq_next,
2307 .stop = dn_socket_seq_stop,
2308 .show = dn_socket_seq_show,
2309 };
2310 #endif
2311
2312 static const struct net_proto_family dn_family_ops = {
2313 .family = AF_DECnet,
2314 .create = dn_create,
2315 .owner = THIS_MODULE,
2316 };
2317
2318 static const struct proto_ops dn_proto_ops = {
2319 .family = AF_DECnet,
2320 .owner = THIS_MODULE,
2321 .release = dn_release,
2322 .bind = dn_bind,
2323 .connect = dn_connect,
2324 .socketpair = sock_no_socketpair,
2325 .accept = dn_accept,
2326 .getname = dn_getname,
2327 .poll = dn_poll,
2328 .ioctl = dn_ioctl,
2329 .listen = dn_listen,
2330 .shutdown = dn_shutdown,
2331 .setsockopt = dn_setsockopt,
2332 .getsockopt = dn_getsockopt,
2333 .sendmsg = dn_sendmsg,
2334 .recvmsg = dn_recvmsg,
2335 .mmap = sock_no_mmap,
2336 .sendpage = sock_no_sendpage,
2337 };
2338
2339 MODULE_DESCRIPTION("The Linux DECnet Network Protocol");
2340 MODULE_AUTHOR("Linux DECnet Project Team");
2341 MODULE_LICENSE("GPL");
2342 MODULE_ALIAS_NETPROTO(PF_DECnet);
2343
2344 static const char banner[] __initconst = KERN_INFO
2345 "NET4: DECnet for Linux: V.2.5.68s (C) 1995-2003 Linux DECnet Project Team\n";
2346
2347 static int __init decnet_init(void)
2348 {
2349 int rc;
2350
2351 printk(banner);
2352
2353 rc = proto_register(&dn_proto, 1);
2354 if (rc != 0)
2355 goto out;
2356
2357 dn_neigh_init();
2358 dn_dev_init();
2359 dn_route_init();
2360 dn_fib_init();
2361
2362 sock_register(&dn_family_ops);
2363 dev_add_pack(&dn_dix_packet_type);
2364 register_netdevice_notifier(&dn_dev_notifier);
2365
2366 proc_create_seq_private("decnet", 0444, init_net.proc_net,
2367 &dn_socket_seq_ops, sizeof(struct dn_iter_state),
2368 NULL);
2369 dn_register_sysctl();
2370 out:
2371 return rc;
2372
2373 }
2374 module_init(decnet_init);
2375
2376
2377
2378
2379
2380
2381 #if 0
2382 static void __exit decnet_exit(void)
2383 {
2384 sock_unregister(AF_DECnet);
2385 rtnl_unregister_all(PF_DECnet);
2386 dev_remove_pack(&dn_dix_packet_type);
2387
2388 dn_unregister_sysctl();
2389
2390 unregister_netdevice_notifier(&dn_dev_notifier);
2391
2392 dn_route_cleanup();
2393 dn_dev_cleanup();
2394 dn_neigh_cleanup();
2395 dn_fib_cleanup();
2396
2397 remove_proc_entry("decnet", init_net.proc_net);
2398
2399 proto_unregister(&dn_proto);
2400
2401 rcu_barrier();
2402 }
2403 module_exit(decnet_exit);
2404 #endif