📄 ifnet.c
字号:
*@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 + -