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 #include <linux/errno.h>
0033 #include <linux/types.h>
0034 #include <linux/socket.h>
0035 #include <linux/in.h>
0036 #include <linux/kernel.h>
0037 #include <linux/timer.h>
0038 #include <linux/string.h>
0039 #include <linux/sockios.h>
0040 #include <linux/net.h>
0041 #include <linux/netdevice.h>
0042 #include <linux/inet.h>
0043 #include <linux/route.h>
0044 #include <linux/slab.h>
0045 #include <net/sock.h>
0046 #include <linux/fcntl.h>
0047 #include <linux/mm.h>
0048 #include <linux/termios.h>
0049 #include <linux/interrupt.h>
0050 #include <linux/proc_fs.h>
0051 #include <linux/stat.h>
0052 #include <linux/init.h>
0053 #include <linux/poll.h>
0054 #include <linux/if_packet.h>
0055 #include <linux/jiffies.h>
0056 #include <net/neighbour.h>
0057 #include <net/dst.h>
0058 #include <net/flow.h>
0059 #include <net/dn.h>
0060 #include <net/dn_nsp.h>
0061 #include <net/dn_dev.h>
0062 #include <net/dn_route.h>
0063
0064
0065 static int nsp_backoff[NSP_MAXRXTSHIFT + 1] = { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 };
0066
0067 static void dn_nsp_send(struct sk_buff *skb)
0068 {
0069 struct sock *sk = skb->sk;
0070 struct dn_scp *scp = DN_SK(sk);
0071 struct dst_entry *dst;
0072 struct flowidn fld;
0073
0074 skb_reset_transport_header(skb);
0075 scp->stamp = jiffies;
0076
0077 dst = sk_dst_check(sk, 0);
0078 if (dst) {
0079 try_again:
0080 skb_dst_set(skb, dst);
0081 dst_output(&init_net, skb->sk, skb);
0082 return;
0083 }
0084
0085 memset(&fld, 0, sizeof(fld));
0086 fld.flowidn_oif = sk->sk_bound_dev_if;
0087 fld.saddr = dn_saddr2dn(&scp->addr);
0088 fld.daddr = dn_saddr2dn(&scp->peer);
0089 dn_sk_ports_copy(&fld, scp);
0090 fld.flowidn_proto = DNPROTO_NSP;
0091 if (dn_route_output_sock(&sk->sk_dst_cache, &fld, sk, 0) == 0) {
0092 dst = sk_dst_get(sk);
0093 sk->sk_route_caps = dst->dev->features;
0094 goto try_again;
0095 }
0096
0097 sk->sk_err = EHOSTUNREACH;
0098 if (!sock_flag(sk, SOCK_DEAD))
0099 sk->sk_state_change(sk);
0100 }
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111 struct sk_buff *dn_alloc_skb(struct sock *sk, int size, gfp_t pri)
0112 {
0113 struct sk_buff *skb;
0114 int hdr = 64;
0115
0116 if ((skb = alloc_skb(size + hdr, pri)) == NULL)
0117 return NULL;
0118
0119 skb->protocol = htons(ETH_P_DNA_RT);
0120 skb->pkt_type = PACKET_OUTGOING;
0121
0122 if (sk)
0123 skb_set_owner_w(skb, sk);
0124
0125 skb_reserve(skb, hdr);
0126
0127 return skb;
0128 }
0129
0130
0131
0132
0133
0134
0135 unsigned long dn_nsp_persist(struct sock *sk)
0136 {
0137 struct dn_scp *scp = DN_SK(sk);
0138
0139 unsigned long t = ((scp->nsp_srtt >> 2) + scp->nsp_rttvar) >> 1;
0140
0141 t *= nsp_backoff[scp->nsp_rxtshift];
0142
0143 if (t < HZ) t = HZ;
0144 if (t > (600*HZ)) t = (600*HZ);
0145
0146 if (scp->nsp_rxtshift < NSP_MAXRXTSHIFT)
0147 scp->nsp_rxtshift++;
0148
0149
0150
0151 return t;
0152 }
0153
0154
0155
0156
0157
0158 static void dn_nsp_rtt(struct sock *sk, long rtt)
0159 {
0160 struct dn_scp *scp = DN_SK(sk);
0161 long srtt = (long)scp->nsp_srtt;
0162 long rttvar = (long)scp->nsp_rttvar;
0163 long delta;
0164
0165
0166
0167
0168
0169
0170 if (rtt < 0)
0171 rtt = -rtt;
0172
0173
0174
0175 delta = ((rtt << 3) - srtt);
0176 srtt += (delta >> 3);
0177 if (srtt >= 1)
0178 scp->nsp_srtt = (unsigned long)srtt;
0179 else
0180 scp->nsp_srtt = 1;
0181
0182
0183
0184
0185 delta >>= 1;
0186 rttvar += ((((delta>0)?(delta):(-delta)) - rttvar) >> 2);
0187 if (rttvar >= 1)
0188 scp->nsp_rttvar = (unsigned long)rttvar;
0189 else
0190 scp->nsp_rttvar = 1;
0191
0192
0193 }
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204 static inline unsigned int dn_nsp_clone_and_send(struct sk_buff *skb,
0205 gfp_t gfp)
0206 {
0207 struct dn_skb_cb *cb = DN_SKB_CB(skb);
0208 struct sk_buff *skb2;
0209 int ret = 0;
0210
0211 if ((skb2 = skb_clone(skb, gfp)) != NULL) {
0212 ret = cb->xmit_count;
0213 cb->xmit_count++;
0214 cb->stamp = jiffies;
0215 skb2->sk = skb->sk;
0216 dn_nsp_send(skb2);
0217 }
0218
0219 return ret;
0220 }
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231 void dn_nsp_output(struct sock *sk)
0232 {
0233 struct dn_scp *scp = DN_SK(sk);
0234 struct sk_buff *skb;
0235 unsigned int reduce_win = 0;
0236
0237
0238
0239
0240 if ((skb = skb_peek(&scp->other_xmit_queue)) != NULL)
0241 reduce_win = dn_nsp_clone_and_send(skb, GFP_ATOMIC);
0242
0243
0244
0245
0246
0247
0248 if (reduce_win || (scp->flowrem_sw != DN_SEND))
0249 goto recalc_window;
0250
0251 if ((skb = skb_peek(&scp->data_xmit_queue)) != NULL)
0252 reduce_win = dn_nsp_clone_and_send(skb, GFP_ATOMIC);
0253
0254
0255
0256
0257
0258
0259 recalc_window:
0260 if (reduce_win) {
0261 scp->snd_window >>= 1;
0262 if (scp->snd_window < NSP_MIN_WINDOW)
0263 scp->snd_window = NSP_MIN_WINDOW;
0264 }
0265 }
0266
0267 int dn_nsp_xmit_timeout(struct sock *sk)
0268 {
0269 struct dn_scp *scp = DN_SK(sk);
0270
0271 dn_nsp_output(sk);
0272
0273 if (!skb_queue_empty(&scp->data_xmit_queue) ||
0274 !skb_queue_empty(&scp->other_xmit_queue))
0275 scp->persist = dn_nsp_persist(sk);
0276
0277 return 0;
0278 }
0279
0280 static inline __le16 *dn_mk_common_header(struct dn_scp *scp, struct sk_buff *skb, unsigned char msgflag, int len)
0281 {
0282 unsigned char *ptr = skb_push(skb, len);
0283
0284 BUG_ON(len < 5);
0285
0286 *ptr++ = msgflag;
0287 *((__le16 *)ptr) = scp->addrrem;
0288 ptr += 2;
0289 *((__le16 *)ptr) = scp->addrloc;
0290 ptr += 2;
0291 return (__le16 __force *)ptr;
0292 }
0293
0294 static __le16 *dn_mk_ack_header(struct sock *sk, struct sk_buff *skb, unsigned char msgflag, int hlen, int other)
0295 {
0296 struct dn_scp *scp = DN_SK(sk);
0297 unsigned short acknum = scp->numdat_rcv & 0x0FFF;
0298 unsigned short ackcrs = scp->numoth_rcv & 0x0FFF;
0299 __le16 *ptr;
0300
0301 BUG_ON(hlen < 9);
0302
0303 scp->ackxmt_dat = acknum;
0304 scp->ackxmt_oth = ackcrs;
0305 acknum |= 0x8000;
0306 ackcrs |= 0x8000;
0307
0308
0309 if (other)
0310 swap(acknum, ackcrs);
0311
0312
0313 ackcrs |= 0x2000;
0314
0315 ptr = dn_mk_common_header(scp, skb, msgflag, hlen);
0316
0317 *ptr++ = cpu_to_le16(acknum);
0318 *ptr++ = cpu_to_le16(ackcrs);
0319
0320 return ptr;
0321 }
0322
0323 static __le16 *dn_nsp_mk_data_header(struct sock *sk, struct sk_buff *skb, int oth)
0324 {
0325 struct dn_scp *scp = DN_SK(sk);
0326 struct dn_skb_cb *cb = DN_SKB_CB(skb);
0327 __le16 *ptr = dn_mk_ack_header(sk, skb, cb->nsp_flags, 11, oth);
0328
0329 if (unlikely(oth)) {
0330 cb->segnum = scp->numoth;
0331 seq_add(&scp->numoth, 1);
0332 } else {
0333 cb->segnum = scp->numdat;
0334 seq_add(&scp->numdat, 1);
0335 }
0336 *(ptr++) = cpu_to_le16(cb->segnum);
0337
0338 return ptr;
0339 }
0340
0341 void dn_nsp_queue_xmit(struct sock *sk, struct sk_buff *skb,
0342 gfp_t gfp, int oth)
0343 {
0344 struct dn_scp *scp = DN_SK(sk);
0345 struct dn_skb_cb *cb = DN_SKB_CB(skb);
0346 unsigned long t = ((scp->nsp_srtt >> 2) + scp->nsp_rttvar) >> 1;
0347
0348 cb->xmit_count = 0;
0349 dn_nsp_mk_data_header(sk, skb, oth);
0350
0351
0352
0353
0354
0355 if (time_is_before_jiffies(scp->stamp + t))
0356 scp->snd_window = NSP_MIN_WINDOW;
0357
0358 if (oth)
0359 skb_queue_tail(&scp->other_xmit_queue, skb);
0360 else
0361 skb_queue_tail(&scp->data_xmit_queue, skb);
0362
0363 if (scp->flowrem_sw != DN_SEND)
0364 return;
0365
0366 dn_nsp_clone_and_send(skb, gfp);
0367 }
0368
0369
0370 int dn_nsp_check_xmit_queue(struct sock *sk, struct sk_buff *skb, struct sk_buff_head *q, unsigned short acknum)
0371 {
0372 struct dn_skb_cb *cb = DN_SKB_CB(skb);
0373 struct dn_scp *scp = DN_SK(sk);
0374 struct sk_buff *skb2, *n, *ack = NULL;
0375 int wakeup = 0;
0376 int try_retrans = 0;
0377 unsigned long reftime = cb->stamp;
0378 unsigned long pkttime;
0379 unsigned short xmit_count;
0380 unsigned short segnum;
0381
0382 skb_queue_walk_safe(q, skb2, n) {
0383 struct dn_skb_cb *cb2 = DN_SKB_CB(skb2);
0384
0385 if (dn_before_or_equal(cb2->segnum, acknum))
0386 ack = skb2;
0387
0388
0389
0390 if (ack == NULL)
0391 continue;
0392
0393
0394
0395
0396 try_retrans = 0;
0397
0398 wakeup = 1;
0399
0400 pkttime = cb2->stamp;
0401 xmit_count = cb2->xmit_count;
0402 segnum = cb2->segnum;
0403
0404 skb_unlink(ack, q);
0405 kfree_skb(ack);
0406 ack = NULL;
0407
0408
0409
0410
0411
0412 WARN_ON(xmit_count == 0);
0413
0414
0415
0416
0417
0418
0419 if (xmit_count == 1) {
0420 if (dn_equal(segnum, acknum))
0421 dn_nsp_rtt(sk, (long)(pkttime - reftime));
0422
0423 if (scp->snd_window < scp->max_window)
0424 scp->snd_window++;
0425 }
0426
0427
0428
0429
0430
0431
0432
0433 if (xmit_count > 1)
0434 try_retrans = 1;
0435 }
0436
0437 if (try_retrans)
0438 dn_nsp_output(sk);
0439
0440 return wakeup;
0441 }
0442
0443 void dn_nsp_send_data_ack(struct sock *sk)
0444 {
0445 struct sk_buff *skb = NULL;
0446
0447 if ((skb = dn_alloc_skb(sk, 9, GFP_ATOMIC)) == NULL)
0448 return;
0449
0450 skb_reserve(skb, 9);
0451 dn_mk_ack_header(sk, skb, 0x04, 9, 0);
0452 dn_nsp_send(skb);
0453 }
0454
0455 void dn_nsp_send_oth_ack(struct sock *sk)
0456 {
0457 struct sk_buff *skb = NULL;
0458
0459 if ((skb = dn_alloc_skb(sk, 9, GFP_ATOMIC)) == NULL)
0460 return;
0461
0462 skb_reserve(skb, 9);
0463 dn_mk_ack_header(sk, skb, 0x14, 9, 1);
0464 dn_nsp_send(skb);
0465 }
0466
0467
0468 void dn_send_conn_ack (struct sock *sk)
0469 {
0470 struct dn_scp *scp = DN_SK(sk);
0471 struct sk_buff *skb = NULL;
0472 struct nsp_conn_ack_msg *msg;
0473
0474 if ((skb = dn_alloc_skb(sk, 3, sk->sk_allocation)) == NULL)
0475 return;
0476
0477 msg = skb_put(skb, 3);
0478 msg->msgflg = 0x24;
0479 msg->dstaddr = scp->addrrem;
0480
0481 dn_nsp_send(skb);
0482 }
0483
0484 static int dn_nsp_retrans_conn_conf(struct sock *sk)
0485 {
0486 struct dn_scp *scp = DN_SK(sk);
0487
0488 if (scp->state == DN_CC)
0489 dn_send_conn_conf(sk, GFP_ATOMIC);
0490
0491 return 0;
0492 }
0493
0494 void dn_send_conn_conf(struct sock *sk, gfp_t gfp)
0495 {
0496 struct dn_scp *scp = DN_SK(sk);
0497 struct sk_buff *skb = NULL;
0498 struct nsp_conn_init_msg *msg;
0499 __u8 len = (__u8)le16_to_cpu(scp->conndata_out.opt_optl);
0500
0501 if ((skb = dn_alloc_skb(sk, 50 + len, gfp)) == NULL)
0502 return;
0503
0504 msg = skb_put(skb, sizeof(*msg));
0505 msg->msgflg = 0x28;
0506 msg->dstaddr = scp->addrrem;
0507 msg->srcaddr = scp->addrloc;
0508 msg->services = scp->services_loc;
0509 msg->info = scp->info_loc;
0510 msg->segsize = cpu_to_le16(scp->segsize_loc);
0511
0512 skb_put_u8(skb, len);
0513
0514 if (len > 0)
0515 skb_put_data(skb, scp->conndata_out.opt_data, len);
0516
0517
0518 dn_nsp_send(skb);
0519
0520 scp->persist = dn_nsp_persist(sk);
0521 scp->persist_fxn = dn_nsp_retrans_conn_conf;
0522 }
0523
0524
0525 static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg,
0526 unsigned short reason, gfp_t gfp,
0527 struct dst_entry *dst,
0528 int ddl, unsigned char *dd, __le16 rem, __le16 loc)
0529 {
0530 struct sk_buff *skb = NULL;
0531 int size = 7 + ddl + ((msgflg == NSP_DISCINIT) ? 1 : 0);
0532 unsigned char *msg;
0533
0534 if ((dst == NULL) || (rem == 0)) {
0535 net_dbg_ratelimited("DECnet: dn_nsp_do_disc: BUG! Please report this to SteveW@ACM.org rem=%u dst=%p\n",
0536 le16_to_cpu(rem), dst);
0537 return;
0538 }
0539
0540 if ((skb = dn_alloc_skb(sk, size, gfp)) == NULL)
0541 return;
0542
0543 msg = skb_put(skb, size);
0544 *msg++ = msgflg;
0545 *(__le16 *)msg = rem;
0546 msg += 2;
0547 *(__le16 *)msg = loc;
0548 msg += 2;
0549 *(__le16 *)msg = cpu_to_le16(reason);
0550 msg += 2;
0551 if (msgflg == NSP_DISCINIT)
0552 *msg++ = ddl;
0553
0554 if (ddl) {
0555 memcpy(msg, dd, ddl);
0556 }
0557
0558
0559
0560
0561
0562
0563 skb_dst_set(skb, dst_clone(dst));
0564 dst_output(&init_net, skb->sk, skb);
0565 }
0566
0567
0568 void dn_nsp_send_disc(struct sock *sk, unsigned char msgflg,
0569 unsigned short reason, gfp_t gfp)
0570 {
0571 struct dn_scp *scp = DN_SK(sk);
0572 int ddl = 0;
0573
0574 if (msgflg == NSP_DISCINIT)
0575 ddl = le16_to_cpu(scp->discdata_out.opt_optl);
0576
0577 if (reason == 0)
0578 reason = le16_to_cpu(scp->discdata_out.opt_status);
0579
0580 dn_nsp_do_disc(sk, msgflg, reason, gfp, __sk_dst_get(sk), ddl,
0581 scp->discdata_out.opt_data, scp->addrrem, scp->addrloc);
0582 }
0583
0584
0585 void dn_nsp_return_disc(struct sk_buff *skb, unsigned char msgflg,
0586 unsigned short reason)
0587 {
0588 struct dn_skb_cb *cb = DN_SKB_CB(skb);
0589 int ddl = 0;
0590 gfp_t gfp = GFP_ATOMIC;
0591
0592 dn_nsp_do_disc(NULL, msgflg, reason, gfp, skb_dst(skb), ddl,
0593 NULL, cb->src_port, cb->dst_port);
0594 }
0595
0596
0597 void dn_nsp_send_link(struct sock *sk, unsigned char lsflags, char fcval)
0598 {
0599 struct dn_scp *scp = DN_SK(sk);
0600 struct sk_buff *skb;
0601 unsigned char *ptr;
0602 gfp_t gfp = GFP_ATOMIC;
0603
0604 if ((skb = dn_alloc_skb(sk, DN_MAX_NSP_DATA_HEADER + 2, gfp)) == NULL)
0605 return;
0606
0607 skb_reserve(skb, DN_MAX_NSP_DATA_HEADER);
0608 ptr = skb_put(skb, 2);
0609 DN_SKB_CB(skb)->nsp_flags = 0x10;
0610 *ptr++ = lsflags;
0611 *ptr = fcval;
0612
0613 dn_nsp_queue_xmit(sk, skb, gfp, 1);
0614
0615 scp->persist = dn_nsp_persist(sk);
0616 scp->persist_fxn = dn_nsp_xmit_timeout;
0617 }
0618
0619 static int dn_nsp_retrans_conninit(struct sock *sk)
0620 {
0621 struct dn_scp *scp = DN_SK(sk);
0622
0623 if (scp->state == DN_CI)
0624 dn_nsp_send_conninit(sk, NSP_RCI);
0625
0626 return 0;
0627 }
0628
0629 void dn_nsp_send_conninit(struct sock *sk, unsigned char msgflg)
0630 {
0631 struct dn_scp *scp = DN_SK(sk);
0632 struct nsp_conn_init_msg *msg;
0633 unsigned char aux;
0634 unsigned char menuver;
0635 struct dn_skb_cb *cb;
0636 unsigned char type = 1;
0637 gfp_t allocation = (msgflg == NSP_CI) ? sk->sk_allocation : GFP_ATOMIC;
0638 struct sk_buff *skb = dn_alloc_skb(sk, 200, allocation);
0639
0640 if (!skb)
0641 return;
0642
0643 cb = DN_SKB_CB(skb);
0644 msg = skb_put(skb, sizeof(*msg));
0645
0646 msg->msgflg = msgflg;
0647 msg->dstaddr = 0x0000;
0648
0649 msg->srcaddr = scp->addrloc;
0650 msg->services = scp->services_loc;
0651 msg->info = scp->info_loc;
0652 msg->segsize = cpu_to_le16(scp->segsize_loc);
0653
0654 if (scp->peer.sdn_objnum)
0655 type = 0;
0656
0657 skb_put(skb, dn_sockaddr2username(&scp->peer,
0658 skb_tail_pointer(skb), type));
0659 skb_put(skb, dn_sockaddr2username(&scp->addr,
0660 skb_tail_pointer(skb), 2));
0661
0662 menuver = DN_MENUVER_ACC | DN_MENUVER_USR;
0663 if (scp->peer.sdn_flags & SDF_PROXY)
0664 menuver |= DN_MENUVER_PRX;
0665 if (scp->peer.sdn_flags & SDF_UICPROXY)
0666 menuver |= DN_MENUVER_UIC;
0667
0668 skb_put_u8(skb, menuver);
0669
0670 aux = scp->accessdata.acc_userl;
0671 skb_put_u8(skb, aux);
0672 if (aux > 0)
0673 skb_put_data(skb, scp->accessdata.acc_user, aux);
0674
0675 aux = scp->accessdata.acc_passl;
0676 skb_put_u8(skb, aux);
0677 if (aux > 0)
0678 skb_put_data(skb, scp->accessdata.acc_pass, aux);
0679
0680 aux = scp->accessdata.acc_accl;
0681 skb_put_u8(skb, aux);
0682 if (aux > 0)
0683 skb_put_data(skb, scp->accessdata.acc_acc, aux);
0684
0685 aux = (__u8)le16_to_cpu(scp->conndata_out.opt_optl);
0686 skb_put_u8(skb, aux);
0687 if (aux > 0)
0688 skb_put_data(skb, scp->conndata_out.opt_data, aux);
0689
0690 scp->persist = dn_nsp_persist(sk);
0691 scp->persist_fxn = dn_nsp_retrans_conninit;
0692
0693 cb->rt_flags = DN_RT_F_RQR;
0694
0695 dn_nsp_send(skb);
0696 }