Yeah, you definitely can as long as you want :) Sent from my iPhone
> On Jul 6, 2018, at 8:12 PM, Jon Maloy <jon.ma...@ericsson.com> wrote: > > Hi, > Agree with your comment, but that would be some other patch. > Can I put an "acked-by" on this ? > > ///jon > >> -----Original Message----- >> From: Ying Xue <ying....@windriver.com> >> Sent: Friday, 06 July, 2018 07:35 >> To: Jon Maloy <jon.ma...@ericsson.com>; Jon Maloy <ma...@donjonn.com> >> Cc: Mohan Krishna Ghanta Krishnamurthy >> <mohan.krishna.ghanta.krishnamur...@ericsson.com>; Tung Quang Nguyen >> <tung.q.ngu...@dektech.com.au>; Hoang Huu Le <hoang.h...@dektech.com.au>; >> Canh Duc Luu <canh.d....@dektech.com.au>; >> Gordan Mihaljevic <gordan.mihalje...@dektech.com.au>; >> parthasarathy.bhuvara...@gmail.com; tipc- >> discuss...@lists.sourceforge.net >> Subject: Re: [net-next 1/1] tipc: extend link reset criteria for stale >> packet retransmission >> >>> On 07/06/2018 09:11 AM, Jon Maloy wrote: >>> Currently a link is declared stale and reset if there has been 100 >>> repeated attempts to retransmit the same packet. However, in certain >>> infrastrucures we see that packet duplicates and delays may cause >> >> s/infrastrucures/infrastructures >> >>> such retransmit attempts to occur at a high rate, so that the peer >>> doesn't have a reasonable chance to acknowledge the reception before >>> the 100-limit is hit. This may take much less than the stipulated link >>> tolerance time, and despite that probe/probe replies otherwise go >>> through as normal. >>> >>> We now extend the criteria for link reset to also being time based. >>> I.e., we don't reset the link until the link tolerance time is passed >>> AND we have made more than 100 retransmissions attempts. >>> >> >> Good idea. >> >> But I also ever observed another phenomenon before. In most of cases >> many retransmission requests were caused because packets were out of >> order on receipt side, not because the missing packages are really lost. >> >> For example we often meet such case: after a node just requests its peer >> to retransmit a series of packets, its requested packets arrive >> subsequently. It means the unnecessary retransmission requests wasted >> lot of network bandwidth. Especially for broadcast link, the situation >> is much worse. >> >> Therefore, we need to figure out one method to postpone a bit >> retransmission request. >> >> Of course, I am not object to this patch, instead it's is quite good. >> >>> Signed-off-by: Jon Maloy <jon.ma...@ericsson.com> >>> --- >>> net/tipc/link.c | 43 ++++++++++++++++++++++++------------------- >>> 1 file changed, 24 insertions(+), 19 deletions(-) >>> >>> diff --git a/net/tipc/link.c b/net/tipc/link.c >>> index 4798a8b..ea1d9d0 100644 >>> --- a/net/tipc/link.c >>> +++ b/net/tipc/link.c >>> @@ -106,7 +106,8 @@ struct tipc_stats { >>> * @backlogq: queue for messages waiting to be sent >>> * @snt_nxt: next sequence number to use for outbound messages >>> * @last_retransmitted: sequence number of most recently retransmitted >>> message >>> - * @stale_count: # of identical retransmit requests made by peer >>> + * @stale_cnt: counter for number of identical retransmit attempts >>> + * @stale_limit: time when repeated identical retransmits must force link >>> reset >>> * @ackers: # of peers that needs to ack each packet before it can be >>> released >>> * @acked: # last packet acked by a certain peer. Used for broadcast. >>> * @rcv_nxt: next sequence number to expect for inbound messages >>> @@ -162,7 +163,8 @@ struct tipc_link { >>> u16 snd_nxt; >>> u16 last_retransm; >>> u16 window; >>> - u32 stale_count; >>> + u16 stale_cnt; >>> + unsigned long stale_limit; >>> >>> /* Reception */ >>> u16 rcv_nxt; >>> @@ -856,7 +858,7 @@ void tipc_link_reset(struct tipc_link *l) >>> l->acked = 0; >>> l->silent_intv_cnt = 0; >>> l->rst_cnt = 0; >>> - l->stale_count = 0; >>> + l->stale_cnt = 0; >>> l->bc_peer_is_up = false; >>> memset(&l->mon_state, 0, sizeof(l->mon_state)); >>> tipc_link_reset_stats(l); >>> @@ -993,39 +995,41 @@ static void link_retransmit_failure(struct tipc_link >>> *l, struct sk_buff *skb) >>> msg_seqno(hdr), msg_prevnode(hdr), msg_orignode(hdr)); >>> } >>> >>> -int tipc_link_retrans(struct tipc_link *l, struct tipc_link *nacker, >>> +/* tipc_link_retrans() - retransmit one or more packets >>> + * @l: the link to transmit on >>> + * @r: the receiving link ordering the retransmit. Same as l if unicast >>> + * @from: retransmit from (inclusive) this sequence number >>> + * @to: retransmit to (inclusive) this sequence number >>> + * xmitq: queue for accumulating the retransmitted packets >>> + */ >>> +int tipc_link_retrans(struct tipc_link *l, struct tipc_link *r, >>> u16 from, u16 to, struct sk_buff_head *xmitq) >>> { >>> struct sk_buff *_skb, *skb = skb_peek(&l->transmq); >>> - struct tipc_msg *hdr; >>> - u16 ack = l->rcv_nxt - 1; >>> u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1; >>> + u16 ack = l->rcv_nxt - 1; >>> + struct tipc_msg *hdr; >>> >>> if (!skb) >>> return 0; >>> >>> /* Detect repeated retransmit failures on same packet */ >>> - if (nacker->last_retransm != buf_seqno(skb)) { >>> - nacker->last_retransm = buf_seqno(skb); >>> - nacker->stale_count = 1; >>> - } else if (++nacker->stale_count > 100) { >>> + if (r->last_retransm != buf_seqno(skb)) { >>> + r->last_retransm = buf_seqno(skb); >>> + r->stale_limit = jiffies + msecs_to_jiffies(l->tolerance); >>> + } else if (time_after(jiffies, r->stale_limit) && ++r->stale_cnt > 99) >>> { >>> link_retransmit_failure(l, skb); >>> - nacker->stale_count = 0; >> >> Sorry, I could not understand why we don't reset l->stale_cnt here, but >> resetting it is moved to tipc_link_rcv(). >> >> Thanks, >> Ying >> >>> if (link_is_bc_sndlink(l)) >>> return TIPC_LINK_DOWN_EVT; >>> return tipc_link_fsm_evt(l, LINK_FAILURE_EVT); >>> } >>> >>> - /* Move forward to where retransmission should start */ >>> skb_queue_walk(&l->transmq, skb) { >>> - if (!less(buf_seqno(skb), from)) >>> - break; >>> - } >>> - >>> - skb_queue_walk_from(&l->transmq, skb) { >>> - if (more(buf_seqno(skb), to)) >>> - break; >>> hdr = buf_msg(skb); >>> + if (less(msg_seqno(hdr), from)) >>> + continue; >>> + if (more(msg_seqno(hdr), to)) >>> + break; >>> _skb = __pskb_copy(skb, MIN_H_SIZE, GFP_ATOMIC); >>> if (!_skb) >>> return 0; >>> @@ -1268,6 +1272,7 @@ int tipc_link_rcv(struct tipc_link *l, struct sk_buff >>> *skb, >>> >>> /* Forward queues and wake up waiting users */ >>> if (likely(tipc_link_release_pkts(l, msg_ack(hdr)))) { >>> + l->stale_cnt = 0; >>> tipc_link_advance_backlog(l, xmitq); >>> if (unlikely(!skb_queue_empty(&l->wakeupq))) >>> link_prepare_wakeup(l); >>> ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion