40 #include <linux/errno.h>
41 #include <linux/types.h>
42 #include <linux/socket.h>
44 #include <linux/kernel.h>
46 #include <linux/string.h>
48 #include <linux/net.h>
49 #include <linux/netdevice.h>
52 #include <linux/slab.h>
54 #include <linux/fcntl.h>
59 #include <linux/stat.h>
61 #include <linux/poll.h>
72 static int nsp_backoff[
NSP_MAXRXTSHIFT + 1] = { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 };
81 skb_reset_transport_header(skb);
87 skb_dst_set(skb, dst);
92 memset(&fld, 0,
sizeof(fld));
93 fld.flowidn_oif = sk->sk_bound_dev_if;
94 fld.saddr = dn_saddr2dn(&scp->
addr);
95 fld.daddr = dn_saddr2dn(&scp->
peer);
96 dn_sk_ports_copy(&fld, scp);
123 if ((skb = alloc_skb(size + hdr, pri)) ==
NULL)
130 skb_set_owner_w(skb, sk);
132 skb_reserve(skb, hdr);
144 struct dn_scp *scp = DN_SK(sk);
151 if (t > (600*
HZ)) t = (600*
HZ);
165 static void dn_nsp_rtt(
struct sock *sk,
long rtt)
167 struct dn_scp *scp = DN_SK(sk);
182 delta = ((rtt << 3) - srtt);
183 srtt += (delta >> 3);
193 rttvar += ((((delta>0)?(delta):(-
delta)) - rttvar) >> 2);
211 static inline unsigned int dn_nsp_clone_and_send(
struct sk_buff *skb,
240 struct dn_scp *scp = DN_SK(sk);
242 unsigned int reduce_win = 0;
248 reduce_win = dn_nsp_clone_and_send(skb,
GFP_ATOMIC);
259 reduce_win = dn_nsp_clone_and_send(skb,
GFP_ATOMIC);
276 struct dn_scp *scp = DN_SK(sk);
287 static inline __le16 *dn_mk_common_header(
struct dn_scp *scp,
struct sk_buff *skb,
unsigned char msgflag,
int len)
301 static __le16 *dn_mk_ack_header(
struct sock *sk,
struct sk_buff *skb,
unsigned char msgflag,
int hlen,
int other)
303 struct dn_scp *scp = DN_SK(sk);
304 unsigned short acknum = scp->
numdat_rcv & 0x0FFF;
305 unsigned short ackcrs = scp->
numoth_rcv & 0x0FFF;
317 unsigned short tmp = acknum;
325 ptr = dn_mk_common_header(scp, skb, msgflag, hlen);
335 struct dn_scp *scp = DN_SK(sk);
354 struct dn_scp *scp = DN_SK(sk);
359 dn_nsp_mk_data_header(sk, skb, oth);
376 dn_nsp_clone_and_send(skb, gfp);
383 struct dn_scp *scp = DN_SK(sk);
387 unsigned long reftime = cb->
stamp;
388 unsigned long pkttime;
389 unsigned short xmit_count;
390 unsigned short segnum;
392 skb_queue_walk_safe(q, skb2, n) {
395 if (dn_before_or_equal(cb2->
segnum, acknum))
410 pkttime = cb2->
stamp;
429 if (xmit_count == 1) {
430 if (dn_equal(segnum, acknum))
431 dn_nsp_rtt(sk, (
long)(pkttime - reftime));
461 dn_mk_ack_header(sk, skb, 0x04, 9, 0);
473 dn_mk_ack_header(sk, skb, 0x14, 9, 1);
480 struct dn_scp *scp = DN_SK(sk);
496 struct dn_scp *scp = DN_SK(sk);
505 static int dn_nsp_retrans_conn_conf(
struct sock *sk)
507 struct dn_scp *scp = DN_SK(sk);
517 struct dn_scp *scp = DN_SK(sk);
555 if ((dst ==
NULL) || (rem == 0)) {
584 skb_dst_set(skb, dst_clone(dst));
592 struct dn_scp *scp = DN_SK(sk);
601 dn_nsp_do_disc(sk, msgflg, reason, gfp, sk->
sk_dst_cache, ddl,
613 dn_nsp_do_disc(
NULL, msgflg, reason, gfp, skb_dst(skb), ddl,
620 struct dn_scp *scp = DN_SK(sk);
640 static int dn_nsp_retrans_conninit(
struct sock *sk)
642 struct dn_scp *scp = DN_SK(sk);
652 struct dn_scp *scp = DN_SK(sk);
655 unsigned char menuver;
657 unsigned char type = 1;
675 if (scp->
peer.sdn_objnum)
679 skb_tail_pointer(skb), type));
681 skb_tail_pointer(skb), 2));