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

📄 ifnet.c

📁 wifi 无线网络路由协议OLSR linux下C代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	  OLSR_PRINTF(1, "IPv4 netmask changed for %s\n", ifr.ifr_name);	  OLSR_PRINTF(1, "\tOld:%s\n", sockaddr_to_string(&ifp->int_netmask));	  OLSR_PRINTF(1, "\tNew:%s\n", sockaddr_to_string(&ifr.ifr_netmask));	  ifp->int_netmask = ifr.ifr_netmask;	  if_changes = 1;	}            if(!iface->cnf->ipv4_broadcast.v4)	{	  /* Check broadcast address */      	  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) 	    {	      olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);	      goto remove_interface;	    }	  #ifdef DEBUG	  OLSR_PRINTF(3, "\tBroadcast address:%s\n", sockaddr_to_string(&ifr.ifr_broadaddr));#endif	  	  if(memcmp(&((struct sockaddr_in *)&ifp->int_broadaddr)->sin_addr.s_addr,		    &((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr.s_addr, 		    olsr_cnf->ipsize) != 0)	    {	      	      /* New address */	      OLSR_PRINTF(1, "IPv4 broadcast changed for %s\n", ifr.ifr_name);	      OLSR_PRINTF(1, "\tOld:%s\n", sockaddr_to_string(&ifp->int_broadaddr));	      OLSR_PRINTF(1, "\tNew:%s\n", sockaddr_to_string(&ifr.ifr_broadaddr));	      	      ifp->int_broadaddr = ifr.ifr_broadaddr;	      if_changes = 1;	    }            	}    }  if(if_changes)    run_ifchg_cbs(ifp, IFCHG_IF_UPDATE);  return if_changes; remove_interface:  OLSR_PRINTF(1, "Removing interface %s\n", iface->name);  olsr_syslog(OLSR_LOG_INFO, "Removing interface %s\n", iface->name);  del_if_link_entries(&ifp->ip_addr);  /*   *Call possible ifchange functions registered by plugins     */  run_ifchg_cbs(ifp, IFCHG_IF_REMOVE);    /* Dequeue */  if(ifp == ifnet)    {      ifnet = ifp->int_next;    }  else    {      tmp_ifp = ifnet;      while(tmp_ifp->int_next != ifp)	{	  tmp_ifp = tmp_ifp->int_next;	}      tmp_ifp->int_next = ifp->int_next;    }  /* Remove output buffer */  net_remove_buffer(ifp);  /* Check main addr */  if(COMP_IP(&olsr_cnf->main_addr, &ifp->ip_addr))    {      if(ifnet == NULL)	{	  /* No more interfaces */	  memset(&olsr_cnf->main_addr, 0, olsr_cnf->ipsize);	  OLSR_PRINTF(1, "No more interfaces...\n");	}      else	{	  COPY_IP(&olsr_cnf->main_addr, &ifnet->ip_addr);	  OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&olsr_cnf->main_addr));	  olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&olsr_cnf->main_addr));	}    }  /*   * Deregister scheduled functions    */  if (olsr_cnf->lq_level == 0)    {      olsr_remove_scheduler_event(&generate_hello,                                   ifp,                                   iface->cnf->hello_params.emission_interval,                                   0,                                   NULL);      olsr_remove_scheduler_event(&generate_tc,                                   ifp,                                   iface->cnf->tc_params.emission_interval,                                  0,                                   NULL);    }  else    {      olsr_remove_scheduler_event(&olsr_output_lq_hello,                                   ifp,                                   iface->cnf->hello_params.emission_interval,                                   0,                                   NULL);      olsr_remove_scheduler_event(&olsr_output_lq_tc,                                   ifp,                                   iface->cnf->tc_params.emission_interval,                                  0,                                   NULL);    }  olsr_remove_scheduler_event(&generate_mid, 			      ifp, 			      iface->cnf->mid_params.emission_interval,			      0, 			      NULL);  olsr_remove_scheduler_event(&generate_hna, 			      ifp, 			      iface->cnf->hna_params.emission_interval,			      0, 			      NULL);  iface->configured = 0;  iface->interf = NULL;  /* Close olsr socket */  close(ifp->olsr_socket);  remove_olsr_socket(ifp->olsr_socket, &olsr_input);  /* Free memory */  free(ifp->int_name);  free(ifp);  if((ifnet == NULL) && (!olsr_cnf->allow_no_interfaces))    {      OLSR_PRINTF(1, "No more active interfaces - exiting.\n");      olsr_syslog(OLSR_LOG_INFO, "No more active interfaces - exiting.\n");      olsr_cnf->exit_value = EXIT_FAILURE;      kill(getpid(), SIGINT);    }  return 0;}/** * Initializes the special interface used in * host-client emulation */intadd_hemu_if(struct olsr_if *iface){  struct interface *ifp;  union olsr_ip_addr null_addr;  olsr_u32_t addr[4];  if(!iface->host_emul)    return -1;  ifp = olsr_malloc(sizeof (struct interface), "Interface update 2");  memset(ifp, 0, sizeof (struct interface));  iface->configured = OLSR_TRUE;  iface->interf = ifp;  ifp->is_hcif = OLSR_TRUE;  ifp->int_name = olsr_malloc(strlen("hcif01") + 1, "Interface update 3");  ifp->int_metric = 0;  strcpy(ifp->int_name, "hcif01");  OLSR_PRINTF(1, "Adding %s(host emulation):\n", ifp->int_name);  OLSR_PRINTF(1, "       Address:%s\n", olsr_ip_to_string(&iface->hemu_ip));  OLSR_PRINTF(1, "       NB! This is a emulated interface\n       that does not exist in the kernel!\n");  ifp->int_next = ifnet;  ifnet = ifp;  memset(&null_addr, 0, olsr_cnf->ipsize);  if(COMP_IP(&null_addr, &olsr_cnf->main_addr))    {      COPY_IP(&olsr_cnf->main_addr, &iface->hemu_ip);      OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&olsr_cnf->main_addr));	olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&olsr_cnf->main_addr));    }  ifp->int_mtu = OLSR_DEFAULT_MTU;  ifp->int_mtu -= (olsr_cnf->ip_version == AF_INET6) ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE;  /* Set up buffer */  net_add_buffer(ifp);  if(olsr_cnf->ip_version == AF_INET)    {      struct sockaddr_in sin;      memset(&sin, 0, sizeof(sin));      sin.sin_family = AF_INET;      sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);      sin.sin_port = htons(10150);      /* IP version 4 */      ifp->ip_addr.v4 = iface->hemu_ip.v4;      memcpy(&((struct sockaddr_in *)&ifp->int_addr)->sin_addr, &iface->hemu_ip, olsr_cnf->ipsize);            /*       *We create one socket for each interface and bind       *the socket to it. This to ensure that we can control       *on what interface the message is transmitted       */            ifp->olsr_socket = gethemusocket(&sin);            if (ifp->olsr_socket < 0)	{	  fprintf(stderr, "Could not initialize socket... exiting!\n\n");	  olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n");	  olsr_cnf->exit_value = EXIT_FAILURE;	  kill(getpid(), SIGINT);	}    }  else    {      /* IP version 6 */      memcpy(&ifp->ip_addr, &iface->hemu_ip, olsr_cnf->ipsize);#if 0            /*       *We create one socket for each interface and bind       *the socket to it. This to ensure that we can control       *on what interface the message is transmitted       */            ifp->olsr_socket = gethcsocket6(&addrsock6, bufspace, ifp->int_name);            join_mcast(ifp, ifp->olsr_socket);            if (ifp->olsr_socket < 0)	{	  fprintf(stderr, "Could not initialize socket... exiting!\n\n");	  olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n");	  olsr_cnf->exit_value = EXIT_FAILURE;	  kill(getpid(), SIGINT);	}      #endif    }  /* Send IP as first 4/16 bytes on socket */  memcpy(addr, iface->hemu_ip.v6.s6_addr, olsr_cnf->ipsize);  addr[0] = htonl(addr[0]);  addr[1] = htonl(addr[1]);  addr[2] = htonl(addr[2]);  addr[3] = htonl(addr[3]);  if(send(ifp->olsr_socket, addr , olsr_cnf->ipsize, 0) != (int)olsr_cnf->ipsize)    {      fprintf(stderr, "Error sending IP!");    }      /* Register socket */  add_olsr_socket(ifp->olsr_socket, &olsr_input_hostemu);  if (olsr_cnf->lq_level == 0)    {      olsr_register_scheduler_event(&generate_hello,                                     ifp,                                     iface->cnf->hello_params.emission_interval,                                     0,                                     NULL);      olsr_register_scheduler_event(&generate_tc,                                     ifp,                                     iface->cnf->tc_params.emission_interval,                                    0,                                     NULL);    }  else    {      olsr_register_scheduler_event(&olsr_output_lq_hello,                                     ifp,                                     iface->cnf->hello_params.emission_interval,                                     0,                                     NULL);      olsr_register_scheduler_event(&olsr_output_lq_tc,                                     ifp,                                     iface->cnf->tc_params.emission_interval,                                    0,                                     NULL);    }  olsr_register_scheduler_event(&generate_mid, 				ifp, 				iface->cnf->mid_params.emission_interval,				0, 				NULL);  olsr_register_scheduler_event(&generate_hna, 				ifp, 				iface->cnf->hna_params.emission_interval,				0, 				NULL);  /* Recalculate max jitter */  if((olsr_cnf->max_jitter == 0) ||      ((iface->cnf->hello_params.emission_interval / 4) < olsr_cnf->max_jitter))    olsr_cnf->max_jitter = iface->cnf->hello_params.emission_interval / 4;  /* Recalculate max topology hold time */  if(olsr_cnf->max_tc_vtime < iface->cnf->tc_params.emission_interval)    olsr_cnf->max_tc_vtime = iface->cnf->tc_params.emission_interval;  ifp->hello_etime = iface->cnf->hello_params.emission_interval;  ifp->valtimes.hello = double_to_me(iface->cnf->hello_params.validity_time);  ifp->valtimes.tc = double_to_me(iface->cnf->tc_params.validity_time);  ifp->valtimes.mid = double_to_me(iface->cnf->mid_params.validity_time);  ifp->valtimes.hna = double_to_me(iface->cnf->hna_params.validity_time);  return 1;}static char basenamestr[32];static const char* if_basename(const char* name);static const char* if_basename(const char* name){	char *p = strchr(name, ':');	if (NULL == p || p - name >= (int)(sizeof(basenamestr) / sizeof(basenamestr[0]) - 1)) {        	return name;        }	memcpy(basenamestr, name, p - name);	basenamestr[p - name] = 0;	return basenamestr;}/** * Initializes a interface described by iface, * if it is set up and is of the correct type. * *@param iface the olsr_if struct describing the interface

⌨️ 快捷键说明

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