Source: ../../contrib/olsr/xrl_port.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/xrl_port.hh,v 1.4 2009/01/05 18:30:47 jtc Exp $
#ifndef __OLSR_XRL_PORT_HH__
#define __OLSR_XRL_PORT_HH__
#include <string>
#include "libxorp/ipv4.hh"
#include "libxorp/safe_callback_obj.hh"
#include "libxorp/service.hh"
class XrlError;
class XrlRouter;
/**
* @short Helper class which encapsulates XRL socket service
*
* Deals with setting the specific XRL socket options that OLSR
* needs to send/receive broadcast/multicast control traffic to
* the all-nodes address.
*/
class XrlPort : public ServiceBase,
public CallbackSafeObject {
public:
/**
* Begin creation of the broadcast/multicast socket.
*
* @param io pointer to parent object
* @param eventloop process-wide event loop
* @param xrl_router process-wide XRL router
* @param ssname name of XRL target containing socket server;
* usually this is the FEA.
* @param ifname interface to listen on
* @param vifname vif to listen on
* @param local_addr address to listen on
* @param local_port port to listen on
* @param all_nodes_addr address to send to
*/
XrlPort(IO* io,
EventLoop& eventloop,
XrlRouter& xrl_router,
const string& ssname,
const string& ifname,
const string& vifname,
const IPv4& local_addr,
const uint16_t local_port,
const IPv4& all_nodes_addr);
~XrlPort();
/**
* Start the port binding.
*
* Sends request to FEA for socket server for address
* and then attempts to instantiate socket with socket server. If
* both operations are successful, instance status transitions to
* SERVICE_RUNNING. Otherwise, it transitions to failed.
*
* @return XORP_OK on success, otherwise XORP_ERROR.
*/
int startup();
/**
* Shutdown the port binding.
*
* Sends request to close socket and transitions into
* SERVICE_SHUTTING_DOWN state. When socket is closed transition to
* SERVICE_SHUTDOWN occurs.
*
* @return XORP_OK on success, otherwise XORP_ERROR.
*/
int shutdown();
/**
* Send packet.
*
* Status of instance must be running. When packet is sent,
* the @ref pending() method will return true until the Xrl sending the
* packet has completed.
*
* @param dst_addr address to send packet.
* @param dst_port port to send packet to.
* @param payload vector containing paylaod of packet to be sent.
*
* @return false on immediately detectable failure, true otherwise.
*/
bool send_to(const IPv4& dst_addr,
const uint16_t dst_port,
const vector<uint8_t>& payload);
/**
* @return true if an XRL operation is pending, otherwise false.
*/
inline bool pending() const { return _pending; }
/**
* @return the name of the socket server in use.
*/
inline string socket_server() const { return _ss; }
/**
* @return the name of the interface to which this socket is bound.
*/
inline string ifname() const { return _ifname; }
/**
* @return the name of the vif to which this socket is bound.
*/
inline string vifname() const { return _vifname; }
/**
* @return the address to which this socket is bound.
*/
inline IPv4 local_address() const { return _local_addr; }
/**
* @return the port to which this socket is bound.
*/
inline uint16_t local_port() const { return _local_port; }
/**
* @return the socket server's socket identifier,
* if service status is RUNNING; otherwise undefined.
*/
inline string sockid() const { return _sockid; }
/**
* @return the address to which this socket transmits.
*/
inline IPv4 all_nodes_address() const { return _all_nodes_addr; }
private:
bool startup_socket();
//
// Socket open operations.
//
bool request_udp_open_bind_broadcast();
void udp_open_bind_broadcast_cb(const XrlError& e, const string* psid);
bool request_tos();
void tos_cb(const XrlError& xrl_error);
void socket_setup_complete();
//
// BSD hack.
//
bool request_reuseport();
void reuseport_cb(const XrlError& e);
bool request_onesbcast(const bool enabled);
void onesbcast_cb(const XrlError& e);
//
// Socket close operations.
//
bool request_close();
void close_cb(const XrlError& xrl_error);
//
// Socket send operations.
//
void send_cb(const XrlError& xrl_error);
private:
IO* _io;
EventLoop& _eventloop;
XrlRouter& _xrl_router;
string _ss;
string _ifname;
string _vifname;
IPv4 _local_addr;
uint16_t _local_port;
IPv4 _all_nodes_addr;
bool _pending;
string _sockid;
bool _is_undirected_broadcast;
};
#endif // __OLSR_XRL_PORT_HH__
Generated by: pavlin on kobe.xorp.net on Wed Jan 7 19:11:15 2009, using kdoc 2.0a54+XORP.