summaryrefslogtreecommitdiff
path: root/ecp/src/ecp/rbuf.h
diff options
context:
space:
mode:
Diffstat (limited to 'ecp/src/ecp/rbuf.h')
-rw-r--r--ecp/src/ecp/rbuf.h115
1 files changed, 55 insertions, 60 deletions
diff --git a/ecp/src/ecp/rbuf.h b/ecp/src/ecp/rbuf.h
index 31aeb39..36ff963 100644
--- a/ecp/src/ecp/rbuf.h
+++ b/ecp/src/ecp/rbuf.h
@@ -5,49 +5,36 @@
#define ECP_RBUF_FLAG_CCONTROL 0x01
#define ECP_RBUF_FLAG_RELIABLE 0x02
-#define ECP_RBUF_FLAG_MSGQ 0x04
-#define ECP_MTYPE_RBACK 0x04
-#define ECP_MTYPE_RBFLUSH 0x05
-#define ECP_MTYPE_RBTIMER 0x06
-#define ECP_MTYPE_NOP 0x07
+
+#define ECP_MTYPE_RBNOP (0x08 | ECP_MTYPE_FLAG_SYS)
+#define ECP_MTYPE_RBACK (0x09 | ECP_MTYPE_FLAG_SYS)
+#define ECP_MTYPE_RBFLUSH (0x0a | ECP_MTYPE_FLAG_SYS)
+#define ECP_MTYPE_RBTIMER (0x0b | ECP_MTYPE_FLAG_SYS)
#define ECP_ERR_RBUF_DUP -100
+#define ECP_ERR_RBUF_TIMER -101
-typedef uint32_t ecp_win_t;
+#define ecp_rbuf_skip(mtype) (mtype & ECP_MTYPE_FLAG_SYS)
/* 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 uint32_t ecp_win_t;
-typedef struct ECPRBTimerItem {
- ECPTimerItem item;
- unsigned char empty;
-} ECPRBTimerItem;
+struct ECPMsgQ;
+struct ECPFragIter;
-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 buf[ECP_MAX_MSG];
+typedef struct ECPRBPayload {
+ unsigned char buf[ECP_MAX_PLD];
size_t size;
unsigned char flags;
-} ECPRBMessage;
+} ECPRBPayload;
typedef struct ECPRBPacket {
unsigned char buf[ECP_MAX_PKT];
size_t size;
unsigned char flags;
- ECPRBTimerItem *timer;
} ECPRBPacket;
typedef struct ECPRBuffer {
@@ -56,27 +43,31 @@ typedef struct ECPRBuffer {
unsigned short arr_size;
unsigned short idx_start;
union {
- ECPRBMessage *msg;
+ ECPRBPayload *pld;
ECPRBPacket *pkt;
} arr;
} ECPRBuffer;
typedef struct ECPRBRecv {
+ unsigned char start;
unsigned char flags;
- ecp_cts_t deliver_delay;
+ ecp_sts_t deliver_delay;
unsigned short hole_max;
unsigned short ack_rate;
unsigned short ack_pkt;
ecp_seq_t seq_ack;
ecp_ack_t ack_map;
ECPRBuffer rbuf;
+#ifdef ECP_WITH_PTHREAD
+ pthread_mutex_t mutex;
+#endif
#ifdef ECP_WITH_MSGQ
- ECPConnMsgQ msgq;
+ struct ECPMsgQ *msgq;
#endif
- struct ECPFragIter *frag_iter;
} ECPRBRecv;
typedef struct ECPRBSend {
+ unsigned char start;
unsigned char flags;
ecp_win_t win_size;
ecp_win_t in_transit;
@@ -87,42 +78,46 @@ typedef struct ECPRBSend {
unsigned char flush;
unsigned int nack_rate;
ECPRBuffer rbuf;
- ECPRBTimer *timer;
#ifdef ECP_WITH_PTHREAD
pthread_mutex_t mutex;
#endif
} ECPRBSend;
-typedef struct ECPConnRBuffer {
+typedef struct ECPRBConn {
+ ECPConnection b;
ECPRBRecv *recv;
ECPRBSend *send;
-} ECPConnRBuffer;
+ struct ECPFragIter *iter;
+} ECPRBConn;
-int _ecp_rbuf_start(ECPRBuffer *rbuf, ecp_seq_t seq);
+ECPRBConn *ecp_rbuf_get_rbconn(ECPConnection *conn);
+ECPConnection *ecp_rbuf_get_conn(ECPRBConn *conn);
+void _ecp_rbuf_start(ECPRBuffer *rbuf, ecp_seq_t seq);
int _ecp_rbuf_msg_idx(ECPRBuffer *rbuf, ecp_seq_t seq, unsigned short *idx);
-
-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 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_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, 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);
-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_timer(struct ECPConnection *conn, ecp_seq_t seq, unsigned char mtype, unsigned char *msg, ssize_t size, struct ECP2Buffer *b);
+void ecp_rbuf_conn_init(ECPRBConn *conn);
+int ecp_rbuf_conn_create(ECPRBConn *conn, ECPSocket *sock, unsigned char type);
+int ecp_rbuf_conn_create_inb(ECPRBConn *conn, ECPSocket *sock, unsigned char type);
+void ecp_rbuf_destroy(ECPRBConn *conn);
+void ecp_rbuf_start(ECPRBConn *conn);
+ssize_t ecp_rbuf_msg_handle(ECPRBConn *conn, ecp_seq_t seq, unsigned char mtype, unsigned char *msg, size_t msg_size, ECP2Buffer *bufs);
+int ecp_rbuf_err_handle(ECPRBConn *conn, unsigned char mtype, int err);
+
+/* send */
+ssize_t ecp_rbuf_send_flush(ECPRBConn *conn);
+ssize_t ecp_rbuf_handle_ack(ECPRBConn *conn, unsigned char *msg, size_t msg_size);
+int ecp_rbsend_create(ECPRBConn *conn, ECPRBSend *buf, ECPRBPacket *pkt, unsigned short pkt_size);
+void ecp_rbsend_destroy(ECPRBConn *conn);
+void ecp_rbsend_start(ECPRBConn *conn, ecp_seq_t seq);
+int ecp_rbuf_set_wsize(ECPRBConn *conn, ecp_win_t size);
+int ecp_rbuf_flush(ECPRBConn *conn);
+ssize_t ecp_rbuf_pld_send(ECPRBConn *conn, ECPBuffer *payload, size_t pld_size, ECPBuffer *packet, size_t pkt_size, ECPTimerItem *ti);
+
+ssize_t ecp_rbuf_handle_nop(ECPRBConn *conn, unsigned char *msg, size_t msg_size);
+ssize_t ecp_rbuf_handle_flush(ECPRBConn *conn);
+void ecp_rbuf_handle_timer(ECPRBConn *conn) ;
+int ecp_rbrecv_create(ECPRBConn *conn, ECPRBRecv *buf, ECPRBPayload *pld, unsigned short pld_size);
+void ecp_rbrecv_destroy(ECPRBConn *conn);
+void ecp_rbrecv_start(ECPRBConn *conn, ecp_seq_t seq);
+int ecp_rbuf_set_hole(ECPRBConn *conn, unsigned short hole_max);
+int ecp_rbuf_set_delay(ECPRBConn *conn, ecp_sts_t delay);
+ssize_t ecp_rbuf_store(ECPRBConn *conn, ecp_seq_t seq, unsigned char *pld, size_t pld_size);