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

📄 ifnet.c

📁 wifi 无线网络路由协议OLSR linux下C代码
💻 C
📖 第 1 页 / 共 3 页
字号:
 *@param so the socket to use for ioctls * */intchk_if_up(struct olsr_if *iface, int debuglvl){  struct interface ifs, *ifp;  struct ifreq ifr;  union olsr_ip_addr null_addr;#ifdef linux  int precedence = IPTOS_PREC(olsr_cnf->tos);  int tos_bits = IPTOS_TOS(olsr_cnf->tos);#endif  if(iface->host_emul)    return -1;  memset(&ifr, 0, sizeof(struct ifreq));  strncpy(ifr.ifr_name, iface->name, IFNAMSIZ);  OLSR_PRINTF(debuglvl, "Checking %s:\n", ifr.ifr_name);  /* Get flags (and check if interface exists) */  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0)     {      OLSR_PRINTF(debuglvl, "\tNo such interface!\n");      return 0;    }  memset(&ifs.netbuf, 0, sizeof(struct olsr_netbuf));  ifs.int_flags = ifr.ifr_flags;        if ((ifs.int_flags & IFF_UP) == 0)    {      OLSR_PRINTF(debuglvl, "\tInterface not up - skipping it...\n");      return 0;    }  /* Check broadcast */  if ((olsr_cnf->ip_version == AF_INET) &&      !iface->cnf->ipv4_broadcast.v4 && /* Skip if fixed bcast */       (!(ifs.int_flags & IFF_BROADCAST)))     {      OLSR_PRINTF(debuglvl, "\tNo broadcast - skipping\n");      return 0;    }  if (ifs.int_flags & IFF_LOOPBACK)    {      OLSR_PRINTF(debuglvl, "\tThis is a loopback interface - skipping it...\n");      return 0;    }  ifs.is_hcif = OLSR_FALSE;  /* trying to detect if interface is wireless. */  ifs.is_wireless = check_wireless_interface(ifr.ifr_name);  if(ifs.is_wireless)    OLSR_PRINTF(debuglvl, "\tWireless interface detected\n");  else    OLSR_PRINTF(debuglvl, "\tNot a wireless interface\n");    /* IP version 6 */  if(olsr_cnf->ip_version == AF_INET6)    {      /* Get interface address */            if(get_ipv6_address(ifr.ifr_name, &ifs.int6_addr, iface->cnf->ipv6_addrtype) <= 0)	{	  if(iface->cnf->ipv6_addrtype == IPV6_ADDR_SITELOCAL)	    OLSR_PRINTF(debuglvl, "\tCould not find site-local IPv6 address for %s\n", ifr.ifr_name);	  else	    OLSR_PRINTF(debuglvl, "\tCould not find global IPv6 address for %s\n", ifr.ifr_name);	  	  return 0;	}            OLSR_PRINTF(debuglvl, "\tAddress: %s\n", ip6_to_string(&ifs.int6_addr.sin6_addr));            /* Multicast */      ifs.int6_multaddr.sin6_addr = (iface->cnf->ipv6_addrtype == IPV6_ADDR_SITELOCAL) ? 	iface->cnf->ipv6_multi_site.v6 :	iface->cnf->ipv6_multi_glbl.v6;      /* Set address family */      ifs.int6_multaddr.sin6_family = AF_INET6;      /* Set port */      ifs.int6_multaddr.sin6_port = htons(OLSRPORT);      #ifdef __MacOSX__      ifs.int6_multaddr.sin6_scope_id = 0;#endif      OLSR_PRINTF(debuglvl, "\tMulticast: %s\n", ip6_to_string(&ifs.int6_multaddr.sin6_addr));          }  /* IP version 4 */  else    {      /* Get interface address (IPv4)*/      if(ioctl(olsr_cnf->ioctl_s, SIOCGIFADDR, &ifr) < 0) 	{	  OLSR_PRINTF(debuglvl, "\tCould not get address of interface - skipping it\n");	  return 0;	}            ifs.int_addr = ifr.ifr_addr;            /* Find netmask */            if (ioctl(olsr_cnf->ioctl_s, SIOCGIFNETMASK, &ifr) < 0) 	{	  olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get netmask)", ifr.ifr_name);	  return 0;	}            ifs.int_netmask = ifr.ifr_netmask;            /* Find broadcast address */      if(iface->cnf->ipv4_broadcast.v4)	{	  /* Specified broadcast */	  memset(&ifs.int_broadaddr, 0, sizeof(struct sockaddr));	  memcpy(&((struct sockaddr_in *)&ifs.int_broadaddr)->sin_addr.s_addr, 		 &iface->cnf->ipv4_broadcast.v4, 		 sizeof(olsr_u32_t));	}      else	{	  /* Autodetect */	  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) 	    {	      olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);	      return 0;	    }	  	  ifs.int_broadaddr = ifr.ifr_broadaddr;	}            /* Deactivate IP spoof filter */      deactivate_spoof(if_basename(ifr.ifr_name), &ifs, olsr_cnf->ip_version);            /* Disable ICMP redirects */      disable_redirects(if_basename(ifr.ifr_name), &ifs, olsr_cnf->ip_version);          }      /* Get interface index */    ifs.if_index = if_nametoindex(ifr.ifr_name);    /* Set interface metric */  if(iface->cnf->weight.fixed)    ifs.int_metric = iface->cnf->weight.value;  else    ifs.int_metric = calculate_if_metric(ifr.ifr_name);  OLSR_PRINTF(1, "\tMetric: %d\n", ifs.int_metric);  /* Get MTU */  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFMTU, &ifr) < 0)    ifs.int_mtu = OLSR_DEFAULT_MTU;  else    ifs.int_mtu = ifr.ifr_mtu;  ifs.int_mtu -= (olsr_cnf->ip_version == AF_INET6) ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE;  ifs.ttl_index = 0;  /* Set up buffer */  net_add_buffer(&ifs);	         OLSR_PRINTF(1, "\tMTU - IPhdr: %d\n", ifs.int_mtu);  olsr_syslog(OLSR_LOG_INFO, "Adding interface %s\n", iface->name);  OLSR_PRINTF(1, "\tIndex %d\n", ifs.if_index);  if(olsr_cnf->ip_version == AF_INET)    {      OLSR_PRINTF(1, "\tAddress:%s\n", sockaddr_to_string(&ifs.int_addr));      OLSR_PRINTF(1, "\tNetmask:%s\n", sockaddr_to_string(&ifs.int_netmask));      OLSR_PRINTF(1, "\tBroadcast address:%s\n", sockaddr_to_string(&ifs.int_broadaddr));    }  else    {      OLSR_PRINTF(1, "\tAddress: %s\n", ip6_to_string(&ifs.int6_addr.sin6_addr));      OLSR_PRINTF(1, "\tMulticast: %s\n", ip6_to_string(&ifs.int6_multaddr.sin6_addr));    }    ifp = olsr_malloc(sizeof (struct interface), "Interface update 2");  iface->configured = 1;  iface->interf = ifp;    memcpy(ifp, &ifs, sizeof(struct interface));    ifp->gen_properties = NULL;  ifp->int_name = olsr_malloc(strlen(ifr.ifr_name) + 1, "Interface update 3");        strcpy(ifp->int_name, if_basename(ifr.ifr_name));  /* Segfaults if using strncpy(IFNAMSIZ) why oh why?? */  ifp->int_next = ifnet;  ifnet = ifp;  if(olsr_cnf->ip_version == AF_INET)    {      /* IP version 4 */      ifp->ip_addr.v4 = ((struct sockaddr_in *)&ifp->int_addr)->sin_addr.s_addr;      /*       *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 = getsocket((struct sockaddr *)&addrsock, bufspace, ifp->int_name);            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, &ifp->int6_addr.sin6_addr, 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 = getsocket6(&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);	}          }  set_buffer_timer(ifp);  /* Register socket */  add_olsr_socket(ifp->olsr_socket, &olsr_input);  #ifdef linux   /* Set TOS */    if (setsockopt(ifp->olsr_socket, SOL_SOCKET, SO_PRIORITY, (char*)&precedence, sizeof(precedence)) < 0)    {      perror("setsockopt(SO_PRIORITY)");      olsr_syslog(OLSR_LOG_ERR, "OLSRD: setsockopt(SO_PRIORITY) error %m");    }  if (setsockopt(ifp->olsr_socket, SOL_IP, IP_TOS, (char*)&tos_bits, sizeof(tos_bits)) < 0)        {      perror("setsockopt(IP_TOS)");      olsr_syslog(OLSR_LOG_ERR, "setsockopt(IP_TOS) error %m");    }#endif    /*   *Initialize sequencenumber as a random 16bit value   */  ifp->olsr_seqnum = random() & 0xFFFF;  /*   * Set main address if this is the only interface   */  memset(&null_addr, 0, olsr_cnf->ipsize);  if(COMP_IP(&null_addr, &olsr_cnf->main_addr))    {      COPY_IP(&olsr_cnf->main_addr, &ifp->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));    }    /*   * Register scheduled functions    */  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);  /*   *Call possible ifchange functions registered by plugins     */  run_ifchg_cbs(ifp, IFCHG_IF_ADD);  return 1;}

⌨️ 快捷键说明

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