Source: ../../bgp/peer_handler.hh


Annotated List
Files
Globals
Hierarchy
Index
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-

// Copyright (c) 2001-2003 International Computer Science Institute
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software")
// to deal in the Software without restriction, subject to the conditions
// listed in the XORP LICENSE file. These conditions include: you must
// preserve this copyright notice, and you cannot mention the copyright
// holders in advertising related to the Software without their permission.
// The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
// notice is a summary of the XORP LICENSE file; the license in that file is
// legally binding.

// $XORP: xorp/bgp/peer_handler.hh,v 1.5 2003/03/10 23:20:02 hodson Exp $

#ifndef __BGP_PEER_HANDLER_HH__
#define __BGP_PEER_HANDLER_HH__

class BGPMain;
class BGPPeer;
class BGPPlumbing;
#include "libxorp/debug.h"
#include "internal_message.hh"
#include "packet.hh"
#include "peer.hh"

/**
 * PeerHandler's job is primarily format conversion. But it also
 * servers as a handle to tie together the input and output sides of a
 * RIB.
 */
class PeerHandler {
public:
    PeerHandler(const string &peername, BGPPeer *peer,
		   BGPPlumbing *plumbing);
    virtual ~PeerHandler();

    void stop();
    void peering_went_down();
    void peering_came_up();
    bool peering_is_up() const { return _peering_is_up; }

    /**
     * process_update_packet is called when an update packet has been
     * received by this peer
     */
    int process_update_packet(const UpdatePacket *p);

    /**
     * add_route and delete_route are called by the plumbing to
     * propagate a route *to* the peer.
     */
    virtual int start_packet(bool ibgp);

    virtual int add_route(const SubnetRoute<IPv4> &rt);
    virtual int add_route(const SubnetRoute<IPv6> &rt);
    virtual int replace_route(const SubnetRoute<IPv4> &old_rt,
			      const SubnetRoute<IPv4> &new_rt);
    virtual int replace_route(const SubnetRoute<IPv6> &old_rt,
			      const SubnetRoute<IPv6> &new_rt);
    virtual int delete_route(const SubnetRoute<IPv4> &rt);
    virtual int delete_route(const SubnetRoute<IPv6> &rt);
    virtual PeerOutputState push_packet();
    virtual void output_no_longer_busy();

    AsNum AS_number() const		{ return _peer->peerdata()->as(); }
    const string& peername() const	{ return _peername; }
    bool ibgp() const			{
	return _peer->peerdata()->get_internal_peer();
    }

    /**
     * @return the neighbours BGP ID as an integer for use by decision.
     */
    const IPv4& id() const		{ return _peer->peerdata()->id(); }

    /**
     * @return the neighbours IP address an as integer for use be
     * decision.
     */
    uint32_t neighbour_address() const	{
	return ntohl(_peer->peerdata()->iptuple().get_peer_addr().s_addr);
    }

    const IPv4& my_v4_nexthop() const	{
	return _peer->peerdata()->get_v4_local_addr();
    }

    const IPv6& my_v6_nexthop() const	{
	return _peer->peerdata()->get_v6_local_addr();
    }

    EventLoop *get_eventloop() const;
protected:
    BGPPlumbing *_plumbing;
    bool _ibgp; // did the current update message originate in IBGP?
private:
    string _peername;
    BGPPeer *_peer;
    bool _peering_is_up; /*whether we still think it's up (it may be
                           down, but the FSM hasn't told us yet) */
    UpdatePacket *_packet; /* this is a packet we construct to send */

    /*stats*/
    uint32_t _nlri_total;
    uint32_t _packets;
};

#endif // __BGP_PEER_HANDLER_HH__

Generated by: pavlin on possum.icir.org on Mon Mar 10 19:34:59 2003, using kdoc 2.0a54+XORP.