int mul_cc_recv_pkt(uint64_t dp_id, uint8_t aux_id, void *of_msg, uint32_t msg_len) { struct cbuf *b = NULL; if(cbuf_list_queue_len(&ctrl_hdl.c_main_buf_head) > 1024) { // Throw an error c_log_err("Main thread buffer queue is full\n"); } else { // Allocate b = alloc_cbuf(msg_len); if(b == NULL) { // Kajal: What else to log for a new connection // chann_id.aux_id -- is of type uint64_t // c_log_err("Buffer node could not be allocated dp-id:0x%x aux-id:0x%x\n", // chann_id.dp_id, chann_id.aux_id); //return 0; } // if_msg should be freed by library assuming that // buffer should copy it. memcpy(b->data, of_msg, msg_len); // Insert buffer in queue cbuf_list_queue_tail(&ctrl_hdl.c_main_buf_head, b); } return 0; }
struct cbuf * cbuf_realloc_tailroom(struct cbuf *b, size_t room, int do_free) { struct cbuf *old = b; if (room < cbuf_tailroom(b)) { b = alloc_cbuf(old->len + room); cbuf_put(b, old->len); memcpy(b->data, old->data, old->len); if (do_free) free(old); } return b; }
struct cbuf * cbuf_realloc_headroom(struct cbuf *b, size_t room, int do_free) { struct cbuf *old = b; if (1 /*room < cbuf_headroom(b)*/) { b = alloc_cbuf(old->len + room); cbuf_put(b, old->len + room); cbuf_pull(b, room); memcpy(b->data, old->data, old->len); //printf(" b %p b->data %p b->tail %p b->end %p\n", b, b->data, b->tail, b->end); if (do_free) free(old); } return b; }
int tcp_write_buf(struct tcp_sock *tsk, void *data, unsigned int len) { struct cbuf *cbuf = tsk->rcv_buf; int rlen; /* first text */ if (!cbuf) { cbuf = alloc_cbuf(tsk->rcv_wnd); tsk->rcv_buf = cbuf; } /* write text to circular buffer */ rlen = write_cbuf(cbuf, (char *)data, len); if (rlen > 0) { tsk->rcv_wnd -= rlen; /* assert rlen >= 0 */ tsk->rcv_nxt += rlen; } return rlen; }