X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/afc8f4c6c019f3cd4c8c28fbf7948b594de08658..5dacb3cdf55ecd2bf6cc5a83cb791ad76b4bd086:/cluster.c?ds=sidebyside diff --git a/cluster.c b/cluster.c index 6d8a64e..0b595e3 100644 --- a/cluster.c +++ b/cluster.c @@ -1,6 +1,6 @@ // L2TPNS Clustering Stuff -char const *cvs_id_cluster = "$Id: cluster.c,v 1.45 2005/07/31 10:04:09 bodea Exp $"; +char const *cvs_id_cluster = "$Id: cluster.c,v 1.50 2006/04/05 02:13:48 bodea Exp $"; #include #include @@ -127,6 +127,15 @@ int cluster_init() opt = 0; // Turn off multicast loopback. setsockopt(cluster_sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &opt, sizeof(opt)); + if (config->cluster_mcast_ttl != 1) + { + uint8_t ttl = 0; + if (config->cluster_mcast_ttl > 0) + ttl = config->cluster_mcast_ttl < 256 ? config->cluster_mcast_ttl : 255; + + setsockopt(cluster_sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)); + } + if (setsockopt(cluster_sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { LOG(0, 0, 0, "Failed to setsockopt (join mcast group): %s\n", strerror(errno)); @@ -1259,12 +1268,10 @@ static uint8_t *convert_session(struct oldsession *old) new.next = old->next; new.far = old->far; new.tunnel = old->tunnel; - new.l2tp_flags = old->l2tp_flags; + new.flags = old->l2tp_flags; new.ip = old->ip; new.ip_pool_index = old->ip_pool_index; new.unique_id = old->unique_id; - new.nr = old->nr; - new.ns = old->ns; new.magic = old->magic; new.pin = old->pin; new.pout = old->pout; @@ -1544,7 +1551,7 @@ static int cluster_process_heartbeat(uint8_t *data, int size, int more, uint8_t s -= (p - orig_p); if (size != sizeof(tunnelt) ) { // Ouch! Very very bad! - LOG(0, 0, 0, "DANGER: Received a CSESSION that didn't decompress correctly!\n"); + LOG(0, 0, 0, "DANGER: Received a CTUNNEL that didn't decompress correctly!\n"); // Now what? Should exit! No-longer up to date! break; } @@ -1648,7 +1655,11 @@ int processcluster(uint8_t *data, int size, in_addr_t addr) STAT(recv_forward); if (type == C_FORWARD_DAE) - processdae(p, s, &a, sizeof(a)); + { + struct in_addr local; + local.s_addr = config->bind_address ? config->bind_address : my_address; + processdae(p, s, &a, sizeof(a), &local); + } else processudp(p, s, &a);