⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpr_selector_set.c

📁 wifi 无线网络路由协议OLSR linux下C代码
💻 C
字号:
/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas T鴑nesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met: * * * Redistributions of source code must retain the above copyright  *   notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright  *   notice, this list of conditions and the following disclaimer in  *   the documentation and/or other materials provided with the  *   distribution. * * Neither the name of olsr.org, olsrd nor the names of its  *   contributors may be used to endorse or promote products derived  *   from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * * $Id: mpr_selector_set.c,v 1.18 2007/09/17 22:24:22 bernd67 Exp $ */#include "defs.h"#include "mpr_selector_set.h"#include "olsr.h"#include "scheduler.h"static olsr_u16_t ansn;/* MPR selector list */static struct mpr_selector mprs_list;/** *Initialize MPR selector set */intolsr_init_mprs_set(void){  OLSR_PRINTF(5, "MPRS: Init\n");  /* Initial values */  ansn = 0;  olsr_register_timeout_function(&olsr_time_out_mprs_set, OLSR_TRUE);    mprs_list.next = &mprs_list;  mprs_list.prev = &mprs_list;  return 1;}olsr_u16_t get_local_ansn(void){  return ansn;}voidincrease_local_ansn(void){  ansn++;}/** * Check if we(this node) is selected as a MPR by any * neighbors. If the list is empty we are not MPR. */olsr_boololsr_is_mpr(void){    return ((mprs_list.next == &mprs_list) ? OLSR_FALSE : OLSR_TRUE);}/** *Add a MPR selector to the MPR selector set * *@param add address of the MPR selector *@param vtime validity time for the new entry * *@return a pointer to the new entry */struct mpr_selector *olsr_add_mpr_selector(union olsr_ip_addr *addr, float vtime){  struct mpr_selector *new_entry;  OLSR_PRINTF(1, "MPRS: adding %s\n", olsr_ip_to_string(addr));  new_entry = olsr_malloc(sizeof(struct mpr_selector), "Add MPR selector");  /* Fill struct */  COPY_IP(&new_entry->MS_main_addr, addr);  new_entry->MS_time = GET_TIMESTAMP(vtime*1000);  /* Queue */  QUEUE_ELEM(mprs_list, new_entry);  /*  new_entry->prev = &mprs_list;  new_entry->next = mprs_list.next;  mprs_list.next->prev = new_entry;  mprs_list.next = new_entry;  */  return new_entry;}/** *Lookup an entry in the MPR selector table *based on address * *@param addr the addres to check for * *@return a pointer to the entry or NULL */struct mpr_selector *olsr_lookup_mprs_set(union olsr_ip_addr *addr){  struct mpr_selector *mprs;  if(addr == NULL)    return NULL;  //OLSR_PRINTF(1, "MPRS: Lookup....");  mprs = mprs_list.next;  while(mprs != &mprs_list)    {      if(COMP_IP(&mprs->MS_main_addr, addr))	{	  //OLSR_PRINTF(1, "MATCH\n");	  return mprs;	}      mprs = mprs->next;    }    //OLSR_PRINTF(1, "NO MACH\n");  return NULL;}/** *Update a MPR selector entry or create an new *one if it does not exist * *@param addr the address of the MPR selector *@param vtime tha validity time of the entry * *@return 1 if a new entry was added 0 if not */intolsr_update_mprs_set(union olsr_ip_addr *addr, float vtime){  struct mpr_selector *mprs;  int retval;  OLSR_PRINTF(5, "MPRS: Update %s\n", olsr_ip_to_string(addr));  retval = 0;  if(NULL == (mprs = olsr_lookup_mprs_set(addr)))    {      olsr_add_mpr_selector(addr, vtime);      retval = 1;      signal_link_changes(OLSR_TRUE);    }  else    {      mprs->MS_time = GET_TIMESTAMP(vtime*1000);    }  return retval;}/** *Time out MPR selector entries * *@return nada */voidolsr_time_out_mprs_set(void){  struct mpr_selector *mprs = mprs_list.next;  while(mprs != &mprs_list)    {      if(TIMED_OUT(mprs->MS_time))	{	  /* Dequeue */	  struct mpr_selector *mprs_to_delete = mprs;	  mprs = mprs->next;	  OLSR_PRINTF(1, "MPRS: Timing out %s\n", olsr_ip_to_string(&mprs_to_delete->MS_main_addr));	  DEQUEUE_ELEM(mprs_to_delete);	  /* Delete entry */	  free(mprs_to_delete);	  signal_link_changes(OLSR_TRUE);	}      else	mprs = mprs->next;    }}/** *Print the current MPR selector set to STDOUT */voidolsr_print_mprs_set(void){  struct mpr_selector *mprs;  OLSR_PRINTF(1, "MPR SELECTORS: ");    for(mprs = mprs_list.next; mprs != &mprs_list; mprs = mprs->next)    {      OLSR_PRINTF(1, "%s ", olsr_ip_to_string(&mprs->MS_main_addr));    }  OLSR_PRINTF(1, "\n");}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -