Source: ../../contrib/olsr/face.hh
|
|
|
|
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
// vim:set sts=4 ts=8 sw=4:
// Copyright (c) 2001-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/contrib/olsr/face.hh,v 1.4 2009/01/05 18:30:46 jtc Exp $
#ifndef __OLSR_FACE_HH__
#define __OLSR_FACE_HH__
class FaceManager;
class Packet;
class Link;
class Message;
class MessageDecoder;
class Neighborhood;
class Olsr;
class XorpTimer;
/**
* @short Per-interface protocol statistics.
*/
class FaceCounters {
public:
FaceCounters()
: _bad_packets(0),
_bad_messages(0),
_duplicates(0),
_messages_from_self(0),
_unknown_messages(0),
_forwarded(0)
{}
inline size_t bad_packets() const { return _bad_packets; }
inline void incr_bad_packets() { _bad_packets++; }
inline size_t bad_messages() const { return _bad_messages; }
inline void incr_bad_messages() { _bad_messages++; }
inline size_t messages_from_self() const { return _messages_from_self; }
inline void incr_messages_from_self() { _messages_from_self++; }
inline size_t unknown_messages() const { return _unknown_messages; }
inline void incr_unknown_messages() { _unknown_messages++; }
inline size_t duplicates() const { return _duplicates; }
inline void incr_duplicates() { _duplicates++; }
inline size_t forwarded() const { return _forwarded; }
inline void incr_forwarded() { _forwarded++; }
private:
/**
* The number of bad packets received on this Face.
*/
uint32_t _bad_packets;
/**
* The number of bad messages received on this Face.
*/
uint32_t _bad_messages;
/**
* The number of messages received on this Face which were
* already processed according to the duplicate set.
*/
uint32_t _duplicates;
/**
* The number of messages received on this Face which contained
* our main address as the origin.
*/
uint32_t _messages_from_self;
/**
* The number of messages of unknown type received on this Face.
*/
uint32_t _unknown_messages;
/**
* The number of messages received on this interface which
* have been forwarded to other nodes.
*/
uint32_t _forwarded;
};
/**
* @short An OLSR interface.
*
* There is one Face per physical if/vif which OLSR is
* configured to run on.
*
* Whilst an IPv4 interface may have multiple addresses,
* OLSR uses IPv4 addresses as primary keys in the
* protocol. Therefore it is necessary to track the first
* configured address on each vif, and use that as the
* Face's address. This happens in the absence of any
* IPv4 link-scope addresses as the system does not
* have any concept of such things. This may be considered
* the same limitation as IGMP has.
*
* The analogue in XORP's OSPF implementation is class Peer.
* Unlike OSPF, we do not split Face in the same way as Peer/PeerOut
* are split, as there is no concept of Areas in version 1 of OLSR.
*
* A face is associated with Links to each Neighbor.
* An instance of Olsr must have at least one Face configured to run Olsr,
* otherwise, it isn't an Olsr router.
* If no Faces exist, OLSR is not active.
* If only one Face exists, only a subset of the full OLSR protocol is used.
*/
class Face {
public:
Face(Olsr& olsr, FaceManager& fm, Neighborhood* nh,
MessageDecoder& md,
const string& interface, const string& vif,
OlsrTypes::FaceID id);
/**
* @return the internal ID of this OLSR interface.
*/
inline OlsrTypes::FaceID id() const { return _id; }
/**
* @return the name of this OLSR interface as known to the FEA.
*/
string interface() const { return _interface; }
/**
* @return the name of this OLSR interface's vif as known to the FEA.
*/
string vif() const { return _vif; }
/**
* @return the protocol counters for this OLSR interface.
*/
FaceCounters& counters() {
return _counters;
}
/**
* @return the protocol counters for this OLSR interface.
*/
const FaceCounters& counters() const {
return _counters;
}
/**
* @return the MTU of this interface.
*/
inline uint32_t mtu() const { return _mtu; }
/**
* Set the MTU of this interface.
*/
inline void set_mtu(const uint32_t mtu) { _mtu = mtu; }
/**
* @return the next available sequence number for a Packet to be
* sent from this OLSR interface.
*/
inline uint32_t get_pkt_seqno() { return _next_pkt_seqno++; }
/**
* @return true if this OLSR interface is administratively up.
*/
inline bool enabled() const {
return _enabled;
}
/**
* @return the "all nodes" address configured for this OLSR interface.
*/
inline IPv4 all_nodes_addr() const {
return _all_nodes_addr;
}
/**
* @return the "all nodes" UDP port configured for this OLSR interface.
*/
inline uint16_t all_nodes_port() const {
return _all_nodes_port;
}
/**
* @return the source address configured for this OLSR interface.
*/
inline IPv4 local_addr() const {
return _local_addr;
}
/**
* @return the UDP source port configured for this OLSR interface.
*/
inline uint16_t local_port() const {
return _local_port;
}
/**
* @return the default cost of transiting this OLSR interface.
* Used by the shortest path algorithm.
*/
inline int cost() const {
return _cost;
}
/**
* Set the "administratively up" state of an OLSR interface.
*
* @param value true if this interface is enabled for OLSR,
* otherwise false.
*/
void set_enabled(bool value);
/**
* Set the "all nodes" address for this OLSR interface.
*
* @param all_nodes_addr the "all nodes" address to set.
*/
inline void set_all_nodes_addr(const IPv4& all_nodes_addr) {
_all_nodes_addr = all_nodes_addr;
}
/**
* Set the "all nodes" UDP port for this OLSR interface.
*
* @param all_nodes_port the "all nodes" port to set.
*/
inline void set_all_nodes_port(const uint16_t all_nodes_port) {
_all_nodes_port = all_nodes_port;
}
/**
* Set the local address for this OLSR interface.
*
* @param local_addr the local address to set.
*/
inline void set_local_addr(const IPv4& local_addr) {
_local_addr = local_addr;
}
/**
* Set the UDP local port for this OLSR interface.
*
* @param local_port the local port to set.
*/
inline void set_local_port(const uint16_t local_port) {
_local_port = local_port;
}
/**
* Set the shortest path tree cost for this OLSR interface.
*
* @param cost the cost to set.
*/
inline void set_cost(int cost) {
_cost = cost;
}
/**
* Transmit a datagram on this Face.
*
* @param data the datagram to be sent.
* @param len the length of the datagram to be sent.
* @return true if the datagram was successfully transmitted.
*/
bool transmit(uint8_t* data, const uint32_t& len);
/**
* Originate a HELLO message on this interface.
*
* The message thus originated will be filled out appropriately,
* containing the relevant OLSR protocol state as seen from this Face.
*
* TODO: Perform MTU-based message segmentation.
*/
void originate_hello();
private:
Olsr& _olsr;
FaceManager& _fm;
Neighborhood* _nh;
MessageDecoder& _md;
/**
* @short Counters for this Face.
*/
FaceCounters _counters;
/**
* @short A unique identifier for this Face.
*/
OlsrTypes::FaceID _id;
/**
* @short true if this Face is enabled for routing.
*/
bool _enabled;
/**
* @short The name of the interface with which this Face is associated.
*/
string _interface;
/**
* @short The name of the Vif with which this Face is associated.
*/
string _vif;
/**
* @short The MTU for this interface.
*/
uint32_t _mtu;
/**
* @short Local address to use for transmitting OLSR
* protocol messages in UDP.
*/
IPv4 _local_addr;
/**
* @short Local port to use for transmitting
* OLSR protocol messages.
*/
uint16_t _local_port;
/**
* @short The "all nodes" address to use on this Face
* for sending protocol messages.
*/
IPv4 _all_nodes_addr;
/**
* @short The "all nodes" port to use on this Face
* for sending protocol messages.
*/
uint16_t _all_nodes_port;
/**
* @short A fixed cost for the interface, used in route calculation.
*/
int _cost;
/**
* @short The sequence number of the next packet sent from this Face.
*/
uint32_t _next_pkt_seqno;
};
#endif // __OLSR_FACE_HH__
Generated by: pavlin on kobe.xorp.net on Wed Jan 7 19:11:15 2009, using kdoc 2.0a54+XORP.