void ccnl_interface_enqueue(void (tx_done)(void*, int, int), struct ccnl_face_s *f, struct ccnl_relay_s *ccnl, struct ccnl_if_s *ifc, struct ccnl_buf_s *buf, sockunion *dest) { struct ccnl_txrequest_s *r; DEBUGMSG_CORE(TRACE, "enqueue interface=%p buf=%p len=%d (qlen=%d)\n", (void*)ifc, (void*)buf, buf ? buf->datalen : -1, ifc ? ifc->qlen : -1); if (ifc->qlen >= CCNL_MAX_IF_QLEN) { DEBUGMSG_CORE(WARNING, " DROPPING buf=%p\n", (void*)buf); ccnl_free(buf); return; } r = ifc->queue + ((ifc->qfront + ifc->qlen) % CCNL_MAX_IF_QLEN); r->buf = buf; memcpy(&r->dst, dest, sizeof(sockunion)); r->txdone = tx_done; r->txdone_face = f; ifc->qlen++; #ifdef USE_SCHEDULER ccnl_sched_RTS(ifc->sched, 1, buf->datalen, ccnl, ifc); #else ccnl_interface_CTS(ccnl, ifc); #endif }
int ccnl_face_enqueue(struct ccnl_relay_s *ccnl, struct ccnl_face_s *to, struct ccnl_buf_s *buf) { struct ccnl_buf_s *msg; if (buf == NULL) { DEBUGMSG_CORE(ERROR, "enqueue face: buf most not be NULL\n"); return -1; } DEBUGMSG_CORE(TRACE, "enqueue face=%p (id=%d.%d) buf=%p len=%zd\n", (void*) to, ccnl->id, to->faceid, (void*) buf, buf ? buf->datalen : -1); for (msg = to->outq; msg; msg = msg->next) // already in the queue? if (buf_equal(msg, buf)) { DEBUGMSG_CORE(VERBOSE, " not enqueued because already there\n"); ccnl_free(buf); return -1; } buf->next = NULL; if (to->outqend) to->outqend->next = buf; else to->outq = buf; to->outqend = buf; #ifdef USE_SCHEDULER if (to->sched) { #ifdef USE_FRAG int len, cnt = ccnl_frag_getfragcount(to->frag, buf->datalen, &len); #else int len = buf->datalen, cnt = 1; #endif ccnl_sched_RTS(to->sched, cnt, len, ccnl, to); } else ccnl_face_CTS(ccnl, to); #else ccnl_face_CTS(ccnl, to); #endif return 0; }