Merge branch 'use-netlink' into fdn-mods
authorBenjamin Cama <benoar@dolka.fr>
Sat, 20 Aug 2011 15:24:10 +0000 (17:24 +0200)
committerBenjamin Cama <benoar@dolka.fr>
Sat, 20 Aug 2011 15:24:10 +0000 (17:24 +0200)
1  2 
l2tpns.c

diff --combined l2tpns.c
+++ b/l2tpns.c
@@@ -30,7 -30,7 +30,7 @@@ char const *cvs_id_l2tpns = "$Id: l2tpn
  #include <sys/time.h>
  #include <sys/resource.h>
  #include <sys/wait.h>
- #include <linux/if.h>
+ #include <net/if.h>
  #include <stddef.h>
  #include <time.h>
  #include <dlfcn.h>
@@@ -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));
        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
  
                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
  
                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;
                        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));
                        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 */
  
                                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);