void GarminFilebasedDevice::userAnswered(const int answer) { if (answer == 1) { if (Log::enabledDbg()) Log::dbg("User wants file overwritten"); lockVariables(); this->overwriteFile = 1; unlockVariables(); } else { if (Log::enabledDbg()) Log::dbg("User wants file to be untouched"); lockVariables(); this->overwriteFile = 0; unlockVariables(); } lockVariables(); this->threadState = 1; /* set back to working */ unlockVariables(); signalThread(); }
void onTick() { lockSched(); int doResched = 0; while (1) { if (timedEvents == NULL) break; if (getNanotime() <= timedEvents->nanotime) break; TimedEvent *ev = timedEvents; Thread *thread = ev->thread; timedEvents = ev->next; if (timedEvents != NULL) timedEvents->prev = NULL; ev->prev = ev->next = NULL; doResched = doResched || signalThread(thread); }; unlockSched(); if (doResched) kyield(); };
void ipreasmPass(int family, char *srcaddr, char *dstaddr, int proto, uint32_t id, uint32_t fragOff, char *data, size_t fragSize, int moreFrags) { spinlockAcquire(&reasmLock); int found = 0; IPFragmentList *list; for (list=firstFragList; list!=NULL; list=list->next) { if (isMatchingFragmentList(list, family, srcaddr, dstaddr, id)) { if (list->proto != proto) { // ignore this packet because it's faulty kprintf_debug("OVERLAP\n"); spinlockRelease(&reasmLock); return; }; // see if this fragment is supposed to come before any that have so far arrived if (list->fragList->fragOffset > fragOff) { if (fragOff+fragSize > list->fragList->fragOffset) { // overlaps, reject kprintf_debug("OVERLAP\n"); spinlockRelease(&reasmLock); return; }; IPFragment *frag = NEW_EX(IPFragment, fragSize); frag->lastFragment = !moreFrags; frag->fragOffset = fragOff; frag->fragSize = fragSize; frag->prev = NULL; list->fragList->prev = frag; frag->next = list->fragList; memcpy(frag->data, data, fragSize); list->fragList = frag; } else { //kprintf_debug("here though\n"); // find where to place this fragment IPFragment *scan = list->fragList; while (scan != NULL) { if (scan->fragOffset == fragOff) { // duplicate; reject kprintf_debug("OVERLAP\n"); spinlockRelease(&reasmLock); return; }; int doit = 0; if (scan->next == NULL) { if (fragOff > scan->fragOffset) { if (scan->fragOffset+scan->fragSize > fragOff) { // overlaps kprintf_debug("OVERLAP\n"); spinlockRelease(&reasmLock); return; }; doit = 1; }; } else { if ((scan->fragOffset < fragOff) && (scan->next->fragOffset > fragOff)) { // reject this packet if it is overlapping if (scan->fragOffset+scan->fragSize > fragOff) { // overlaps previous fragment kprintf_debug("OVERLAP\n"); spinlockRelease(&reasmLock); return; }; if (fragOff+fragSize > scan->next->fragOffset) { // overlaps next fragment kprintf_debug("OVERLAP\n"); spinlockRelease(&reasmLock); return; }; doit = 1; }; }; if (doit) { // OK, we can finally place the fragment IPFragment *frag = NEW_EX(IPFragment, fragSize); frag->lastFragment = !moreFrags; frag->fragOffset = fragOff; frag->fragSize = fragSize; frag->prev = scan; frag->next = scan->next; if (scan->next != NULL) scan->next->prev = frag; scan->next = frag; memcpy(frag->data, data, fragSize); break; } else { scan = scan->next; }; }; }; found = 1; }; }; if (!found) { // create a new fragment list IPFragment *frag = NEW_EX(IPFragment, fragSize); frag->lastFragment = !moreFrags; frag->fragOffset = fragOff; frag->fragSize = fragSize; frag->prev = frag->next = NULL; memcpy(frag->data, data, fragSize); IPFragmentList *list = NEW(IPFragmentList); list->family = family; list->deadlineTicks = getTicks() + 60000; // deadline after 60 seconds memcpy(list->srcaddr, srcaddr, 16); memcpy(list->dstaddr, dstaddr, 16); list->id = id; list->proto = proto; list->fragList = frag; if (firstFragList == NULL) { firstFragList = lastFragList = list; list->prev = list->next = NULL; } else { lastFragList->next = list; list->next = NULL; list->prev = lastFragList; lastFragList = list; }; }; signalThread(reasmHandle); spinlockRelease(&reasmLock); };