From: Benjamin Cama Date: Sat, 20 Aug 2011 15:24:10 +0000 (+0200) Subject: Merge branch 'use-netlink' into fdn-mods X-Git-Tag: debian/2.2.1-1fdn2~1^2~3 X-Git-Url: http://git.sameswireless.fr/l2tpns.git/commitdiff_plain/7d4d3c7bcaea62121eaa60dce83c6d8209328838?hp=-c Merge branch 'use-netlink' into fdn-mods --- 7d4d3c7bcaea62121eaa60dce83c6d8209328838 diff --combined l2tpns.c index 581198d,5545aed..9576137 --- a/l2tpns.c +++ b/l2tpns.c @@@ -30,7 -30,7 +30,7 @@@ char const *cvs_id_l2tpns = "$Id: l2tpn #include #include #include - #include + #include #include #include #include @@@ -69,7 -69,7 +69,7 @@@ int rand_fd = -1; // Random data sourc int cluster_sockfd = -1; // Intra-cluster communications socket. int epollfd = -1; // event polling time_t basetime = 0; // base clock -char hostname[1000] = ""; // us. +char hostname[MAXHOSTNAME] = ""; // us. static int tunidx; // ifr_ifindex of tun device int nlseqnum = 0; // netlink sequence number int min_initok_nlseqnum = 0; // minimun seq number for messages after init is ok @@@ -159,10 -159,6 +159,10 @@@ config_descriptt config_values[] = CONFIG("cluster_hb_timeout", cluster_hb_timeout, INT), CONFIG("cluster_master_min_adv", cluster_master_min_adv, INT), CONFIG("ipv6_prefix", ipv6_prefix, IPv6), + CONFIG("cli_bind_address", cli_bind_address, IPv4), + CONFIG("hostname", hostname, STRING), + CONFIG("nexthop_address", nexthop_address, IPv4), + CONFIG("nexthop6_address", nexthop6_address, IPv6), { NULL, 0, 0, 0 }, }; @@@ -170,6 -166,8 +170,6 @@@ static char *plugin_functions[] = NULL, "plugin_pre_auth", "plugin_post_auth", - "plugin_packet_rx", - "plugin_packet_tx", "plugin_timer", "plugin_new_session", "plugin_kill_session", @@@ -544,12 -542,7 +544,12 @@@ void route6set(sessionidt s, struct in6 if (netlink_send(&req.nh) < 0) LOG(0, 0, 0, "route6set() error in sending netlink message: %s\n", strerror(errno)); - // FIXME: need to add BGP routing (RFC2858) +#ifdef BGP + if (add) + bgp_add_route6(ip, prefixlen); + else + bgp_del_route6(ip, prefixlen); +#endif /* BGP */ if (s) { @@@ -648,7 -641,6 +648,6 @@@ static char *tun_nl_phase_msg[] = // Set up TUN interface static void inittun(void) { - struct ifinfomsg ifinfo; struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); @@@ -672,41 -664,13 +671,13 @@@ assert(strlen(ifr.ifr_name) < sizeof(config->tundevice) - 1); strncpy(config->tundevice, ifr.ifr_name, sizeof(config->tundevice)); + tunidx = if_nametoindex(config->tundevice); + if (tunidx == 0) { - // get the interface index - struct { - struct nlmsghdr nh; - struct ifinfomsg ifinfo; - } req; - char buf[4096]; - ssize_t len; - struct nlmsghdr *resp_nh; - - req.nh.nlmsg_type = RTM_GETLINK; - req.nh.nlmsg_flags = NLM_F_REQUEST; - req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.ifinfo)); - - req.ifinfo.ifi_family = AF_UNSPEC; // as the man says - - netlink_addattr(&req.nh, IFLA_IFNAME, config->tundevice, strlen(config->tundevice)+1); - - if(netlink_send(&req.nh) < 0 || (len = netlink_recv(buf, sizeof(buf))) < 0) - { - LOG(0, 0, 0, "Error getting tun ifindex: %s\n", strerror(errno)); - exit(1); - } - - resp_nh = (struct nlmsghdr *)buf; - if (!NLMSG_OK (resp_nh, len)) - { - LOG(0, 0, 0, "Malformed answer getting tun ifindex %ld\n", len); - exit(1); - } - - memcpy(&ifinfo, NLMSG_DATA(resp_nh), sizeof(ifinfo)); - // got index - tunidx = ifinfo.ifi_index; + LOG(0, 0, 0, "Can't get tun interface index\n"); + exit(1); } + { struct { // interface setting @@@ -722,11 -686,12 +693,12 @@@ memset(&req, 0, sizeof(req)); - req.nh.nlmsg_type = RTM_SETLINK; + req.nh.nlmsg_type = RTM_NEWLINK; req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_MULTI; req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.ifmsg.ifinfo)); - req.ifmsg.ifinfo = ifinfo; + req.ifmsg.ifinfo.ifi_family = AF_UNSPEC; + req.ifmsg.ifinfo.ifi_index = tunidx; req.ifmsg.ifinfo.ifi_flags |= IFF_UP; // set interface up req.ifmsg.ifinfo.ifi_change = IFF_UP; // only change this flag @@@ -749,7 -714,7 +721,7 @@@ req.ifmsg.ifaddr.ifa_family = AF_INET; req.ifmsg.ifaddr.ifa_prefixlen = 32; req.ifmsg.ifaddr.ifa_scope = RT_SCOPE_UNIVERSE; - req.ifmsg.ifaddr.ifa_index = ifinfo.ifi_index; + req.ifmsg.ifaddr.ifa_index = tunidx; if (config->bind_address) ip = config->bind_address; @@@ -773,7 -738,7 +745,7 @@@ req.ifmsg.ifaddr.ifa_family = AF_INET6; req.ifmsg.ifaddr.ifa_prefixlen = 64; req.ifmsg.ifaddr.ifa_scope = RT_SCOPE_LINK; - req.ifmsg.ifaddr.ifa_index = ifinfo.ifi_index; + req.ifmsg.ifaddr.ifa_index = tunidx; // Link local address is FE80::1 memset(&ip6, 0, sizeof(ip6)); @@@ -794,7 -759,7 +766,7 @@@ req.ifmsg.ifaddr.ifa_family = AF_INET6; req.ifmsg.ifaddr.ifa_prefixlen = 64; req.ifmsg.ifaddr.ifa_scope = RT_SCOPE_UNIVERSE; - req.ifmsg.ifaddr.ifa_index = ifinfo.ifi_index; + req.ifmsg.ifaddr.ifa_index = tunidx; // Global address is prefix::1 ip6 = config->ipv6_prefix; @@@ -3607,36 -3572,35 +3579,36 @@@ static int still_busy(void static clockt last_talked = 0; static clockt start_busy_wait = 0; - if (!config->cluster_iam_master) - { #ifdef BGP - static time_t stopped_bgp = 0; - if (bgp_configured) + static time_t stopped_bgp = 0; + if (bgp_configured) + { + if (!stopped_bgp) { - if (!stopped_bgp) - { - LOG(1, 0, 0, "Shutting down in %d seconds, stopping BGP...\n", QUIT_DELAY); + LOG(1, 0, 0, "Shutting down in %d seconds, stopping BGP...\n", QUIT_DELAY); - for (i = 0; i < BGP_NUM_PEERS; i++) - if (bgp_peers[i].state == Established) - bgp_stop(&bgp_peers[i]); + for (i = 0; i < BGP_NUM_PEERS; i++) + if (bgp_peers[i].state == Established) + bgp_stop(&bgp_peers[i]); - stopped_bgp = time_now; + stopped_bgp = time_now; + if (!config->cluster_iam_master) + { // we don't want to become master cluster_send_ping(0); return 1; } - - if (time_now < (stopped_bgp + QUIT_DELAY)) - return 1; } + + if (!config->cluster_iam_master && time_now < (stopped_bgp + QUIT_DELAY)) + return 1; + } #endif /* BGP */ + if (!config->cluster_iam_master) return 0; - } if (main_quit == QUIT_SHUTDOWN) { @@@ -3781,8 -3745,7 +3753,8 @@@ static void mainloop(void if (config->neighbour[i].name[0]) bgp_start(&bgp_peers[i], config->neighbour[i].name, config->neighbour[i].as, config->neighbour[i].keepalive, - config->neighbour[i].hold, 0); /* 0 = routing disabled */ + config->neighbour[i].hold, config->neighbour[i].update_source, + 0); /* 0 = routing disabled */ } #endif /* BGP */ @@@ -4002,11 -3965,6 +3974,11 @@@ more++; } } +#ifdef BGP + else + /* no event received, but timers could still have expired */ + bgp_process_peers_timers(); +#endif /* BGP */ if (time_changed) { @@@ -4314,14 -4272,9 +4286,14 @@@ static void initdata(int optdebug, cha if (!*hostname) { - // Grab my hostname unless it's been specified - gethostname(hostname, sizeof(hostname)); - stripdomain(hostname); + if (!*config->hostname) + { + // Grab my hostname unless it's been specified + gethostname(hostname, sizeof(hostname)); + stripdomain(hostname); + } + else + strcpy(hostname, config->hostname); } _statistics->start_time = _statistics->last_reset = time(NULL);