- Timer mutex bugs fixed (again...)
- IPRA bugs fixed
This commit is contained in:
parent
ae2c228bda
commit
5fa42c0326
@ -55,7 +55,7 @@ static void ipra_remove_chain(IPv4Assembler * ipra, uint16_t id) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
timer_unsched(E.tmr, chainDesc->id); // remove timeout schedule
|
timer_unsched(E.tmr, chainDesc->alarmID); // remove timeout schedule
|
||||||
IPv4Fragment * iter = chainDesc->fragChain; // unlink and release fragment chain
|
IPv4Fragment * iter = chainDesc->fragChain; // unlink and release fragment chain
|
||||||
while (iter != NULL) {
|
while (iter != NULL) {
|
||||||
IPv4Fragment * oldIter = iter;
|
IPv4Fragment * oldIter = iter;
|
||||||
@ -66,7 +66,7 @@ static void ipra_remove_chain(IPv4Assembler * ipra, uint16_t id) {
|
|||||||
FragChainDesc * chainIter = ipra->chains;
|
FragChainDesc * chainIter = ipra->chains;
|
||||||
while (chainIter != NULL) { // unlink chain from chain list
|
while (chainIter != NULL) { // unlink chain from chain list
|
||||||
if (chainIter->next == chainDesc) { // if element is found
|
if (chainIter->next == chainDesc) { // if element is found
|
||||||
chainIter->next = chainDesc->next; // skip by looked up element by setting next properly
|
chainIter->next = chainDesc->next; // skip looked up element by setting next properly
|
||||||
break; // break the loop
|
break; // break the loop
|
||||||
}
|
}
|
||||||
chainIter = chainIter->next;
|
chainIter = chainIter->next;
|
||||||
@ -104,7 +104,7 @@ static void ipra_insert_into_chain(FragChainDesc *chainDesc, const IPv4Props *ip
|
|||||||
((iter->next == NULL) || (iter->next->offset >= (frag->offset + frag->size)))) {
|
((iter->next == NULL) || (iter->next->offset >= (frag->offset + frag->size)))) {
|
||||||
frag->next = iter->next;
|
frag->next = iter->next;
|
||||||
iter->next = frag;
|
iter->next = frag;
|
||||||
} else if ((iter == chainDesc->fragChain) && (frag->offset < iter->offset)) { // insert before the firstly received segment
|
} else if ((iter == chainDesc->fragChain) && (frag->offset < iter->offset)) { // insert before the first received segment
|
||||||
frag->next = iter;
|
frag->next = iter;
|
||||||
chainDesc->fragChain = frag;
|
chainDesc->fragChain = frag;
|
||||||
}
|
}
|
||||||
@ -141,8 +141,7 @@ void ipra_input(IPv4Assembler *ipra, const IPv4Props *ipProps, const uint8_t *pa
|
|||||||
AlarmUserData aud;
|
AlarmUserData aud;
|
||||||
aud.ptr = ipra;
|
aud.ptr = ipra;
|
||||||
aud.u = chainDesc->id;
|
aud.u = chainDesc->id;
|
||||||
timer_sched_rel(E.tmr, IP_REASSEMBLY_TIMEOUT_US, ipra_timeout, aud);
|
chainDesc->alarmID = timer_sched_rel(E.tmr, IP_REASSEMBLY_TIMEOUT_US, ipra_timeout, aud);
|
||||||
timer_report(E.tmr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ipra_try_reassemble(IPv4Assembler *ipra, uint16_t id, uint8_t **payload, uint16_t *size, PcktHeaderElement *pcktHdrLe) {
|
bool ipra_try_reassemble(IPv4Assembler *ipra, uint16_t id, uint8_t **payload, uint16_t *size, PcktHeaderElement *pcktHdrLe) {
|
||||||
|
10
timer.c
10
timer.c
@ -106,7 +106,6 @@ uint32_t timer_sched(Timer *tmr, const TimePoint *t, TimerAlarmCb cb, AlarmUserD
|
|||||||
|
|
||||||
// increase allocation count
|
// increase allocation count
|
||||||
tmr->nSched++;
|
tmr->nSched++;
|
||||||
MSG("%d %s\n", tmr->nSched, __FUNCTION__);
|
|
||||||
|
|
||||||
// replace nearest if needed
|
// replace nearest if needed
|
||||||
if (tmr->nSched > 1) {
|
if (tmr->nSched > 1) {
|
||||||
@ -129,6 +128,10 @@ uint32_t timer_sched_rel(Timer *tmr, int64_t us, TimerAlarmCb cb, AlarmUserData
|
|||||||
}
|
}
|
||||||
|
|
||||||
void timer_unsched(Timer *tmr, uint32_t id) {
|
void timer_unsched(Timer *tmr, uint32_t id) {
|
||||||
|
if (id == 0) { // no unscheduling on receiving unknown id
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ETHLIB_OS_MTX_LOCK(&(tmr->tabMtx));
|
ETHLIB_OS_MTX_LOCK(&(tmr->tabMtx));
|
||||||
|
|
||||||
if (tmr->nSched > 0) {
|
if (tmr->nSched > 0) {
|
||||||
@ -136,7 +139,6 @@ void timer_unsched(Timer *tmr, uint32_t id) {
|
|||||||
if (alarm != NULL) {
|
if (alarm != NULL) {
|
||||||
memset(alarm, 0, sizeof(AlarmAssignment));
|
memset(alarm, 0, sizeof(AlarmAssignment));
|
||||||
tmr->nSched--;
|
tmr->nSched--;
|
||||||
MSG("%d %s\n", tmr->nSched, __FUNCTION__);
|
|
||||||
timer_update_nearest_alarm(tmr);
|
timer_update_nearest_alarm(tmr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -181,11 +183,12 @@ void timer_tick(Timer *tmr, int64_t us) {
|
|||||||
|
|
||||||
// decrease scheduled alarm count
|
// decrease scheduled alarm count
|
||||||
tmr->nSched--;
|
tmr->nSched--;
|
||||||
MSG("%d %s\n", tmr->nSched, __FUNCTION__);
|
|
||||||
|
|
||||||
// update nearest alarm
|
// update nearest alarm
|
||||||
timer_update_nearest_alarm(tmr);
|
timer_update_nearest_alarm(tmr);
|
||||||
|
|
||||||
|
ETHLIB_OS_MTX_UNLOCK(&(tmr->tabMtx));
|
||||||
|
|
||||||
// invoke callback
|
// invoke callback
|
||||||
if (alarm.cb != NULL) {
|
if (alarm.cb != NULL) {
|
||||||
alarm.cb(tmr, alarm.params);
|
alarm.cb(tmr, alarm.params);
|
||||||
@ -195,7 +198,6 @@ void timer_tick(Timer *tmr, int64_t us) {
|
|||||||
t_alarm = time_to_us(&(tmr->nextAlarm->time));
|
t_alarm = time_to_us(&(tmr->nextAlarm->time));
|
||||||
}
|
}
|
||||||
|
|
||||||
ETHLIB_OS_MTX_UNLOCK(&(tmr->tabMtx));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user