retransmit bugfixes, ping timing
[cor_2_6_31.git] / net / cor / cor.h
bloba249f5a0be99d79eda9c95376c5c4dd9f35e73a9
1 /*
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
18 * 02110-1301, USA.
21 #include <asm/atomic.h>
23 #include <linux/types.h>
24 #include <linux/netdevice.h>
25 #include <linux/skbuff.h>
26 #include <linux/spinlock.h>
27 #include <linux/workqueue.h>
28 #include <linux/kref.h>
30 #include "settings.h"
33 /* options */
34 #define PIDOUT_NEWCONN 16
35 #define PIDOUT_SENDDEF_THRES 8
36 #define PIDOUT_SENDDEF_COUNT 16
40 #define ETH_P_COR 0x1022
41 #define AF_COR 37
42 #define PF_COR AF_COR
44 #define SOCKADDRTYPE_PORT 1
45 struct cor_sockaddr {
46 int type;
48 union {
49 __be64 port;
50 } addr;
53 #define MAX_CONN_CMD_LEN 4096
56 #define PACKET_TYPE_ANNOUNCE 1
57 #define PACKET_TYPE_DATA 2
60 * Kernel packet data - these commands are sent by the neighbor
61 * The end nodes may cause these commands to be sent, but they see them beyond
62 * the first hop.
65 /* KP_PADDING[1] */
66 #define KP_PADDING 1
69 * KP_PING[1] cookie[4]
70 * KP_PONG[1] cookie[4] respdelay[4]
72 * This is needed to find out whether the other node is reachable. After a new
73 * neighbor is seen, ping requests are sent and the neighbor is only reachable
74 * after a few pongs are received. These requests are also used to find out
75 * whether a neighber is gone.
77 * respdelay:
78 * The receiver of a ping may delay the sending of the pong e.g. to create
79 * bigger kernel packets. The respdelay is the time in microseconds the packet
80 * was delayed.
82 #define KP_PING 2
83 #define KP_PONG 3
85 /* KP_ACK[1] seqno[4] */
86 #define KP_ACK 4
88 /*
89 * KP_ACK_CONN[1] conn_id[4] seqno[4] window[1]
90 * KP_ACK_CONN_OOO[1] conn_id[4] seqno[4] window[1] seqno_ooo[4] length[4]
92 * conn_id is the conn_id we use if we sent something through this conn and
93 * *not* the conn_id that the neighbor used to send us the data
95 * seqno = the seqno which is expected in the next non-out-of-order packet
96 * seqno_ooo, length = in case
98 * window = amount of data which can be sent without receiving the next ack
99 * packets with lower seqno do not overwrite the last window size
100 * note: the other side may also reduce the window size
101 * decode:
102 * 0 = 0
103 * 1...255 = 64*2^((value-1)/11) end result is rounded down to an integer
106 #define KP_ACK_CONN 5
107 #define KP_ACK_CONN_OOO 6
110 * NOTE on connection ids:
111 * connection ids we send are used for the receive channel
112 * connection ids we receive are used for the send channel
116 * incoming connection
117 * KP_CONNECT[1] conn_id[4]
119 #define KP_CONNECT 7
122 * incoming connection successful,
123 * the first conn_id is the same as previously sent/received in KP_CONNECT
124 * the second conn_id is generated by us and used for the other direction
125 * KP_CONNECT_SUCCESS[1] conn_id[4] conn_id[4]
127 #define KP_CONNECT_SUCCESS 8
129 /* KP_CONN_DATA[1] conn_id[4] seqno[4] length[2] data[length] */
130 #define KP_CONN_DATA 9
132 /* KP_PING_CONN[1] conn_id[4] */
133 #define KP_PING_CONN 10
136 * KP_PONG_CONN[1] conn_id[4]
137 * conn_id is the conn_id we use if we sent something through this conn and
138 * *not* the conn_id that the neighbor used to send us the data
140 #define KP_PONG_CONN 11
143 * { KP_RESET_CONN[1] conn_id[4] }
144 * We send this, if there is an established connection we want to close.
146 #define KP_RESET_CONN 12
149 * KP_CONNID_UNKNOWN[1] sent_conn_id[4]
150 * We send this, if we receive an invalid conn_id
153 #define KP_CONNID_UNKNOWN 13
156 * Connection data which in interpreted when connection has no target yet
157 * These commands are sent by the end node.
159 * Format:
160 * cmd[2] length[4] parameter[length]
161 * unrecogniced commands are ignored
162 * parameters which are longer than expected are ignored as well
165 /* outgoing connection: CD_CONNECT_NB[2] length[4]
166 * addrtypelen[2] addrlen[2] addrtype[addrtypelen] addr[addrlen] */
167 #define CD_CONNECT_NB 1
169 /* connection to local open part: CD_CONNECT_PORT[2] length[4] port[8] */
170 #define CD_CONNECT_PORT 2
173 * CD_LIST_NEIGH sends CDR_BINDATA if the command was successful. The response
174 * format is:
176 * totalneighs[4] response_rows[4]
177 * for every row:
178 * numaddr[2] (addrtypelen[2] addrlen[2] addrtype[addrtypelen] addr[addrlen]
179 * )[numaddr]
181 * Neighbors have to be sorted by uptime, new neighbors first. This is so that
182 * the routing daemon can easily find out whether there are new neighbors. It
183 * only needs to send a query with offset 0. If the totalneighs stays the same
184 * while new were added, a connection to another neighbor was lost.
187 /* list connected neighbors: CD_LIST_NEIGH[2] length[4] limit[4] offset[4] */
188 #define CD_LIST_NEIGH 3
191 * CD_SET_(FORWARD|BACKWARD)_TIMEOUT[2] length[4] timeout_ms[4]
193 * If there is no successful communication with the previous or neighbor for
194 * this period, the connection will be reset. This value must be between
195 * NB_STALL_TIME and NB_KILL_TIME. Otherwise it will silently behave as if it
196 * was set to exactly one of these limits.
198 #define CD_SET_FORWARD_TIMEOUT 4
199 #define CD_SET_BACKWARD_TIMEOUT 5
202 * Connection data response
203 * Format is the same as with connection data
207 * {CDR_EXECOK[2] || CDR_EXECFAILED[2]}
208 * reasoncode[2] reasontextlength[2] reasontext[reasontextlength]
209 * reasontextlength may be 0
211 #define CDR_EXECOK 32768
212 #define CDR_EXECOK_OK 33024
215 #define CDR_EXECFAILED 32769
216 #define CDR_EXECFAILED_UNKNOWN_COMMAND 33280
217 #define CDR_EXECFAILED_PERMISSION_DENIED 33281
218 #define CDR_EXECFAILED_TEMPORARILY_OUT_OF_RESSOURCES 33282
219 #define CDR_EXECFAILED_CMD_TOO_SHORT 33283
220 #define CDR_EXECFAILED_CMD_TOO_LONG 33284
221 #define CDR_EXECFAILED_TARGETADDRTYPE_UNKNOWN 33285
222 #define CDR_EXECFAILED_TARGETADDR_DOESNTEXIST 33286
223 #define CDR_EXECFAILED_TARGETADDR_PORTCLOSED 33287
224 #define CDR_EXECFAILED_LISTENERQUEUE_FULL 33288
225 #define CDR_EXECFAILED_ILLEGAL_COMMAND 33289
228 * must be sent after CDR_EXEC{OK|FAILED}
229 * CDR_EXEOK_BINDATA[2] bindatalen[4] bindata[bindatalen] */
230 #define CDR_BINDATA 32770
233 /* result codes for rcv.c/proc_packet */
234 #define RC_DROP 0
235 #define RC_FINISHED 1
237 #define RC_RCV1_ANNOUNCE 2
238 #define RC_RCV1_KERNEL 3
239 #define RC_RCV1_CONN 4
241 struct htab_entry{
242 /* start of next element, *not* next htab_entry */
243 void *next;
246 struct htable{
247 struct htab_entry **htable;
248 __u32 htable_size;
249 __u32 cell_size;
250 __u32 num_elements;
252 int (*matches)(void *htentry, void *searcheditem);
253 __u32 key_offset;
254 __u32 entry_offset;
255 __u32 kref_offset;
258 struct ping_cookie{
259 unsigned long time;
260 __u32 cookie;
261 __u8 pongs; /* count of pongs for pings sent after this one */
264 #define NEIGHBOR_STATE_INITIAL 0
265 #define NEIGHBOR_STATE_ACTIVE 1
266 #define NEIGHBOR_STATE_STALLED 2
267 #define NEIGHBOR_STATE_KILLED 3
269 struct neighbor{
270 struct list_head nb_list;
272 struct kref ref;
274 struct net_device *dev;
275 char mac[MAX_ADDR_LEN];
277 char *addr;
278 __u16 addrlen;
280 struct delayed_work cmsg_timer;
281 struct mutex cmsg_lock;
282 struct list_head control_msgs_out;
284 * urgent messages; These are sent even if the neighbor state is not
285 * active. If the queue gets full, the oldest ones are dropped. It thus
286 * may only contain messages which are allowed to be dropped.
288 struct list_head ucontrol_msgs_out;
289 __u64 timeout;
290 __u32 cmlength;
291 __u32 ucmlength;
293 struct mutex pingcookie_lock;
294 unsigned long last_ping_time;
295 __u32 ping_intransit;
296 struct ping_cookie cookies[PING_COOKIES_PER_NEIGH];
297 __u32 lastcookie;
298 atomic_t latency; /* microsecs */
300 spinlock_t state_lock;
301 union {
302 __u64 last_state_change;/* initial state */
304 * last_roundtrip:
305 * time of the last sent packet which has been acked or
306 * otherwise responded to (e.g. pong)
308 unsigned long last_roundtrip;/* active/stalled state */
309 }state_time;
310 __u8 state;
311 __u16 ping_success;
313 struct delayed_work stalltimeout_timer;
314 __u8 str_timer_pending;
317 atomic_t kpacket_seqno;
318 atomic_t ooo_packets;
321 * connecions which receive data from/send data to this node
322 * used when terminating all connections of a neighbor
324 struct mutex conn_list_lock;
325 struct list_head rcv_conn_list;
326 struct list_head snd_conn_list;
329 * the timer has to be inited when adding the neighbor
330 * init_timer(struct timer_list * timer);
331 * add_timer(struct timer_list * timer);
333 spinlock_t retrans_lock;
334 struct delayed_work retrans_timer_conn;
335 struct delayed_work retrans_timer;
336 __u8 retrans_timer_conn_running;
337 __u8 retrans_timer_running;
339 struct list_head retrans_list;
340 struct list_head retrans_list_conn;
342 struct conn *firstboundconn;
345 struct cor_sched_data{
346 spinlock_t lock;
347 struct list_head conn_list;
348 struct sk_buff_head requeue_queue;
351 #define TYPE_BUF 0
352 #define TYPE_SKB 1
354 struct data_buf_item{
355 struct list_head buf_list;
357 union {
358 struct {
359 char *buf;
360 __u32 datalen;
362 }buf;
364 struct sk_buff *skb;
365 }data;
367 __u8 type;
370 struct data_buf{
371 struct list_head items;
372 struct data_buf_item *lastread;
373 __u32 first_offset;
375 __u32 totalsize;
376 __u32 read_remaining;
378 __u16 last_read_offset;
380 __u16 last_buflen;
383 struct connlistener;
385 struct bindnode{
386 struct list_head lh;
387 struct connlistener *owner;
388 __be64 port;
391 #define SOCKSTATE_LISTENER 1
392 #define SOCKSTATE_CONN 2
394 struct sock_hdr {
395 /* The first member of connlistener/conn (see sock.c) */
396 __u8 sockstate;
399 struct connlistener {
400 /* The first member has to be the same as in conn (see sock.c) */
401 __u8 sockstate;
402 struct bindnode *bn;
403 struct mutex lock;
404 int queue_maxlen;
405 int queue_len;
406 struct list_head conn_queue;
407 wait_queue_head_t wait;
412 * There are 2 conn objects per bi-directional connection. They refer to each
413 * other with in the reversedir field. To distinguish them, the variables on
414 * the stack are usually called rconn and sconn. rconn refers to the conn object
415 * which has received a command. sconn is the other conn object. This means that
416 * in send functions rconn means the connection we want to send the command to.
419 struct conn{
420 /* The first member has to be the same as in connlistener (see sock.c)*/
421 __u8 sockstate;
423 #define SOURCE_NONE 0
424 #define SOURCE_IN 1
425 #define SOURCE_SOCK 2
427 #define TARGET_UNCONNECTED 0
428 #define TARGET_OUT 1
429 #define TARGET_SOCK 2
431 __u8 sourcetype:4,
432 targettype:4;
434 __u8 qdisc_active;
437 * isreset values:
438 * 0... connection active
439 * 1... connection is about to be reset, target does not need to be
440 * notified
441 * 2... connection is reset
442 * 3... connection is reset + no pointers to "struct conn *reversedir"
443 * remaining except from this conn
445 atomic_t isreset;
447 struct list_head queue_list;
449 struct kref ref;
451 struct mutex rcv_lock;
453 /* state */
454 __u32 credits;
455 /* credit rate */
456 __s32 sender_crate;
457 __s32 resp_crate;
459 union{
460 struct{
461 struct neighbor *nb;
462 /* list of all connections from this neighbor */
463 struct list_head nb_list;
465 struct sk_buff_head reorder_queue;
467 struct htab_entry htab_entry;
468 __u32 conn_id;
469 __u32 next_seqno;
470 __u32 ooo_packets;
471 }in;
473 struct{
474 struct list_head cl_list;
475 wait_queue_head_t wait;
476 struct socket *sock;
477 int flags;
478 }sock;
479 }source;
481 union{
482 struct{
483 __u32 paramlen;
484 __u32 cmdread;
485 __u16 cmd;
486 __u8 *cmdparams;
488 __u32 stall_timeout_ms;
489 }unconnected;
491 struct{
492 /* has to be first (because it is first in target
493 * kernel too)
495 struct neighbor *nb;
496 /* list of all connections to this neighbor */
497 struct list_head nb_list;
498 /* protected by nb->retrans_lock, sorted by seqno */
499 struct list_head retrans_list;
501 __u32 conn_id;
502 __u32 seqno_nextsend;
503 __u32 seqno_acked;
504 __u32 seqno_windowlimit;
505 __u32 kp_windowsetseqno;
507 __u32 stall_timeout_ms;
508 }out;
510 struct{
511 wait_queue_head_t wait;
512 }sock;
513 }target;
515 struct data_buf buf;
517 struct conn *reversedir;
520 /* inside skb->cb */
521 struct skb_procstate{
522 union{
523 struct{
524 struct work_struct work;
525 }rcv;
527 struct{
528 __u32 offset;
529 }announce;
531 struct{
532 __u32 seqno;
533 }rcv2;
534 }funcstate;
538 /* common.c */
539 extern __u8 enc_window(__u32 window_bytes);
541 extern __u32 dec_window(__u8 window);
543 extern char *htable_get(struct htable *ht, __u32 key, void *searcheditem);
545 extern int htable_delete(struct htable *ht, __u32 key, void *searcheditem,
546 void (*free) (struct kref *ref));
548 extern void htable_insert(struct htable *ht, char *newelement, __u32 key);
550 extern void htable_init(struct htable *ht, int (*matches)(void *htentry,
551 void *searcheditem), __u32 entry_offset,
552 __u32 kref_offset);
554 extern struct conn *get_conn(__u32 conn_id);
556 extern void free_conn(struct kref *ref);
558 extern int conn_init_out(struct conn *rconn, struct neighbor *nb);
560 extern void conn_init_sock_source(struct conn *conn);
561 extern void conn_init_sock_target(struct conn *conn);
563 extern void close_port(struct connlistener *listener);
565 extern struct connlistener *open_port(__be64 port);
567 extern int connect_port(struct conn *rconn, __be64 port);
569 extern int connect_neigh(struct conn *rconn,
570 __u16 addrtypelen, __u8 *addrtype,
571 __u16 addrlen, __u8 *addr);
573 extern struct conn* alloc_conn(gfp_t allocflags);
575 extern void reset_conn(struct conn *conn);
577 /* neighbor.c */
578 extern void neighbor_free(struct kref *ref);
580 extern struct neighbor *get_neigh_by_mac(struct sk_buff *skb);
582 extern struct neighbor *find_neigh(__u16 addrtypelen, __u8 *addrtype,
583 __u16 addrlen, __u8 *addr);
585 extern __u32 generate_neigh_list(char *buf, __u32 buflen, __u32 limit,
586 __u32 offset);
588 extern int get_neigh_state(struct neighbor *nb);
590 extern void ping_resp(struct neighbor *nb, __u32 cookie, __u32 respdelay);
592 extern __u32 add_ping_req(struct neighbor *nb);
594 extern int time_to_send_ping(struct neighbor *nb);
596 extern int force_ping(struct neighbor *nb);
598 extern void rcv_announce(struct sk_buff *skb);
600 extern int __init cor_neighbor_init(void);
602 /* rcv.c */
603 extern void drain_ooo_queue(struct conn *rconn);
605 extern void conn_rcv_buildskb(char *data, __u32 datalen, __u32 conn_id,
606 __u32 seqno);
608 extern int __init cor_rcv_init(void);
610 /* kpacket_parse.c */
611 extern void kernel_packet(struct neighbor *nb, struct sk_buff *skb, __u32 seqno);
613 /* kpacket_gen.c */
614 extern void schedule_controlmsg_timerfunc(struct neighbor *nb);
616 struct control_msg_out;
618 extern struct control_msg_out *alloc_control_msg(void);
620 extern void free_control_msg(struct control_msg_out *cm);
622 extern void retransmit_timerfunc(struct work_struct *work);
624 extern void kern_ack_rcvd(struct neighbor *nb, __u32 seqno);
626 extern void send_pong(struct control_msg_out *cm, struct neighbor *nb,
627 __u32 cookie);
629 extern void send_reset_conn(struct control_msg_out *cm, struct neighbor *nb,
630 __u32 conn_id);
632 extern void send_ack(struct control_msg_out *cm, struct neighbor *nb,
633 __u32 seqno);
635 extern void send_ack_conn(struct control_msg_out *cm, struct neighbor *nb,
636 __u32 conn_id, __u32 seqno, __u8 window);
638 extern void send_ack_conn_ooo(struct control_msg_out *cm, struct neighbor *nb,
639 __u32 conn_id, __u32 seqno, __u8 window, __u32 seqno_ooo,
640 __u32 length);
642 extern void send_connect_success(struct control_msg_out *cm,
643 struct neighbor *nb, __u32 rcvd_conn_id, __u32 gen_conn_id);
645 extern void send_connect_nb(struct control_msg_out *cm, struct neighbor *nb,
646 __u32 conn_id);
648 extern void send_conndata(struct control_msg_out *cm, struct neighbor *nb,
649 __u32 connid, __u32 seqno, char *data_orig, char *data,
650 __u32 datalen);
652 extern void cor_kgen_init(void);
654 /* cpacket_parse.c */
655 extern void parse(struct conn *rconn);
657 /* snd.c */
658 extern struct sk_buff *create_packet(struct neighbor *nb, int size,
659 gfp_t alloc_flags, __u32 conn_id, __u32 seqno);
661 extern void cancel_retrans(struct conn *rconn);
663 extern void retransmit_conn_timerfunc(struct work_struct *work);
665 extern void conn_ack_rcvd(__u32 kpacket_seqno, struct conn *rconn, __u32 seqno,
666 __u8 window, __u32 seqno_ooo, __u32 length);
668 extern void flush_out(struct conn *rconn);
670 extern int __init cor_snd_init(void);
672 /* forward.c */
673 extern void databuf_pull(struct data_buf *data, char *dst, int len);
675 extern size_t databuf_pulluser(struct conn *sconn, struct msghdr *msg);
677 extern void databuf_pullold(struct data_buf *data, __u32 startpos, char *dst,
678 int len);
680 extern void databuf_ack(struct data_buf *buf, __u32 pos);
682 extern void databuf_ackread(struct data_buf *buf);
684 extern int databuf_maypush(struct data_buf *buf);
686 extern void databuf_free(struct data_buf *data);
688 extern void databuf_init(struct data_buf *data);
690 extern int receive_userbuf(struct conn *rconn, struct msghdr *msg);
692 extern void receive_buf(struct conn *rconn, char *buf, int len);
694 extern int receive_skb(struct conn *rconn, struct sk_buff *skb);
696 extern void wake_sender(struct conn *rconn);
698 extern void forward_init(void);
702 static inline struct skb_procstate *skb_pstate(struct sk_buff *skb)
704 return (struct skb_procstate *) &(skb->cb[0]);
707 static inline struct sk_buff *skb_from_pstate(struct skb_procstate *ps)
709 return (struct sk_buff *) (((char *)ps) - offsetof(struct sk_buff,cb));
713 static inline __u32 mss(struct neighbor *nb)
715 return nb->dev->mtu - LL_RESERVED_SPACE(nb->dev) - 9;
719 static inline void put_u64(char *dst, __u64 value, int convbo)
721 char *p_value = (char *) &value;
723 if (convbo)
724 value = cpu_to_be64(value);
726 dst[0] = p_value[0];
727 dst[1] = p_value[1];
728 dst[2] = p_value[2];
729 dst[3] = p_value[3];
730 dst[4] = p_value[4];
731 dst[5] = p_value[5];
732 dst[6] = p_value[6];
733 dst[7] = p_value[7];
736 static inline void put_u32(char *dst, __u32 value, int convbo)
738 char *p_value = (char *) &value;
740 if (convbo)
741 value = cpu_to_be32(value);
743 dst[0] = p_value[0];
744 dst[1] = p_value[1];
745 dst[2] = p_value[2];
746 dst[3] = p_value[3];
749 static inline void put_u16(char *dst, __u16 value, int convbo)
751 char *p_value = (char *) &value;
753 if (convbo)
754 value = cpu_to_be16(value);
756 dst[0] = p_value[0];
757 dst[1] = p_value[1];
760 static inline char *cor_pull_skb(struct sk_buff *skb, unsigned int len)
762 char *ptr = skb_pull(skb, len);
764 if(unlikely(ptr == 0))
765 return 0;
767 return ptr - len;