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