-RX queue added
-Multiplatform thread and semaphore definitions added
This commit is contained in:
parent
704fef911f
commit
b45e8cd81d
@ -18,6 +18,9 @@ static void ethintf_register(EthInterface * intf) {
|
|||||||
intf->ioDef->llRxDone = ethintf_llrecv;
|
intf->ioDef->llRxDone = ethintf_llrecv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// interface processing thread
|
||||||
|
static void * ethinf_proc_thread(void * param);
|
||||||
|
|
||||||
EthInterface *ethintf_new(EthIODef * io) {
|
EthInterface *ethintf_new(EthIODef * io) {
|
||||||
EthInterface * ethIntf = (EthInterface *)dynmem_alloc(sizeof(EthInterface));
|
EthInterface * ethIntf = (EthInterface *)dynmem_alloc(sizeof(EthInterface));
|
||||||
ASSERT_NULL(ethIntf);
|
ASSERT_NULL(ethIntf);
|
||||||
@ -31,14 +34,36 @@ EthInterface *ethintf_new(EthIODef * io) {
|
|||||||
ethintf_register(ethIntf);
|
ethintf_register(ethIntf);
|
||||||
|
|
||||||
ethIntf->txQ = mq_create(ETHLIB_DEF_MQ_SIZE);
|
ethIntf->txQ = mq_create(ETHLIB_DEF_MQ_SIZE);
|
||||||
|
ethIntf->rxQ = mq_create(ETHLIB_DEF_MQ_SIZE);
|
||||||
|
ETHLIB_OS_SEM_CREATE(ðIntf->rxSem);
|
||||||
|
ETHLIB_OS_THREAD_DEFINE(ethinf_proc_thread, ipp, 10, 4096, ethIntf);
|
||||||
|
ETHLIB_OS_THREAD_CREATE(ipp, ethIntf);
|
||||||
|
|
||||||
ethIntf->ipra = ipra_new();
|
ethIntf->ipra = ipra_new();
|
||||||
|
|
||||||
return ethIntf;
|
return ethIntf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void * ethinf_proc_thread(void * param) {
|
||||||
|
EthInterface * intf = (EthInterface *) param;
|
||||||
|
while (true) {
|
||||||
|
ETHLIB_OS_SEM_WAIT(&intf->rxSem);
|
||||||
|
if (mq_avail(intf->rxQ) > 0) {
|
||||||
|
RawPckt rawPckt = mq_top(intf->rxQ);
|
||||||
|
mq_pop(intf->rxQ);
|
||||||
|
packsieve_input(&intf->sieve, &rawPckt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void ethinf_receive(EthInterface *intf, const RawPckt *rawPckt) {
|
void ethinf_receive(EthInterface *intf, const RawPckt *rawPckt) {
|
||||||
packsieve_input(&intf->sieve, rawPckt);
|
bool pushOK = mq_push(intf->rxQ, rawPckt);
|
||||||
|
if (pushOK) {
|
||||||
|
ETHLIB_OS_SEM_POST(&intf->rxSem);
|
||||||
|
} else {
|
||||||
|
ERROR("Input queue full, packet dropped!\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ethinf_transmit(EthInterface *intf, const RawPckt *rawPckt) {
|
void ethinf_transmit(EthInterface *intf, const RawPckt *rawPckt) {
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "connection_block.h"
|
#include "connection_block.h"
|
||||||
#include "msg_queue.h"
|
#include "msg_queue.h"
|
||||||
#include "prefab/conn_blocks/ipv4/ip_assembler.h"
|
#include "prefab/conn_blocks/ipv4/ip_assembler.h"
|
||||||
|
#include "etherlib_options.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ethernet interface low level definition.
|
* Ethernet interface low level definition.
|
||||||
@ -36,6 +37,8 @@ typedef struct EthInterface_ {
|
|||||||
ArpCache * arpc; ///< ARP cache
|
ArpCache * arpc; ///< ARP cache
|
||||||
ConnBlock arpCb; ///< ARP connection block
|
ConnBlock arpCb; ///< ARP connection block
|
||||||
MsgQueue * txQ; ///< Transmit queue
|
MsgQueue * txQ; ///< Transmit queue
|
||||||
|
MsgQueue * rxQ; ///< Receive queue
|
||||||
|
ETHLIB_OS_SEM_TYPE rxSem; ///< Receive queue semaphore
|
||||||
IPv4Assembler * ipra; ///< IPv4 reassembler
|
IPv4Assembler * ipra; ///< IPv4 reassembler
|
||||||
} EthInterface;
|
} EthInterface;
|
||||||
|
|
||||||
|
@ -37,7 +37,6 @@ bool q_push(Queue * q, const void * src) {
|
|||||||
|
|
||||||
// can push
|
// can push
|
||||||
memcpy(q->elements + q->writeIdx * q->elemSize, src, q->elemSize);
|
memcpy(q->elements + q->writeIdx * q->elemSize, src, q->elemSize);
|
||||||
q->writeIdx++;
|
|
||||||
|
|
||||||
// advance write pointer
|
// advance write pointer
|
||||||
q->writeIdx = MQ_NEXT(q->length, q->writeIdx);
|
q->writeIdx = MQ_NEXT(q->length, q->writeIdx);
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
#include "msg_queue.h"
|
#include "msg_queue.h"
|
||||||
#include "dynmem.h"
|
#include "dynmem.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
MsgQueue *mq_create(uint32_t size) {
|
MsgQueue *mq_create(uint32_t size) {
|
||||||
MsgQueue * mq = (MsgQueue *) dynmem_alloc(sizeof(MsgQueue) + size * sizeof(RawPckt));
|
MsgQueue * mq = (MsgQueue *) dynmem_alloc(sizeof(MsgQueue) + size * sizeof(RawPckt));
|
||||||
mq->size = size;
|
mq->size = size;
|
||||||
@ -35,7 +37,7 @@ bool mq_push(MsgQueue * mq, const RawPckt * raw) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// can push
|
// can push
|
||||||
mq->pckts[mq->writeIdx++] = *raw;
|
mq->pckts[mq->writeIdx] = *raw;
|
||||||
|
|
||||||
// advance write pointer
|
// advance write pointer
|
||||||
mq->writeIdx = MQ_NEXT(mq->size, mq->writeIdx);
|
mq->writeIdx = MQ_NEXT(mq->size, mq->writeIdx);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user