亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? timer_queue.c

?? 一款經典的linux下運行的ad-hoc協議
?? C
字號:
/***************************************************************************                          timer_queue.c  -  description                             -------------------    begin                : Mon Jul 14 2003    copyright            : (C) 2003 by Luke Klein-Berndt    email                : kleinb@nist.gov ***************************************************************************/#include "timer_queue.h"struct timer_list aodv_timer;rwlock_t timer_lock = RW_LOCK_UNLOCKED;task *timer_queue;unsigned long flags;inline void timer_read_lock(){    read_lock_irqsave(&timer_lock, flags);}inline void timer_read_unlock(){    read_unlock_irqrestore(&timer_lock, flags);}inline void timer_write_lock(){    write_lock_irqsave(&timer_lock, flags);}inline void timer_write_unlock(){    write_unlock_irqrestore(&timer_lock, flags);}int init_timer_queue(){    init_timer(&aodv_timer);    timer_queue = NULL;    return 0;}static unsigned long tvtojiffies(struct timeval *value){    unsigned long sec = (unsigned) value->tv_sec;    unsigned long usec = (unsigned) value->tv_usec;    if (sec > (ULONG_MAX / HZ))        return ULONG_MAX;    usec += 1000000 / HZ - 1;    usec /= 1000000 / HZ;    return HZ * sec + usec;}task *first_timer_due(u_int64_t currtime){    task *tmp_task;    // lock Read    timer_write_lock();    if (timer_queue != NULL)    {                 /* If pqe's time is in teh interval */        if (time_before_eq(timer_queue->time, currtime))        {	       		tmp_task = timer_queue;            timer_queue = timer_queue->next;            timer_write_unlock();            return tmp_task;        }    }    /* unlock read */    timer_write_unlock();    return NULL;}void timer_queue_signal(){    task *tmp_task;    u_int64_t currtime;    // Get the first due entry in the queue /    currtime = getcurrtime();    tmp_task = first_timer_due(currtime);		    // While there is still events that has timed out    while (tmp_task != NULL)    {        insert_task_from_timer(tmp_task);        tmp_task = first_timer_due(currtime);    }    update_timer_queue();}void update_timer_queue(){    struct timeval delay_time;    u_int64_t currtime;    u_int64_t tv;    u_int64_t remainder, numerator;    delay_time.tv_sec = 0;    delay_time.tv_usec = 0;    /* lock Read */    timer_read_lock();    if (timer_queue == NULL)    {        // No event to set timer for        delay_time.tv_sec = 0;        delay_time.tv_usec = 0;        del_timer(&aodv_timer);        timer_read_unlock();        return;    } else    {        //* Get the first time value                currtime = getcurrtime();                if (time_before( timer_queue->time, currtime))        {            // If the event has allready happend, set the timeout to              1 microsecond :-)            delay_time.tv_sec = 0;            delay_time.tv_usec = 1;        } else        {            // Set the timer to the actual seconds / microseconds from now            //This is a fix for an error that occurs on ARM Linux Kernels because they do 64bits differently            //Thanks to S. Peter Li for coming up with this fix! 					            numerator = (timer_queue->time - currtime);            remainder = do_div(numerator, 1000);            delay_time.tv_sec = numerator;            delay_time.tv_usec = remainder * 1000;         }    }    if (!timer_pending(&aodv_timer))    {        aodv_timer.function = &timer_queue_signal;        aodv_timer.expires = jiffies + tvtojiffies(&delay_time);        //printk("timer sched in %u sec and %u milisec delay %u\n",delay_time.tv_sec, delay_time.tv_usec,aodv_timer.expires);         add_timer(&aodv_timer);    } else    {        mod_timer(&aodv_timer, jiffies + tvtojiffies(&delay_time));    }    /* lock Read */    timer_read_unlock();    // Set the timer (in real time)    return;}void queue_timer(task * new_timer){    task *prev_timer = NULL;    task *tmp_timer = NULL;    u_int64_t currtime = getcurrtime();    /* lock Write */    timer_write_lock();    tmp_timer = timer_queue;    while (tmp_timer != NULL && (time_after(new_timer->time,tmp_timer->time)))    {    	//printk("%d is larger than %s type: %d time dif of %d \n", new_timer->type,inet_ntoa(tmp_timer->id),tmp_timer->type, new_timer->time-tmp_timer->time);        prev_timer = tmp_timer;        tmp_timer = tmp_timer->next;    }    if ((timer_queue == NULL) || (timer_queue == tmp_timer))    {        new_timer->next = timer_queue;        timer_queue = new_timer;    } else    {        if (tmp_timer == NULL)  // If at the end of the List        {            new_timer->next = NULL;            prev_timer->next = new_timer;        } else                  // Inserting in to the middle of the list somewhere        {            new_timer->next = prev_timer->next;            prev_timer->next = new_timer;        }    }    /* unlock Write */    timer_write_unlock();}/****************************************************   insert_timer_queue_entry----------------------------------------------------Insert an event into the queue. Also allocatesenough room for the data and copies that too****************************************************/int insert_timer(u_int8_t task_type, u_int32_t delay, u_int32_t ip){    task *new_entry;    new_entry = create_task(task_type);        // get memory    if (new_entry == NULL)    {        printk(KERN_WARNING "AODV: Error allocating timer!\n");        return -ENOMEM;    }            new_entry->src_ip = ip;    new_entry->dst_ip = ip;    new_entry->id = ip;       new_entry->time = getcurrtime() + delay;    queue_timer(new_entry);    return 0;}int insert_rreq_timer(rreq * tmp_rreq, u_int8_t retries){    task *new_timer;    // get memory    if (!(new_timer = create_task(TASK_RESEND_RREQ)))    {        printk(KERN_WARNING "AODV: Error allocating timer!\n");        return -ENOMEM;    }    new_timer->src_ip = tmp_rreq->src_ip;    new_timer->dst_ip = tmp_rreq->dst_ip;    new_timer->id = tmp_rreq->dst_ip;    new_timer->retries = retries;    new_timer->ttl = 30;    new_timer->time = getcurrtime() + ((2 ^ (RREQ_RETRIES - retries)) * NET_TRAVERSAL_TIME);    queue_timer(new_timer);    return 0;}/****************************************************   find_first_timer_qu2 ^ (RREQ_RETRIES - retries)eue_entry----------------------------------------------------Returns the first entry in the timer queue****************************************************/task *find_first_timer_queue_entry(){    return timer_queue;}/****************************************************   find_first_timer_queue_entry_of_id----------------------------------------------------Returns the first timer queue entry with a matchingID****************************************************//*struct timer_queue_entry * find_first_timer_queue_entry_of_id(u_int32_t id){    struct timer_queue_entry *tmp_entry;    // lock Read     timer_read_lock();    tmp_entry=timer_queue;    while (tmp_entry != NULL && tmp_entry->id != id)        tmp_entry=tmp_entry->next;    // unlock Read     timer_read_unlock();    return tmp_entry;}*/task *find_timer(u_int32_t id, u_int8_t type){    task *tmp_task;    // lock Read        timer_read_lock();    tmp_task = timer_queue;    while (tmp_task != NULL)    {        if ((tmp_task->id == id) && (tmp_task->type == type))        {            timer_read_unlock();            return tmp_task;        }        tmp_task = tmp_task->next;    }    // unlock Read     timer_read_unlock();    return NULL;}/****************************************************   delete_timer_queue_entry_of_id----------------------------------------------------Deletes the first entry with a matching id****************************************************/void delete_timer(u_int32_t id, u_int8_t type){    task *tmp_task;    task *prev_task;    task *dead_task;    /* lock Write */    //printk("deleting timer: %s  type: %u", inet_ntoa(id), type);    timer_write_lock();    tmp_task = timer_queue;    prev_task = NULL;    while (tmp_task != NULL)    {        if ((tmp_task->id == id) && (tmp_task->type == type))        {            if (prev_task == NULL)            {                timer_queue = tmp_task->next;            } else            {                prev_task->next = tmp_task->next;            }            dead_task = tmp_task;            tmp_task = tmp_task->next;            kfree(dead_task->data);            kfree(dead_task);        } else        {            prev_task = tmp_task;            tmp_task = tmp_task->next;        }    }    /* unlock Write */    timer_write_unlock();    //update_timer_queue();}int read_timer_queue_proc(char *buffer, char **buffer_location, off_t offset, int buffer_length,int *eof,void *data){    task *tmp_task;		u_int64_t remainder, numerator;    u_int64_t tmp_time;    u_int64_t currtime = getcurrtime();    int len;    char tmp_buffer[200];    /* lock Read */    timer_read_lock();    sprintf(buffer,"\nTimer Queue\n-------------------------------------------------------\n");		strcat(buffer,"       ID      |     Type     |   sec/msec   |   Retries\n");		strcat(buffer,"-------------------------------------------------------\n");    tmp_task = timer_queue;    while (tmp_task != NULL)    {  	//This is a fix for an error that occurs on ARM Linux Kernels because they do 64bits differently	//Thanks printk(" timer has %d left on it\n", timer_queue->time - currtime);   // to S. Peter Li for coming up with this fix!	sprintf( tmp_buffer,"    %-16s  ", inet_ntoa(tmp_task->dst_ip));	strcat(buffer, tmp_buffer);	switch (tmp_task->type)            {             case TASK_RESEND_RREQ:                strcat(buffer, "RREQ    ");                break;             case TASK_CLEANUP:                strcat(buffer, "Cleanup ");                break;             case TASK_HELLO:                strcat(buffer, "Hello   ");                break;             case TASK_NEIGHBOR:                strcat(buffer, "Neighbor");                break;		}      tmp_time=tmp_task->time - currtime;			numerator = (tmp_time);			remainder = do_div( numerator, 1000 );  			sprintf(tmp_buffer,"    %lu/%lu       %u\n", (unsigned long)numerator, (unsigned long)remainder, tmp_task->retries);			strcat(buffer, tmp_buffer);       tmp_task = tmp_task->next;    }    strcat(buffer,"-------------------------------------------------------\n");      /* unlock Read */    timer_read_unlock();    len = strlen(buffer);    if (len <= offset+buffer_length) *eof = 1;    *buffer_location = buffer + offset;    len -= offset;    if (len>buffer_length) len = buffer_length;    if (len<0) len = 0;    return len;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费成人在线播放| 在线观看av一区二区| 91在线无精精品入口| 欧美日韩高清在线| 国产精品嫩草久久久久| 久久国产免费看| 一本久道久久综合中文字幕| 91精品国产91久久久久久一区二区| 久久婷婷一区二区三区| 一级日本不卡的影视| 国产成人高清在线| 欧美一区中文字幕| 亚洲综合免费观看高清在线观看| 国产一区激情在线| 91精品国产一区二区三区| 亚洲女同女同女同女同女同69| 青娱乐精品视频| 欧美日韩在线不卡| 一区二区三区中文字幕精品精品| 国产成人日日夜夜| 久久久一区二区三区| 青青草成人在线观看| 在线免费观看日本欧美| 1000精品久久久久久久久| 国产成人av在线影院| 精品国产乱码久久久久久影片| 午夜日韩在线电影| 欧美系列亚洲系列| 亚洲另类春色国产| 97精品超碰一区二区三区| 国产精品亲子伦对白| 丰满亚洲少妇av| 国产亚洲视频系列| 国产盗摄一区二区| 久久精品人人做人人综合 | 久久一区二区视频| 蜜臀av性久久久久av蜜臀妖精 | 亚洲视频中文字幕| 本田岬高潮一区二区三区| 国产女人18毛片水真多成人如厕| 国模冰冰炮一区二区| 久久久久久麻豆| 国产高清精品久久久久| 中文字幕精品一区二区精品绿巨人| 国产一区二区不卡在线| 久久综合久久综合九色| 国产传媒欧美日韩成人| 国产精品久久久99| 色丁香久综合在线久综合在线观看| 亚洲激情五月婷婷| 91精品国产入口| 国内精品国产三级国产a久久| 久久久久久99精品| 欧美一级电影网站| 激情欧美日韩一区二区| 国产精品嫩草99a| 色综合久久久久综合99| 亚洲国产成人va在线观看天堂| 777色狠狠一区二区三区| 美日韩一区二区三区| 久久久99精品免费观看| av不卡一区二区三区| 亚洲成av人片一区二区梦乃| 日韩一区二区精品| 国产成人av电影免费在线观看| 中文字幕中文字幕一区| 欧美精品丝袜久久久中文字幕| 老汉av免费一区二区三区| 国产精品久久久久影院老司| 欧美日韩一区视频| 国产高清久久久久| 亚洲a一区二区| 日本一区二区三区dvd视频在线| 色婷婷一区二区三区四区| 老司机精品视频导航| 亚洲欧美自拍偷拍色图| 日韩视频免费观看高清完整版在线观看 | 国产一区视频网站| 亚洲精品国产a久久久久久| 91精品在线观看入口| 日本欧美大码aⅴ在线播放| 欧美成人女星排名| av在线一区二区| 亚洲精品午夜久久久| 久久久综合精品| 色偷偷久久一区二区三区| 日本视频在线一区| 中文字幕国产精品一区二区| 欧洲av一区二区嗯嗯嗯啊| 美腿丝袜亚洲色图| 国产精品网站一区| 制服丝袜成人动漫| 国产成人高清在线| 日本特黄久久久高潮| 丝袜美腿亚洲色图| 亚洲视频免费在线观看| 日韩一区二区三免费高清| av电影一区二区| 麻豆精品在线看| 一区二区三区欧美亚洲| 久久精品一区八戒影视| 911精品国产一区二区在线| 99久久久免费精品国产一区二区| 免费人成黄页网站在线一区二区| 久久婷婷国产综合精品青草| 日韩手机在线导航| 日本丶国产丶欧美色综合| 国产精品夜夜爽| 毛片基地黄久久久久久天堂| 丝袜美腿亚洲一区| 一区二区三区日韩欧美精品| 国产人成亚洲第一网站在线播放| 欧美精品一二三区| 色综合久久久久综合体| 成人一二三区视频| 一区二区三区不卡视频在线观看 | 国产成人亚洲综合色影视| 亚洲成在人线在线播放| 综合av第一页| 国产精品网站导航| 欧美va亚洲va国产综合| 91精品久久久久久蜜臀| 欧美色图天堂网| 99免费精品在线观看| 国产91色综合久久免费分享| 麻豆成人av在线| 免费亚洲电影在线| 捆绑调教美女网站视频一区| 三级不卡在线观看| 婷婷六月综合网| 午夜精品久久久久久久久久| 日韩精品久久久久久| 午夜国产精品影院在线观看| 一区二区三区中文在线| 午夜激情久久久| 日日夜夜免费精品视频| 婷婷夜色潮精品综合在线| 日本视频一区二区| 久热成人在线视频| 国产一区不卡在线| 国产高清无密码一区二区三区| 国内精品自线一区二区三区视频| 国产成人精品一区二区三区四区| 国产精品一二二区| 色婷婷综合久久久| 欧美精品电影在线播放| 2020国产精品久久精品美国| 久久亚洲二区三区| 国产精品青草久久| 亚洲伊人伊色伊影伊综合网| 亚洲国产精品一区二区www| 久久99精品国产麻豆婷婷洗澡| 久久精品国产色蜜蜜麻豆| 国产一区二区在线观看视频| 国产麻豆欧美日韩一区| 大陆成人av片| 91国偷自产一区二区使用方法| 91精品国产欧美日韩| 精品福利视频一区二区三区| 中文字幕国产一区| 亚洲6080在线| 国内精品国产三级国产a久久| 色视频成人在线观看免| 欧美一区二区福利在线| 国产日韩欧美亚洲| 亚洲影视在线播放| 亚洲男人的天堂av| 精品无人区卡一卡二卡三乱码免费卡 | 亚洲成a人片综合在线| 男人的j进女人的j一区| 国产精品亚洲视频| 在线电影国产精品| 久久久久久电影| 午夜精品久久久久久久久久| 蜜臀av性久久久久蜜臀aⅴ四虎| 色婷婷综合久久久中文字幕| 91精品国产综合久久精品app| 国产日产亚洲精品系列| 亚洲五码中文字幕| 国产盗摄女厕一区二区三区| 欧美日韩一区二区三区四区| 国产亚洲一区二区三区在线观看| 亚洲精品乱码久久久久| 久久精品72免费观看| 欧洲精品视频在线观看| 久久久国产午夜精品| 性做久久久久久久免费看| 成人综合在线视频| 欧美一级黄色大片| 亚洲一区二区三区精品在线| 国产一区二区三区| 欧美三级电影在线观看| 亚洲色图制服丝袜| 国产成人av电影在线观看| 欧美一卡2卡3卡4卡| 亚洲美女屁股眼交| 粉嫩嫩av羞羞动漫久久久| 久久久久久久综合| 免费视频一区二区| 日本电影欧美片|