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

diff --combined l2tpns.c
+++ b/l2tpns.c
@@@ -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",
@@@ -446,7 -444,11 +446,11 @@@ static void routeset(sessionidt s, in_a
                req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_REPLACE;
        }
        else
+       {
                req.nh.nlmsg_type = RTM_DELROUTE;
+               req.nh.nlmsg_flags = NLM_F_REQUEST;
+       }
        req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.rt));
  
        req.rt.rtm_family = AF_INET;
@@@ -521,7 -523,11 +525,11 @@@ void route6set(sessionidt s, struct in6
                req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_REPLACE;
        }
        else
+       {
                req.nh.nlmsg_type = RTM_DELROUTE;
+               req.nh.nlmsg_flags = NLM_F_REQUEST;
+       }
        req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.rt));
  
        req.rt.rtm_family = AF_INET6;
        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)
        {
@@@ -3579,36 -3580,35 +3587,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)
        {
@@@ -3753,8 -3753,7 +3761,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)
                {
@@@ -4286,14 -4280,9 +4294,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);