📄 rreqtable.c
字号:
/* * Copyright (C) 2001, University of California, Santa Barbara * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Other copyrights might apply to parts of this software and are so * noted when applicable. *//* * Parts of this program has been derived from PIM sparse-mode pimd. * The pimd program is covered by the license in the accompanying file * named "LICENSE.pimd". * * The pimd program is COPYRIGHT 1998 by University of Southern California. * */#include <stdlib.h>#include <sys/types.h>#include "aodvConst.h"#include "const.h"#include "debug.h"#include "inet.h"#include "routingTable.h"struct RreqTableEntry { u_int32_t src; u_int32_t broadcastId; u_int32_t lifetime; struct RreqTableEntry *next;};static struct RreqTableEntry *firstRREQEntry = NULL;static void addEntry(u_int32_t src, u_int32_t broadcastId){ struct RreqTableEntry *first = NULL; struct RreqTableEntry *newEntry = NULL; trace(TRACE_RECENT_RREQ, "addEntry"); trace(TRACE_RECENT_RREQ, "addEntry(src=%s",inet_fmt_h(src,s1)); trace(TRACE_RECENT_RREQ, "addEntry(broadcastid=%u",broadcastId); //allocate space newEntry = (struct RreqTableEntry *)malloc(sizeof(struct RreqTableEntry)); if(newEntry == NULL){ log(LOG_ERR,TRUE,"unable to allocate memory, RreqTableEntry"); } //fill in newEntry->src=src; newEntry->broadcastId=broadcastId; newEntry->next=NULL; newEntry->lifetime = BROADCAST_RECORD_TIME; //connect if(firstRREQEntry == NULL){ trace(TRACE_RECENT_RREQ, "addEntry:first entry"); firstRREQEntry=newEntry; } else { trace(TRACE_RECENT_RREQ, "addEntry:adding entry"); first=firstRREQEntry; firstRREQEntry=newEntry; newEntry->next=first; } }int receivedAlready(u_int32_t src, u_int32_t broadcastId){ struct RreqTableEntry *ptr = NULL; trace(TRACE_RECENT_RREQ, "receivedAlready"); ptr = firstRREQEntry; while(ptr != NULL) { if (ptr->src == src && ptr->broadcastId == broadcastId ) { trace(TRACE_RECENT_RREQ, "receivedAlready:TRUE"); return TRUE; } ptr = ptr->next; } addEntry(src,broadcastId); trace(TRACE_RECENT_RREQ, "receivedAlready:FALSE"); return FALSE;}void expireRREQBroadcasts(){ struct RreqTableEntry *prev = NULL; struct RreqTableEntry *next = NULL; struct RreqTableEntry *entry = NULL; trace(TRACE_RECENT_RREQ,"expireRREQBroadcasts"); if(firstRREQEntry != NULL) { trace(TRACE_RECENT_RREQ,"expireRREQBroadcasts: time=%u" , getTime()); entry = firstRREQEntry; while(entry != NULL){ next=entry->next; //check lifetime if(entry->lifetime < getTime()) { trace(TRACE_RECENT_RREQ,"expireRREQBroadcasts: time to do something"); //time to delete entry //free RreqTableEntry free(entry); if(prev == NULL){ trace(TRACE_RECENT_RREQ,"expireRREQBroadcasts: prev null"); firstRREQEntry=next; } entry=next; } else { //check next entry prev=entry; entry=entry->next; } } } else { //nothing to do! trace(TRACE_RECENT_RREQ,"expireRREQBroadcasts: nothing to do"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -