/*---------------------------------------------------------------------------*/ void queuebuf_to_packetbuf(struct queuebuf *b) { if(memb_inmemb(&bufmem, b)) { struct queuebuf_data *buframptr = queuebuf_load_to_ram(b); packetbuf_copyfrom(buframptr->data, buframptr->len); packetbuf_attr_copyfrom(buframptr->attrs, buframptr->addrs); } }
/*---------------------------------------------------------------------------*/ void packet_sent(uint8_t sessionid, uint8_t status, uint8_t tx) { if(sessionid < MAX_CALLBACKS) { struct tx_callback *callback; callback = &callbacks[sessionid]; packetbuf_clear(); packetbuf_attr_copyfrom(callback->attrs, callback->addrs); mac_call_sent_callback(callback->cback, callback->ptr, status, tx); } else { PRINTF("*** ERROR: too high session id %d\n", sessionid); } }
/*---------------------------------------------------------------------------*/ static void packet_timeout(void *ptr) { struct tx_callback *callback = ptr; if (callback->isused) { callback_count--; callback->isused = 0; native_rdc_ack_timeout++; LOG6LBR_ERROR("br-rdc: send failed, slip ack timeout (%d)\n", callback->sid); packetbuf_clear(); packetbuf_attr_copyfrom(callback->attrs, callback->addrs); mac_call_sent_callback(callback->cback, callback->ptr, MAC_TX_NOACK, 1); } else { LOG6LBR_ERROR("br-rdc: ack timeout for already acked packet (%d)\n", callback->sid); } }
/*---------------------------------------------------------------------------*/ void queuebuf_to_packetbuf(struct queuebuf *b) { struct queuebuf_ref *r; if(memb_inmemb(&bufmem, b)) { struct queuebuf_data *buframptr = queuebuf_load_to_ram(b); packetbuf_copyfrom(buframptr->data, buframptr->len); packetbuf_attr_copyfrom(buframptr->attrs, buframptr->addrs); } else if(memb_inmemb(&refbufmem, b)) { r = (struct queuebuf_ref *)b; packetbuf_clear(); packetbuf_copyfrom(r->ref, r->len); packetbuf_hdralloc(r->hdrlen); memcpy(packetbuf_hdrptr(), r->hdr, r->hdrlen); } }
/*---------------------------------------------------------------------------*/ void packet_sent(uint8_t sessionid, uint8_t status, uint8_t tx) { LOG6LBR_PRINTF(PACKET, RADIO_OUT, "sid ack: %d (%d, %d)\n", sessionid, status, tx); if(sessionid < MAX_CALLBACKS) { struct tx_callback *callback; callback = &callbacks[sessionid]; if (callback->isused) { callback_count--; callback->isused = 0; packetbuf_clear(); packetbuf_attr_copyfrom(callback->attrs, callback->addrs); ctimer_stop(&callback->timeout); mac_call_sent_callback(callback->cback, callback->ptr, status, tx); } else { LOG6LBR_ERROR("br-rdc: ack received for unknown packet (%d)\n", callback->sid); } } else { LOG6LBR_ERROR("*** ERROR: too high session id %d\n", sessionid); } }