2 * Connection oriented routing
3 * Copyright (C) 2007-2008 Michael Blizek
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 #include <asm/byteorder.h>
25 /* not sent over the network - internal meaning only */
26 #define MSGTYPE_PONG 1
28 #define MSGTYPE_ACK_CONN 3
29 #define MSGTYPE_ACK_CONN_OOO 4
30 #define MSGTYPE_CONNECT 5
31 #define MSGTYPE_CONNECT_SUCCESS 6
32 #define MSGTYPE_RESET_CONN 7
33 #define MSGTYPE_CONNDATA 8
34 #define MSGTYPE_PING_CONN 9
35 #define MSGTYPE_CONNID_UNKNOWN 10
36 #define MSGTYPE_PING_ALL_CONNS 11
37 #define MSGTYPE_SET_MAX_CMSG_DELAY 12
39 struct control_msg_out
{
40 struct list_head lh
; /* either neighbor or control_retrans_packet */
49 unsigned long time_enqueued
; /* jiffies */
105 struct control_retrans
{
111 unsigned long timeout
;
113 struct list_head msgs
;
115 struct htab_entry htab_entry
;
116 struct list_head timeout_list
;
119 struct kmem_cache
*controlmsg_slab
;
120 struct kmem_cache
*controlretrans_slab
;
122 static struct htable retransmits
;
124 atomic_t cmcnt
= ATOMIC_INIT(0);
126 static void add_control_msg(struct control_msg_out
*msg
, int retrans
);
128 static inline int isurgent(struct control_msg_out
*cm
)
130 if (unlikely(cm
->type
== MSGTYPE_PONG
|| cm
->type
== MSGTYPE_ACK
))
135 static struct control_msg_out
*__alloc_control_msg(void)
137 struct control_msg_out
*cm
= kmem_cache_alloc(controlmsg_slab
,
139 if (unlikely(cm
== 0))
141 cm
->lh
.next
= LIST_POISON1
;
142 cm
->lh
.prev
= LIST_POISON2
;
146 static int calc_limit(int limit
, int priority
)
148 if (priority
== ACM_PRIORITY_LOW
)
150 else if (priority
== ACM_PRIORITY_MED
)
151 return (limit
*3 + 3)/4;
152 else if (priority
== ACM_PRIORITY_HIGH
)
158 static struct control_msg_out
*_alloc_control_msg(struct neighbor
*nb
,
159 int priority
, int urgent
)
161 struct control_msg_out
*cm
= 0;
166 long packets1
= atomic_inc_return(&(nb
->cmcnt
));
167 long packets2
= atomic_inc_return(&(cmcnt
));
169 BUG_ON(packets1
<= 0);
170 BUG_ON(packets2
<= 0);
172 if (packets1
<= calc_limit(GUARANTEED_CMSGS_PER_NEIGH
,
176 if (unlikely(unlikely(packets2
> calc_limit(MAX_CMSGS_PER_NEIGH
,
177 priority
)) || unlikely(packets1
> (
178 calc_limit(MAX_CMSGS_PER_NEIGH
, priority
) *
179 (MAX_CMSGS
- packets2
) / MAX_CMSGS
))))
184 cm
= __alloc_control_msg();
185 if (unlikely(cm
== 0))
192 atomic_dec(&(nb
->cmcnt
));
193 atomic_dec(&(cmcnt
));
199 struct control_msg_out
*alloc_control_msg(struct neighbor
*nb
, int priority
)
201 return _alloc_control_msg(nb
, priority
, 0);
204 void free_control_msg(struct control_msg_out
*cm
)
206 if (isurgent(cm
) == 0) {
207 atomic_dec(&(cm
->nb
->cmcnt
));
208 atomic_dec(&(cmcnt
));
211 kmem_cache_free(controlmsg_slab
, cm
);
214 static void free_control_retrans(struct kref
*ref
)
216 struct control_retrans
*cr
= container_of(ref
, struct control_retrans
,
219 while (list_empty(&(cr
->msgs
)) == 0) {
220 struct control_msg_out
*cm
= container_of(cr
->msgs
.next
,
221 struct control_msg_out
, lh
);
223 free_control_msg(cm
);
226 kmem_cache_free(controlretrans_slab
, cr
);
229 struct retransmit_matchparam
{
234 static __u32
rm_to_key(struct retransmit_matchparam
*rm
)
236 return ((__u32
)((long) rm
->nb
)) ^ rm
->seqno
;
239 static void set_retrans_timeout(struct control_retrans
*cr
, struct neighbor
*nb
)
241 cr
->timeout
= jiffies
+ usecs_to_jiffies(100000 +
242 ((__u32
) atomic_read(&(nb
->latency
))) * 2 +
243 ((__u32
) atomic_read(&(nb
->max_remote_cmsg_delay
))));
246 void retransmit_timerfunc(struct work_struct
*work
)
248 unsigned long iflags
;
250 struct neighbor
*nb
= container_of(to_delayed_work(work
),
251 struct neighbor
, retrans_timer
);
256 spin_lock_irqsave( &(nb
->state_lock
), iflags
);
258 spin_unlock_irqrestore( &(nb
->state_lock
), iflags
);
261 struct control_retrans
*cr
= 0;
262 struct retransmit_matchparam rm
;
264 spin_lock_irqsave( &(nb
->retrans_lock
), iflags
);
266 if (list_empty(&(nb
->retrans_list
))) {
267 nb
->retrans_timer_running
= 0;
272 cr
= container_of(nb
->retrans_list
.next
,
273 struct control_retrans
, timeout_list
);
275 BUG_ON(cr
->nb
!= nb
);
277 rm
.seqno
= cr
->seqno
;
280 list_del(&(cr
->timeout_list
));
282 if (unlikely(nbstate
== NEIGHBOR_STATE_KILLED
)) {
283 spin_unlock_irqrestore( &(nb
->retrans_lock
), iflags
);
285 htable_delete(&retransmits
, rm_to_key(&rm
), &rm
,
286 free_control_retrans
);
287 kref_put(&(cr
->ref
), free_control_retrans
);
291 if (time_after(cr
->timeout
, jiffies
)) {
292 list_add(&(cr
->timeout_list
), &(nb
->retrans_list
));
293 schedule_delayed_work(&(nb
->retrans_timer
),
294 cr
->timeout
- jiffies
);
298 if (unlikely(htable_delete(&retransmits
, rm_to_key(&rm
), &rm
,
299 free_control_retrans
)))
302 spin_unlock_irqrestore( &(nb
->retrans_lock
), iflags
);
304 while (list_empty(&(cr
->msgs
)) == 0) {
305 struct control_msg_out
*cm
= container_of(cr
->msgs
.next
,
306 struct control_msg_out
, lh
);
308 add_control_msg(cm
, 1);
311 kref_put(&(cr
->ref
), free_control_retrans
);
314 spin_unlock_irqrestore( &(nb
->retrans_lock
), iflags
);
317 kref_put(&(nb
->ref
), neighbor_free
);
320 static void schedule_retransmit(struct control_retrans
*cr
, struct neighbor
*nb
)
322 unsigned long iflags
;
324 struct retransmit_matchparam rm
;
327 rm
.seqno
= cr
->seqno
;
330 set_retrans_timeout(cr
, nb
);
332 spin_lock_irqsave( &(nb
->retrans_lock
), iflags
);
333 htable_insert(&retransmits
, (char *) cr
, rm_to_key(&rm
));
334 first
= list_empty(&(nb
->retrans_list
));
335 list_add_tail(&(cr
->timeout_list
), &(nb
->retrans_list
));
337 if (first
&& nb
->retrans_timer_running
== 0) {
338 schedule_delayed_work(&(nb
->retrans_timer
),
339 cr
->timeout
- jiffies
);
340 nb
->retrans_timer_running
= 1;
341 kref_get(&(nb
->ref
));
344 spin_unlock_irqrestore( &(nb
->retrans_lock
), iflags
);
347 void kern_ack_rcvd(struct neighbor
*nb
, __u32 seqno
)
349 unsigned long iflags
;
351 struct control_retrans
*cr
= 0;
352 struct retransmit_matchparam rm
;
357 spin_lock_irqsave( &(nb
->retrans_lock
), iflags
);
359 cr
= (struct control_retrans
*) htable_get(&retransmits
, rm_to_key(&rm
),
363 printk(KERN_ERR
"bogus/duplicate ack received");
367 if (unlikely(htable_delete(&retransmits
, rm_to_key(&rm
), &rm
,
368 free_control_retrans
)))
371 BUG_ON(cr
->nb
!= nb
);
373 list_del(&(cr
->timeout_list
));
376 spin_unlock_irqrestore( &(nb
->retrans_lock
), iflags
);
379 static void padding(struct sk_buff
*skb
, int length
)
384 dst
= skb_put(skb
, length
);
386 memset(dst
, KP_PADDING
, length
);
389 static int add_ack(struct sk_buff
*skb
, struct control_retrans
*cr
,
390 struct control_msg_out
*cm
, int spaceleft
)
394 if (unlikely(spaceleft
< 5))
397 dst
= skb_put(skb
, 5);
401 put_u32(dst
+ 1, cm
->msg
.ack
.seqno
, 1);
403 atomic_dec(&(cm
->nb
->ucmcnt
));
404 free_control_msg(cm
);
409 static int add_ack_conn(struct sk_buff
*skb
, struct control_retrans
*cr
,
410 struct control_msg_out
*cm
, int spaceleft
)
414 if (unlikely(spaceleft
< 10))
417 dst
= skb_put(skb
, 10);
420 dst
[0] = KP_ACK_CONN
;
421 put_u32(dst
+ 1, cm
->msg
.ack_conn
.conn_id
, 1);
422 put_u32(dst
+ 5, cm
->msg
.ack_conn
.seqno
, 1);
423 dst
[9] = cm
->msg
.ack_conn
.window
;
425 list_add_tail(&(cm
->lh
), &(cr
->msgs
));
430 static int add_ack_conn_ooo(struct sk_buff
*skb
, struct control_retrans
*cr
,
431 struct control_msg_out
*cm
, int spaceleft
)
435 if (unlikely(spaceleft
< 18))
438 dst
= skb_put(skb
, 18);
441 dst
[0] = KP_ACK_CONN_OOO
;
442 put_u32(dst
+ 1, cm
->msg
.ack_conn_ooo
.conn_id
, 1);
443 put_u32(dst
+ 5, cm
->msg
.ack_conn_ooo
.seqno
, 1);
444 dst
[9] = cm
->msg
.ack_conn_ooo
.window
;
445 put_u32(dst
+ 10, cm
->msg
.ack_conn_ooo
.seqno_ooo
, 1);
446 put_u32(dst
+ 14, cm
->msg
.ack_conn_ooo
.length
, 1);
448 list_add_tail(&(cm
->lh
), &(cr
->msgs
));
453 static int add_ping(struct sk_buff
*skb
, __u32 cookie
,
458 if (unlikely(spaceleft
< 5))
461 dst
= skb_put(skb
, 5);
465 put_u32(dst
+ 1, cookie
, 0);
470 static int add_pong(struct sk_buff
*skb
, struct control_retrans
*cr
,
471 struct control_msg_out
*cm
, int spaceleft
)
475 if (unlikely(spaceleft
< 9))
478 dst
= skb_put(skb
, 9);
482 put_u32(dst
+ 1, cm
->msg
.pong
.cookie
, 0);
483 put_u32(dst
+ 5, 1000 * jiffies_to_msecs(jiffies
-
484 cm
->msg
.pong
.time_enqueued
), 1);
487 atomic_dec(&(cm
->nb
->ucmcnt
));
488 list_add_tail(&(cm
->lh
), &(cr
->msgs
));
493 static int add_connect(struct sk_buff
*skb
, struct control_retrans
*cr
,
494 struct control_msg_out
*cm
, int spaceleft
)
498 if (unlikely(spaceleft
< 5))
501 dst
= skb_put(skb
, 5);
505 put_u32(dst
+ 1, cm
->msg
.connect
.conn_id
, 1);
507 list_add_tail(&(cm
->lh
), &(cr
->msgs
));
512 static int add_connect_success(struct sk_buff
*skb
, struct control_retrans
*cr
,
513 struct control_msg_out
*cm
, int spaceleft
)
517 if (unlikely(spaceleft
< 9))
520 dst
= skb_put(skb
, 9);
523 dst
[0] = KP_CONNECT_SUCCESS
;
524 put_u32(dst
+ 1, cm
->msg
.connect_success
.rcvd_conn_id
, 1);
525 put_u32(dst
+ 5, cm
->msg
.connect_success
.gen_conn_id
, 1);
527 list_add_tail(&(cm
->lh
), &(cr
->msgs
));
532 static int add_reset_conn(struct sk_buff
*skb
, struct control_retrans
*cr
,
533 struct control_msg_out
*cm
, int spaceleft
)
537 if (unlikely(spaceleft
< 5))
540 dst
= skb_put(skb
, 5);
543 dst
[0] = KP_RESET_CONN
;
544 put_u32(dst
+ 1, cm
->msg
.reset
.conn_id
, 1);
546 list_add_tail(&(cm
->lh
), &(cr
->msgs
));
551 static int add_conndata(struct sk_buff
*skb
, struct control_retrans
*cr
,
552 struct control_msg_out
*cm
, int spaceleft
,
553 struct control_msg_out
**split_conndata
, __u32
*sc_sendlen
)
557 int totallen
= cm
->msg
.conn_data
.datalen
+ 11;
558 int putlen
= min(totallen
, spaceleft
);
559 int dataputlen
= putlen
- 11;
561 BUG_ON(split_conndata
== 0);
562 BUG_ON(sc_sendlen
== 0);
564 if (dataputlen
< 1 || (spaceleft
< 25 && spaceleft
< totallen
))
567 dst
= skb_put(skb
, putlen
);
570 dst
[0] = KP_CONN_DATA
;
571 put_u32(dst
+ 1, cm
->msg
.conn_data
.conn_id
, 1);
572 put_u32(dst
+ 5, cm
->msg
.conn_data
.seqno
, 1);
573 put_u16(dst
+ 9, dataputlen
, 1);
575 memcpy(dst
+ 11, cm
->msg
.conn_data
.data
, dataputlen
);
577 if (cm
->msg
.conn_data
.datalen
== dataputlen
) {
578 list_add_tail(&(cm
->lh
), &(cr
->msgs
));
580 *split_conndata
= cm
;
581 *sc_sendlen
= dataputlen
;
587 static int add_ping_conn(struct sk_buff
*skb
, struct control_retrans
*cr
,
588 struct control_msg_out
*cm
, int spaceleft
)
592 if (unlikely(spaceleft
< 5))
595 dst
= skb_put(skb
, 5);
598 dst
[0] = KP_PING_CONN
;
599 put_u32(dst
+ 1, cm
->msg
.ping_conn
.conn_id
, 1);
601 list_add_tail(&(cm
->lh
), &(cr
->msgs
));
606 static int add_connid_unknown(struct sk_buff
*skb
, struct control_retrans
*cr
,
607 struct control_msg_out
*cm
, int spaceleft
)
611 if (unlikely(spaceleft
< 5))
614 dst
= skb_put(skb
, 5);
617 dst
[0] = KP_CONNID_UNKNOWN
;
618 put_u32(dst
+ 1, cm
->msg
.connid_unknown
.conn_id
, 1);
620 list_add_tail(&(cm
->lh
), &(cr
->msgs
));
625 static int add_ping_all_conns(struct sk_buff
*skb
, struct control_retrans
*cr
,
626 struct control_msg_out
*cm
, int spaceleft
)
630 if (unlikely(spaceleft
< 1))
633 dst
= skb_put(skb
, 1);
636 dst
[0] = KP_PING_ALL_CONNS
;
638 list_add_tail(&(cm
->lh
), &(cr
->msgs
));
643 static int add_set_max_cmsg_dly(struct sk_buff
*skb
, struct control_retrans
*cr
,
644 struct control_msg_out
*cm
, int spaceleft
)
648 if (unlikely(spaceleft
< 5))
651 dst
= skb_put(skb
, 5);
654 dst
[0] = KP_SET_MAX_CMSG_DELAY
;
655 put_u32(dst
+ 1, cm
->msg
.set_max_cmsg_delay
.delay
, 1);
657 list_add_tail(&(cm
->lh
), &(cr
->msgs
));
662 static int add_message(struct sk_buff
*skb
, struct control_retrans
*cr
,
663 struct control_msg_out
*cm
, int spaceleft
,
664 struct control_msg_out
**split_conndata
, __u32
*sc_sendlen
)
666 BUG_ON(split_conndata
!= 0 && *split_conndata
!= 0);
667 BUG_ON(sc_sendlen
!= 0 && *sc_sendlen
!= 0);
671 return add_ack(skb
, cr
, cm
, spaceleft
);
672 case MSGTYPE_ACK_CONN
:
673 return add_ack_conn(skb
, cr
, cm
, spaceleft
);
674 case MSGTYPE_ACK_CONN_OOO
:
675 return add_ack_conn_ooo(skb
, cr
, cm
, spaceleft
);
677 return add_pong(skb
, cr
, cm
, spaceleft
);
678 case MSGTYPE_CONNECT
:
679 return add_connect(skb
, cr
, cm
, spaceleft
);
680 case MSGTYPE_CONNECT_SUCCESS
:
681 return add_connect_success(skb
, cr
, cm
, spaceleft
);
682 case MSGTYPE_RESET_CONN
:
683 return add_reset_conn(skb
, cr
, cm
, spaceleft
);
684 case MSGTYPE_CONNDATA
:
685 return add_conndata(skb
, cr
, cm
, spaceleft
, split_conndata
,
687 case MSGTYPE_PING_CONN
:
688 return add_ping_conn(skb
, cr
, cm
, spaceleft
);
689 case MSGTYPE_CONNID_UNKNOWN
:
690 return add_connid_unknown(skb
, cr
, cm
, spaceleft
);
691 case MSGTYPE_PING_ALL_CONNS
:
692 return add_ping_all_conns(skb
, cr
, cm
, spaceleft
);
693 case MSGTYPE_SET_MAX_CMSG_DELAY
:
694 return add_set_max_cmsg_dly(skb
, cr
, cm
, spaceleft
);
702 static __u32
recount_ping_conns(struct neighbor
*nb
)
705 struct list_head
*curr
= nb
->next_ping_conn
->target
.out
.nb_list
.next
;
706 while (curr
!= &(nb
->snd_conn_list
)) {
708 BUG_ON(cnt
> 1000000000);
713 static __u32
__send_messages_pc(struct neighbor
*nb
, struct sk_buff
*skb
,
714 struct control_retrans
*cr
, int spaceleft
)
717 mutex_lock(&(nb
->conn_list_lock
));
718 while (nb
->next_ping_conn
!= 0) {
721 struct list_head
*next
;
722 struct control_msg_out
*cm
;
725 rconn
= nb
->next_ping_conn
;
726 sconn
= rconn
->reversedir
;
728 BUG_ON(rconn
->targettype
!= TARGET_OUT
);
729 BUG_ON(sconn
->sourcetype
!= SOURCE_IN
);
731 if (unlikely(rconn
->target
.out
.conn_id
))
734 if (nb
->ping_conns_remaining
== 0) {
735 atomic_set(&(sconn
->source
.in
.pong_awaiting
), 1);
736 nb
->pong_conns_expected
++;
737 nb
->ping_conns_remaining
--;
738 if (unlikely(nb
->ping_conns_remaining
== 0))
739 nb
->ping_conns_remaining
=
740 recount_ping_conns(nb
);
742 if (likely(atomic_read(&(
743 sconn
->source
.in
.pong_awaiting
)) == 0))
745 nb
->ping_conns_remaining
--;
746 if (unlikely(nb
->ping_conns_retrans_remaining
== 0))
747 nb
->ping_conns_retrans_remaining
=
748 recount_ping_conns(nb
);
751 cm
= alloc_control_msg(nb
, ACM_PRIORITY_LOW
);
753 cm
->type
= MSGTYPE_PING_CONN
;
754 cm
->msg
.ping_conn
.conn_id
= rconn
->target
.out
.conn_id
;
755 rc
= add_message(skb
, cr
, cm
, spaceleft
- length
, 0, 0);
761 next
= rconn
->target
.out
.nb_list
.next
;
762 nb
->next_ping_conn
= container_of(next
, struct conn
,
764 if (next
== &(nb
->snd_conn_list
)) {
765 nb
->next_ping_conn
= 0;
766 nb
->ping_conns_remaining
= 0;
769 if (unlikely(length
!= 0)) {
770 nb
->ping_conn_completed
= jiffies
;
772 mutex_unlock(&(nb
->conn_list_lock
));
776 static __u32
__send_messages(struct neighbor
*nb
, struct sk_buff
*skb
,
777 struct control_retrans
*cr
, int spaceleft
, int urgentonly
,
778 struct control_msg_out
**split_conndata
, __u32
*sc_sendlen
)
781 while (!list_empty(&(nb
->ucontrol_msgs_out
)) || (!urgentonly
&&
782 !list_empty(&(nb
->control_msgs_out
)))) {
785 int urgent
= !list_empty(&(nb
->ucontrol_msgs_out
));
787 struct control_msg_out
*cm
;
790 cm
= container_of(nb
->ucontrol_msgs_out
.next
,
791 struct control_msg_out
, lh
);
793 cm
= container_of(nb
->control_msgs_out
.next
,
794 struct control_msg_out
, lh
);
798 nb
->ucmlength
-= cm
->length
;
800 nb
->cmlength
-= cm
->length
;
801 mutex_unlock(&(nb
->cmsg_lock
));
802 rc
= add_message(skb
, cr
, cm
, spaceleft
- length
,
803 split_conndata
, sc_sendlen
);
804 mutex_lock(&(nb
->cmsg_lock
));
808 list_add(&(cm
->lh
), &(nb
->ucontrol_msgs_out
));
809 nb
->ucmlength
+= cm
->length
;
811 list_add(&(cm
->lh
), &(nb
->control_msgs_out
));
812 nb
->cmlength
+= cm
->length
;
823 static int ping_all_conns_needed(struct neighbor
*nb
)
825 struct list_head
*curr
;
827 if (likely(nb
->ping_all_conns
== 0))
830 curr
= nb
->control_msgs_out
.next
;
831 while (curr
!= &(nb
->control_msgs_out
)) {
832 struct control_msg_out
*cm
= container_of(curr
,
833 struct control_msg_out
, lh
);
835 if (cm
->type
== MSGTYPE_PING_ALL_CONNS
)
844 static int __send_messages_smcd(struct neighbor
*nb
, struct sk_buff
*skb
,
845 struct control_retrans
*cr
, int spaceleft
)
847 struct control_msg_out
*cm
;
850 cm
= _alloc_control_msg(nb
, 0, 1);
852 if (unlikely(cm
== 0))
855 cm
->type
= MSGTYPE_SET_MAX_CMSG_DELAY
;
856 cm
->msg
.set_max_cmsg_delay
.delay
= CMSG_INTERVAL_MS
* 10;
859 rc
= add_message(skb
, cr
, cm
, spaceleft
, 0, 0);
861 nb
->max_cmsg_delay_sent
= 1;
865 static int __send_messages_pac(struct neighbor
*nb
, struct sk_buff
*skb
,
866 struct control_retrans
*cr
, int spaceleft
)
868 struct control_msg_out
*cm
;
871 cm
= _alloc_control_msg(nb
, 0, 1);
873 if (unlikely(cm
== 0))
876 cm
->type
= MSGTYPE_PING_ALL_CONNS
;
879 rc
= add_message(skb
, cr
, cm
, spaceleft
, 0, 0);
881 nb
->ping_all_conns
= 0;
886 static int _send_messages(struct neighbor
*nb
, struct sk_buff
*skb
, int ping
,
887 struct control_retrans
*cr
, int spaceleft
, int urgentonly
)
891 __u32 pingcookie
= 0;
892 struct control_msg_out
*split_conndata
= 0;
893 __u32 sc_sendlen
= 0;
895 mutex_lock(&(nb
->cmsg_lock
));
899 pingcookie
= add_ping_req(nb
);
900 rc
= add_ping(skb
, pingcookie
, spaceleft
- length
);
905 if (likely(urgentonly
== 0) && unlikely(ping_all_conns_needed(nb
) != 0))
906 length
+= __send_messages_pac(nb
, skb
, cr
, spaceleft
- length
);
908 if (likely(urgentonly
== 0) && unlikely(nb
->max_cmsg_delay_sent
== 0))
909 length
+= __send_messages_smcd(nb
, skb
, cr
, spaceleft
- length
);
911 length
+= __send_messages(nb
, skb
, cr
, spaceleft
- length
, urgentonly
,
912 &split_conndata
, &sc_sendlen
);
914 if (likely(urgentonly
== 0))
915 length
+= __send_messages_pc(nb
, skb
, cr
, spaceleft
- length
);
917 mutex_unlock(&(nb
->cmsg_lock
));
919 if (unlikely(length
> spaceleft
))
920 printk(KERN_ERR
"error cor/kpacket_gen: length > spaceleft!?");
922 padding(skb
, spaceleft
- length
);
924 rc
= dev_queue_xmit(skb
);
927 unadd_ping_req(nb
, pingcookie
);
929 while (list_empty(&(cr
->msgs
)) == 0) {
930 struct control_msg_out
*cm
= container_of(cr
->msgs
.prev
,
931 struct control_msg_out
, lh
);
933 add_control_msg(cm
, 1);
936 if (split_conndata
!= 0) {
937 add_control_msg(split_conndata
, 1);
940 kref_put(&(cr
->ref
), free_control_retrans
);
942 struct list_head
*curr
= cr
->msgs
.next
;
944 while(curr
!= &(cr
->msgs
)) {
945 struct control_msg_out
*cm
= container_of(curr
,
946 struct control_msg_out
, lh
);
950 if (cm
->type
== MSGTYPE_CONNDATA
) {
952 kfree(cm
->msg
.conn_data
.data_orig
);
953 free_control_msg(cm
);
957 if (split_conndata
!= 0) {
958 BUG_ON(sc_sendlen
== 0);
960 split_conndata
->msg
.conn_data
.datalen
);
962 split_conndata
->msg
.conn_data
.data
+= sc_sendlen
;
963 split_conndata
->msg
.conn_data
.datalen
-= sc_sendlen
;
965 send_conndata(split_conndata
,
966 split_conndata
->msg
.conn_data
.conn_id
,
967 split_conndata
->msg
.conn_data
.seqno
,
968 split_conndata
->msg
.conn_data
.data_orig
,
969 split_conndata
->msg
.conn_data
.data
,
970 split_conndata
->msg
.conn_data
.datalen
);
974 if (list_empty(&(cr
->msgs
)))
975 kref_put(&(cr
->ref
), free_control_retrans
);
977 schedule_retransmit(cr
, nb
);
983 static __u32
get_total_messages_length(struct neighbor
*nb
, int ping
,
986 __u32 length
= nb
->ucmlength
;
987 if (likely(urgentonly
== 0)) {
988 length
+= nb
->cmlength
+ nb
->ping_conns_remaining
* 5;
989 if (likely(nb
->ping_conns_remaining
== 0)) {
990 if (likely(nb
->ping_conns_retrans_remaining
== 0) &&
991 unlikely(nb
->pong_conns_expected
!=0) &&
992 time_before(nb
->ping_conn_completed
,
993 jiffies
+ msecs_to_jiffies(
994 PING_ALL_CONNS_TIMEOUT
) +
995 usecs_to_jiffies(((__u32
) atomic_read(&(
996 nb
->latency
))) * 2 + ((__u32
)
997 atomic_read(&(nb
->max_remote_cmsg_delay
)
999 nb
->ping_conns_retrans_remaining
=
1000 nb
->pong_conns_expected
;
1002 if (unlikely(nb
->ping_conns_retrans_remaining
>
1003 nb
->pong_conns_expected
))
1004 nb
->ping_conns_retrans_remaining
=
1005 nb
->pong_conns_expected
;
1007 length
+= nb
->ping_conns_retrans_remaining
* 5;
1009 if (unlikely(ping_all_conns_needed(nb
) != 0))
1011 if (unlikely(nb
->max_cmsg_delay_sent
== 0))
1014 if (ping
== 2 || (length
> 0 && ping
!= 0))
1019 static int send_messages(struct neighbor
*nb
, int allmsgs
, int resume
)
1023 int targetmss
= mss(nb
);
1025 int nbstate
= get_neigh_state(nb
);
1026 int urgentonly
= (nbstate
!= NEIGHBOR_STATE_ACTIVE
);
1028 mutex_lock(&(nb
->cmsg_lock
));
1031 allmsgs
= nb
->kp_allmsgs
;
1033 ping
= time_to_send_ping(nb
);
1039 struct sk_buff
*skb
;
1040 struct control_retrans
*cr
;
1042 BUG_ON(list_empty(&(nb
->control_msgs_out
)) &&
1043 (nb
->cmlength
!= 0));
1044 BUG_ON((list_empty(&(nb
->control_msgs_out
)) == 0) &&
1045 (nb
->cmlength
== 0));
1046 BUG_ON(list_empty(&(nb
->ucontrol_msgs_out
)) &&
1047 (nb
->ucmlength
!= 0));
1048 BUG_ON((list_empty(&(nb
->ucontrol_msgs_out
)) == 0) &&
1049 (nb
->ucmlength
== 0));
1050 BUG_ON(nb
->cmlength
< 0);
1051 BUG_ON(nb
->ucmlength
< 0);
1053 length
= get_total_messages_length(nb
, ping
, urgentonly
);
1058 if (length
< targetmss
&& allmsgs
== 0)
1061 seqno
= atomic_add_return(1, &(nb
->kpacket_seqno
));
1063 if (length
> targetmss
)
1066 mutex_unlock(&(nb
->cmsg_lock
));
1067 skb
= create_packet(nb
, length
, GFP_KERNEL
, 0, seqno
);
1068 if (unlikely(skb
== 0)) {
1069 printk(KERN_ERR
"cor: send_messages: cannot allocate "
1070 "skb (out of memory?)");
1074 cr
= kmem_cache_alloc(controlretrans_slab
, GFP_KERNEL
);
1075 if (unlikely(cr
== 0)) {
1077 printk(KERN_ERR
"cor: send_messages: cannot allocate "
1078 "control_retrans (out of memory?)");
1081 memset(cr
, 0, sizeof(struct control_retrans
));
1082 kref_init(&(cr
->ref
));
1085 INIT_LIST_HEAD(&(cr
->msgs
));
1087 rc
= _send_messages(nb
, skb
, ping
, cr
, length
, urgentonly
);
1090 mutex_lock(&(nb
->cmsg_lock
));
1098 mutex_lock(&(nb
->cmsg_lock
));
1103 nb
->kp_allmsgs
= nb
->kp_allmsgs
|| allmsgs
;
1104 qos_enqueue_kpacket(nb
);
1106 } else if (allmsgs
) {
1110 mutex_unlock(&(nb
->cmsg_lock
));
1113 schedule_controlmsg_timerfunc(nb
);
1118 int resume_send_messages(struct neighbor
*nb
)
1120 return send_messages(nb
, 0, 1);
1123 static void controlmsg_timerfunc(struct work_struct
*work
)
1125 struct neighbor
*nb
= container_of(to_delayed_work(work
),
1126 struct neighbor
, cmsg_timer
);
1127 __u64 jiffies
= get_jiffies_64();
1129 mutex_lock(&(nb
->cmsg_lock
));
1131 if (nb
->timeout
> jiffies
) {
1132 INIT_DELAYED_WORK(&(nb
->cmsg_timer
), controlmsg_timerfunc
);
1133 schedule_delayed_work(&(nb
->cmsg_timer
), nb
->timeout
- jiffies
);
1134 mutex_unlock(&(nb
->cmsg_lock
));
1138 mutex_unlock(&(nb
->cmsg_lock
));
1140 send_messages(nb
, 1, 0);
1141 kref_put(&(nb
->ref
), neighbor_free
);
1144 void schedule_controlmsg_timerfunc(struct neighbor
*nb
)
1146 __u64 jiffies
= get_jiffies_64();
1149 int state
= get_neigh_state(nb
);
1151 if (unlikely(state
== NEIGHBOR_STATE_KILLED
))
1154 mutex_lock(&(nb
->cmsg_lock
));
1155 nb
->timeout
+= msecs_to_jiffies(CMSG_INTERVAL_MS
);
1157 delay
= nb
->timeout
- jiffies
;
1160 nb
->timeout
= jiffies
;
1163 INIT_DELAYED_WORK(&(nb
->cmsg_timer
), controlmsg_timerfunc
);
1164 schedule_delayed_work(&(nb
->cmsg_timer
), delay
);
1165 mutex_unlock(&(nb
->cmsg_lock
));
1166 kref_get(&(nb
->ref
));
1169 static void free_oldest_ucm(struct neighbor
*nb
)
1171 struct control_msg_out
*cm
= container_of(nb
->ucontrol_msgs_out
.next
,
1172 struct control_msg_out
, lh
);
1174 BUG_ON(isurgent(cm
) == 0);
1176 list_del(&(cm
->lh
));
1177 nb
->ucmlength
-= cm
->length
;
1178 atomic_dec(&(nb
->ucmcnt
));
1179 free_control_msg(cm
);
1182 static void add_control_msg(struct control_msg_out
*cm
, int retrans
)
1186 BUG_ON(cm
->nb
== 0);
1188 nbstate
= get_neigh_state(cm
->nb
);
1191 BUG_ON(cm
->lh
.next
!= LIST_POISON1
|| cm
->lh
.prev
!= LIST_POISON2
);
1193 mutex_lock(&(cm
->nb
->cmsg_lock
));
1198 msgs
= atomic_inc_return(&(cm
->nb
->ucmcnt
));
1201 if (unlikely(retrans
)) {
1202 if (msgs
> MAX_URGENT_CMSGS_PER_NEIGH
) {
1203 free_control_msg(cm
);
1207 cm
->nb
->ucmlength
+= cm
->length
;
1208 list_add(&(cm
->lh
), &(cm
->nb
->ucontrol_msgs_out
));
1210 if (msgs
> MAX_URGENT_CMSGS_PER_NEIGH
) {
1211 free_oldest_ucm(cm
->nb
);
1214 cm
->nb
->ucmlength
+= cm
->length
;
1215 list_add_tail(&(cm
->lh
), &(cm
->nb
->ucontrol_msgs_out
));
1218 cm
->nb
->cmlength
+= cm
->length
;
1219 list_add_tail(&(cm
->lh
), &(cm
->nb
->control_msgs_out
));
1222 if (unlikely((nbstate
== NEIGHBOR_STATE_ACTIVE
? cm
->nb
->cmlength
: 0)+
1223 cm
->nb
->ucmlength
>= mss(cm
->nb
)))
1224 send_messages(cm
->nb
, 0, 0);
1227 mutex_unlock(&(cm
->nb
->cmsg_lock
));
1230 void send_pong(struct neighbor
*nb
, __u32 cookie
)
1232 struct control_msg_out
*cm
= _alloc_control_msg(nb
, 0, 1);
1234 if (unlikely(cm
== 0))
1238 cm
->type
= MSGTYPE_PONG
;
1239 cm
->msg
.pong
.cookie
= cookie
;
1240 cm
->msg
.pong
.time_enqueued
= jiffies
;
1242 add_control_msg(cm
, 0);
1245 void send_reset_conn(struct control_msg_out
*cm
, __u32 conn_id
)
1247 cm
->type
= MSGTYPE_RESET_CONN
;
1248 cm
->msg
.reset
.conn_id
= conn_id
;
1250 add_control_msg(cm
, 0);
1253 void send_ack(struct neighbor
*nb
, __u32 seqno
)
1255 struct control_msg_out
*cm
= _alloc_control_msg(nb
, 0, 1);
1257 if (unlikely(cm
== 0))
1261 cm
->type
= MSGTYPE_ACK
;
1262 cm
->msg
.ack
.seqno
= seqno
;
1264 add_control_msg(cm
, 0);
1267 void send_ack_conn(struct control_msg_out
*cm
, __u32 conn_id
, __u32 seqno
,
1270 cm
->type
= MSGTYPE_ACK_CONN
;
1271 cm
->msg
.ack_conn
.conn_id
= conn_id
;
1272 cm
->msg
.ack_conn
.seqno
= seqno
;
1273 cm
->msg
.ack_conn
.window
= window
;
1276 add_control_msg(cm
, 0);
1279 void send_ack_conn_ooo(struct control_msg_out
*cm
, __u32 conn_id
, __u32 seqno
,
1280 __u8 window
, __u32 seqno_ooo
, __u32 length
)
1282 cm
->type
= MSGTYPE_ACK_CONN_OOO
;
1283 cm
->msg
.ack_conn_ooo
.conn_id
= conn_id
;
1284 cm
->msg
.ack_conn_ooo
.seqno
= seqno
;
1285 cm
->msg
.ack_conn_ooo
.window
= window
;
1286 cm
->msg
.ack_conn_ooo
.seqno_ooo
= seqno_ooo
;
1287 cm
->msg
.ack_conn_ooo
.length
= length
;
1289 add_control_msg(cm
, 0);
1292 void send_connect_success(struct control_msg_out
*cm
, __u32 rcvd_conn_id
,
1295 cm
->type
= MSGTYPE_CONNECT_SUCCESS
;
1296 cm
->msg
.connect_success
.rcvd_conn_id
= rcvd_conn_id
;
1297 cm
->msg
.connect_success
.gen_conn_id
= gen_conn_id
;
1299 add_control_msg(cm
, 0);
1302 void send_connect_nb(struct control_msg_out
*cm
, __u32 conn_id
)
1304 cm
->type
= MSGTYPE_CONNECT
;
1305 cm
->msg
.connect
.conn_id
= conn_id
;
1307 add_control_msg(cm
, 0);
1310 void send_conndata(struct control_msg_out
*cm
, __u32 conn_id
, __u32 seqno
,
1311 char *data_orig
, char *data
, __u32 datalen
)
1313 cm
->type
= MSGTYPE_CONNDATA
;
1314 cm
->msg
.conn_data
.conn_id
= conn_id
;
1315 cm
->msg
.conn_data
.seqno
= seqno
;
1316 cm
->msg
.conn_data
.data_orig
= data_orig
;
1317 cm
->msg
.conn_data
.data
= data
;
1318 cm
->msg
.conn_data
.datalen
= datalen
;
1319 cm
->length
= 11 + datalen
;
1320 add_control_msg(cm
, 0);
1323 void send_ping_conn(struct control_msg_out
*cm
, __u32 conn_id
)
1325 cm
->type
= MSGTYPE_PING_CONN
;
1326 cm
->msg
.ping_conn
.conn_id
= conn_id
;
1328 add_control_msg(cm
, 0);
1332 void send_connid_unknown(struct control_msg_out
*cm
, __u32 conn_id
)
1334 cm
->type
= MSGTYPE_CONNID_UNKNOWN
;
1335 cm
->msg
.connid_unknown
.conn_id
= conn_id
;
1337 add_control_msg(cm
, 0);
1340 void send_ping_all_conns(struct neighbor
*nb
)
1342 mutex_lock(&(nb
->cmsg_lock
));
1343 nb
->ping_all_conns
= 1;
1344 mutex_unlock(&(nb
->cmsg_lock
));
1347 static int matches_connretrans(void *htentry
, void *searcheditem
)
1349 struct control_retrans
*cr
= (struct control_retrans
*) htentry
;
1350 struct retransmit_matchparam
*rm
= (struct retransmit_matchparam
*)
1353 return rm
->nb
== cr
->nb
&& rm
->seqno
== cr
->seqno
;
1356 void __init
cor_kgen_init(void)
1358 controlmsg_slab
= kmem_cache_create("cor_controlmsg",
1359 sizeof(struct control_msg_out
), 8, 0, 0);
1360 controlretrans_slab
= kmem_cache_create("cor_controlretransmsg",
1361 sizeof(struct control_retrans
), 8, 0, 0);
1362 htable_init(&retransmits
, matches_connretrans
,
1363 offsetof(struct control_retrans
, htab_entry
),
1364 offsetof(struct control_retrans
, ref
));