summaryrefslogtreecommitdiff
path: root/ecp/src/rbuf.h
diff options
context:
space:
mode:
Diffstat (limited to 'ecp/src/rbuf.h')
-rw-r--r--ecp/src/rbuf.h61
1 files changed, 34 insertions, 27 deletions
diff --git a/ecp/src/rbuf.h b/ecp/src/rbuf.h
index 891f29d..31aeb39 100644
--- a/ecp/src/rbuf.h
+++ b/ecp/src/rbuf.h
@@ -1,7 +1,7 @@
#define ECP_RBUF_FLAG_IN_RBUF 0x01
#define ECP_RBUF_FLAG_IN_MSGQ 0x02
-#define ECP_RBUF_FLAG_IN_CCONTROL 0x04
-#define ECP_RBUF_FLAG_SYS 0x80
+#define ECP_RBUF_FLAG_IN_TIMER 0x04
+#define ECP_RBUF_FLAG_SKIP 0x08
#define ECP_RBUF_FLAG_CCONTROL 0x01
#define ECP_RBUF_FLAG_RELIABLE 0x02
@@ -9,58 +9,66 @@
#define ECP_MTYPE_RBACK 0x04
#define ECP_MTYPE_RBFLUSH 0x05
-#define ECP_MTYPE_RBFLUSH_PTS 0x06
+#define ECP_MTYPE_RBTIMER 0x06
#define ECP_MTYPE_NOP 0x07
#define ECP_ERR_RBUF_DUP -100
-#define ECP_ERR_RBUF_FULL -101
typedef uint32_t ecp_win_t;
/* size must be power of 2 */
#define ECP_RBUF_IDX_MASK(idx, size) ((idx) & ((size) - 1))
+#define ecp_rbuf_skip(mtype) ((mtype & ECP_MTYPE_MASK) < ECP_MTYPE_NOP ? 1 : 0)
#ifdef ECP_WITH_MSGQ
#include "msgq.h"
#endif
typedef struct ECPRBTimerItem {
- unsigned char occupied;
ECPTimerItem item;
+ unsigned char empty;
} ECPRBTimerItem;
typedef struct ECPRBTimer {
ECPRBTimerItem item[ECP_MAX_TIMER];
unsigned short idx_w;
+#ifdef ECP_WITH_PTHREAD
+ pthread_mutex_t mutex;
+#endif
} ECPRBTimer;
typedef struct ECPRBMessage {
- unsigned char msg[ECP_MAX_PKT];
- ssize_t size;
+ unsigned char buf[ECP_MAX_MSG];
+ size_t size;
unsigned char flags;
- short idx_t;
} ECPRBMessage;
+typedef struct ECPRBPacket {
+ unsigned char buf[ECP_MAX_PKT];
+ size_t size;
+ unsigned char flags;
+ ECPRBTimerItem *timer;
+} ECPRBPacket;
+
typedef struct ECPRBuffer {
ecp_seq_t seq_start;
ecp_seq_t seq_max;
- unsigned int msg_size;
- unsigned int msg_start;
- ECPRBMessage *msg;
+ unsigned short arr_size;
+ unsigned short idx_start;
+ union {
+ ECPRBMessage *msg;
+ ECPRBPacket *pkt;
+ } arr;
} ECPRBuffer;
typedef struct ECPRBRecv {
unsigned char flags;
- unsigned char timer_pts;
- unsigned char ack_do;
+ ecp_cts_t deliver_delay;
unsigned short hole_max;
unsigned short ack_rate;
- ecp_pts_t deliver_delay;
+ unsigned short ack_pkt;
ecp_seq_t seq_ack;
- ecp_seq_t ack_pkt;
ecp_ack_t ack_map;
- ecp_ack_t hole_mask_full;
- ecp_ack_t hole_mask_empty;
ECPRBuffer rbuf;
#ifdef ECP_WITH_MSGQ
ECPConnMsgQ msgq;
@@ -70,15 +78,16 @@ typedef struct ECPRBRecv {
typedef struct ECPRBSend {
unsigned char flags;
- unsigned char flush;
ecp_win_t win_size;
ecp_win_t in_transit;
ecp_win_t cnt_cc;
ecp_seq_t seq_cc;
ecp_seq_t seq_flush;
+ ecp_seq_t seq_nack;
+ unsigned char flush;
unsigned int nack_rate;
ECPRBuffer rbuf;
- ECPRBTimer timer;
+ ECPRBTimer *timer;
#ifdef ECP_WITH_PTHREAD
pthread_mutex_t mutex;
#endif
@@ -89,28 +98,26 @@ typedef struct ECPConnRBuffer {
ECPRBSend *send;
} ECPConnRBuffer;
-int _ecp_rbuf_init(ECPRBuffer *rbuf, ECPRBMessage *msg, unsigned int msg_size);
int _ecp_rbuf_start(ECPRBuffer *rbuf, ecp_seq_t seq);
-int _ecp_rbuf_msg_idx(ECPRBuffer *rbuf, ecp_seq_t seq);
-ssize_t _ecp_rbuf_msg_store(ECPRBuffer *rbuf, ecp_seq_t seq, int idx, unsigned char *msg, size_t msg_size, unsigned char test_flags, unsigned char set_flags);
+int _ecp_rbuf_msg_idx(ECPRBuffer *rbuf, ecp_seq_t seq, unsigned short *idx);
-int ecp_rbuf_create(struct ECPConnection *conn, ECPRBSend *buf_s, ECPRBMessage *msg_s, unsigned int msg_s_size, ECPRBRecv *buf_r, ECPRBMessage *msg_r, unsigned int msg_r_size);
+int ecp_rbuf_create(struct ECPConnection *conn, ECPRBSend *buf_s, ECPRBPacket *msg_s, unsigned int msg_s_size, ECPRBRecv *buf_r, ECPRBMessage *msg_r, unsigned int msg_r_size);
void ecp_rbuf_destroy(struct ECPConnection *conn);
ssize_t ecp_rbuf_pld_send(struct ECPConnection *conn, struct ECPBuffer *packet, struct ECPBuffer *payload, size_t pld_size, unsigned char flags, ecp_seq_t seq);
int ecp_rbuf_handle_seq(struct ECPConnection *conn, unsigned char mtype);
int ecp_rbuf_set_seq(struct ECPConnection *conn, struct ECPSeqItem *si, unsigned char *payload, size_t pld_size);
ssize_t ecp_rbuf_pkt_send(struct ECPConnection *conn, struct ECPSocket *sock, ECPNetAddr *addr, struct ECPBuffer *packet, size_t pkt_size, unsigned char flags, ECPTimerItem *ti, struct ECPSeqItem *si);
-int ecp_rbuf_recv_create(struct ECPConnection *conn, ECPRBRecv *buf, ECPRBMessage *msg, unsigned int msg_size);
+int ecp_rbuf_recv_create(struct ECPConnection *conn, ECPRBRecv *buf, ECPRBMessage *msg, unsigned short msg_size);
void ecp_rbuf_recv_destroy(struct ECPConnection *conn);
int ecp_rbuf_recv_start(struct ECPConnection *conn, ecp_seq_t seq);
int ecp_rbuf_set_hole(struct ECPConnection *conn, unsigned short hole_max);
-int ecp_rbuf_set_delay(struct ECPConnection *conn, ecp_pts_t delay);
+int ecp_rbuf_set_delay(struct ECPConnection *conn, ecp_cts_t delay);
ssize_t ecp_rbuf_store(struct ECPConnection *conn, ecp_seq_t seq, unsigned char *msg, size_t msg_size, struct ECP2Buffer *b);
struct ECPFragIter *ecp_rbuf_get_frag_iter(struct ECPConnection *conn);
-int ecp_rbuf_send_create(struct ECPConnection *conn, ECPRBSend *buf, ECPRBMessage *msg, unsigned int msg_size);
+int ecp_rbuf_send_create(struct ECPConnection *conn, ECPRBSend *buf, ECPRBPacket *msg, unsigned short msg_size);
void ecp_rbuf_send_destroy(struct ECPConnection *conn);
int ecp_rbuf_send_start(struct ECPConnection *conn);
int ecp_rbuf_flush(struct ECPConnection *conn);
@@ -118,4 +125,4 @@ int ecp_rbuf_set_wsize(struct ECPConnection *conn, ecp_win_t size);
ssize_t ecp_rbuf_handle_ack(struct ECPConnection *conn, ecp_seq_t seq, unsigned char mtype, unsigned char *msg, ssize_t size, struct ECP2Buffer *b);
ssize_t ecp_rbuf_handle_flush(struct ECPConnection *conn, ecp_seq_t seq, unsigned char mtype, unsigned char *msg, ssize_t size, struct ECP2Buffer *b);
-ssize_t ecp_rbuf_handle_flush_pts(struct ECPConnection *conn, ecp_seq_t seq, unsigned char mtype, unsigned char *msg, ssize_t size, struct ECP2Buffer *b);
+ssize_t ecp_rbuf_handle_timer(struct ECPConnection *conn, ecp_seq_t seq, unsigned char mtype, unsigned char *msg, ssize_t size, struct ECP2Buffer *b);