Source: ../../vrrp/vrrp.hh
|
|
|
|
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
// vim:set sts=4 ts=8:
// Copyright (c) 2008-2009 XORP, Inc.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License, Version 2, June
// 1991 as published by the Free Software Foundation. Redistribution
// and/or modification of this program under the terms of any other
// version of the GNU General Public License is not permitted.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details,
// see the GNU General Public License, Version 2, a copy of which can be
// found in the XORP LICENSE.gpl file.
//
// XORP Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA;
// http://xorp.net
// $XORP: xorp/vrrp/vrrp.hh,v 1.11 2009/01/05 18:31:12 jtc Exp $
#ifndef __VRRP_VRRP_HH__
#define __VRRP_VRRP_HH__
#include <set>
#include <string>
#include "libxorp/ipv4.hh"
#include "libxorp/timer.hh"
#include "libxorp/mac.hh"
#include "libxorp/eventloop.hh"
#include "vrrp_packet.hh"
#include "arpd.hh"
#define MAX_VRRP_SIZE (20 + VRRP_MAX_PACKET_SIZE)
/**
* @short VRRP protocol implementation.
*
* This class implements the state machine of the VRRP protocol. It receive
* events and responds to them.
*/
class Vrrp {
public:
static const Mac mcast_mac;
/**
* @param vif the VRRP interface on which this instance is running.
* @param e eventloop.
* @param vrid the VRRP id of this instance.
*/
Vrrp(VrrpInterface& vif, EventLoop& e, uint32_t vrid);
~Vrrp();
/**
* Set the priority of the router.
*
* @param priority the priority of this router.
*/
void set_priority(uint32_t priority);
/**
* Set the advertisement interval.
*
* @param interval the interval for sending advertisements.
*/
void set_interval(uint32_t interval);
/**
* Set whether a high priority backup router should preempt backup routers
* with lower priority acting as masters.
*
* @param preempt whether a high priority backup should preempt a low one.
*/
void set_preempt(bool preempt);
/**
* Stop or start this VRRP instance.
*
* @param disable stop this VRRP instance.
*/
void set_disable(bool disable);
/**
* Add an IP to the virtual router.
*
* @param ip IP address to add to the virtual router.
*/
void add_ip(const IPv4& ip);
/**
* Delete an IP from the virtual router.
*
* @param ip IP address to remove from the virtual router.
*/
void delete_ip(const IPv4& ip);
/**
* Check whether this instance is running.
*
* @return whether this VRRP instance is running.
*/
bool running() const;
/**
* Obtain the priority of this router.
*
* @return priority of router.
*/
uint32_t priority() const;
/**
* Start VRRP processing.
*/
void start();
/**
* Stop the protocol.
*/
void stop();
/**
* Check whether the router owns all IPs configured for the virtual router.
* This must be called after updating IP addresses.
*/
void check_ownership();
/**
* Must be called when a VRRP packet is received.
*
* @param from IP address sending the packet.
* @param vh the VRRP packet received, starting from the VRRP header.
*/
void recv(const IPv4& from, const VrrpHeader& vh);
/**
* Obtain an instance to the ARP daemon.
*
* @return an instance of the ARP daemon.
*/
ARPd& arpd();
/**
* Returns information about the state of the protocol.
*
* @param state the state of the router (output parameter).
* @param master the IP address of the master (output parameter).
*/
void get_info(string& state, IPv4& master) const;
private:
enum State {
INITIALIZE = 0,
MASTER,
BACKUP
};
enum {
PRIORITY_LEAVE = 0,
PRIORITY_OWN = 255
};
typedef set<IPv4> IPS;
/**
* Calculate advertisement intervals based on protocol parameters. This is
* called when any of these parameters (e.g., whether the router owns the
* IPs) change.
*/
void setup_intervals();
/**
* Setup timers based on intervals. Must be called when intervals change.
*
* @param skew whether the skew time should be added when setting the timer.
*/
void setup_timers(bool skew = false);
/**
* Stop all timers.
*/
void cancel_timers();
/**
* Send gratuitous ARPs for all the IP addresses of this virtual router.
*/
void send_arps();
/**
* Send a gratitious ARP for a specific IP.
*
* @param ip the IP address to send the ARP for.
*/
void send_arp(const IPv4& ip);
/**
* Send an advertisement with given priority.
*
* @param priority of the advertisement.
*/
void send_advertisement(uint32_t priority);
/**
* Send a VRRP advertisement. The parameters are taken from member
* variables.
*
*/
void send_advertisement();
/**
* Become the master router.
*/
void become_master();
/**
* Become a backup router.
*/
void become_backup();
/**
* This is called when this router thinks the master router is dead. That
* is, when the timer waiting for an advertisement expires.
*
* @return whether to reschedule the timer.
*/
bool master_down_expiry();
/**
* This is called when the next advertisement should be sent.
*
* @return whether to renew the timer.
*/
bool adver_expiry();
/**
* Called when receiving an advertisement in the master state.
*
* @param from the IP that sent the advertisement.
* @param priority the priority in the VRRP advertisement.
*/
void recv_adver_master(const IPv4& from, uint32_t priority);
/**
* Called when an advertisement is received in the backup state.
*
* @param priority the priority within the VRRP advertisement.
*/
void recv_adver_backup(uint32_t priority);
/**
* Create the advertisement packet.
*
* @param priority the priority to be announced in the advertisement.
*/
void prepare_advertisement(uint32_t priority);
/**
* Notification of advertisement reception.
*
* @param from IP address of sender.
* @param priority the priority in the VRRP header.
*/
void recv_advertisement(const IPv4& from, uint32_t priority);
/**
* Check whether the IPs in the VRRP packet match those configured
*
* @return true on exact matches.
* @param vh the VRRP header.
*/
bool check_ips(const VrrpHeader& vh);
IPv4 _last_adv;
VrrpInterface& _vif;
uint32_t _vrid;
uint32_t _priority;
uint32_t _interval;
double _skew_time;
double _master_down_interval;
bool _preempt;
IPS _ips;
State _state;
XorpTimer _master_down_timer;
XorpTimer _adver_timer;
bool _own;
bool _disable;
VrrpPacket _adv_packet;
Mac _source_mac;
ARPd _arpd; // XXX use OS proxy arp mechanism?
};
#endif // __VRRP_VRRP_HH__
Generated by: pavlin on kobe.xorp.net on Wed Jan 7 19:11:13 2009, using kdoc 2.0a54+XORP.