Source: ../../bgp/update_attrib.hh
|
|
|
|
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
// 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/bgp/update_attrib.hh,v 1.17 2009/01/05 18:30:43 jtc Exp $
#ifndef __BGP_UPDATE_ATTRIB_HH__
#define __BGP_UPDATE_ATTRIB_HH__
#include "libxorp/ipvxnet.hh"
#include "libxorp/exceptions.hh"
#include "exceptions.hh"
#include <list>
/**
* Encoding used in BGP update packets to encode prefixes
* (IPv4 only) for withdrawn routes and NLRI information.
*
* The prefixes are passed on the wire in a compressed format:
* 1 byte: prefix length L (in bits)
* n bytes: prefix, L bits (n = (L+7)/8)
*
* Effectively, this class is just an IPv4Net.
* We only need methods to encode and decode the objects.
*/
class BGPUpdateAttrib : public IPv4Net
{
public:
/**
* construct from an address d and mask length s
*/
BGPUpdateAttrib(const IPv4& d, uint8_t s) : IPv4Net(d, s) {}
BGPUpdateAttrib(const IPv4Net& p) : IPv4Net(p) {}
/**
* Construct from wire format
*/
BGPUpdateAttrib(const uint8_t *d);
/**
* store in memory in wire format
*/
void copy_out(uint8_t *d) const;
/**
* total size in encoded format
*/
size_t wire_size() const {
return calc_byte_size() + 1;
}
// size of next operand in memory
static size_t size(const uint8_t *d) throw(CorruptMessage);
size_t calc_byte_size() const {
return (prefix_len() + 7) / 8;
}
const IPv4Net& net() const {
return (IPv4Net &)(*this);
}
string str(string nlri_or_withdraw) const {
return nlri_or_withdraw + " " + net().str();
}
protected:
private:
};
class BGPUpdateAttribList : public list <BGPUpdateAttrib> {
public:
typedef list <BGPUpdateAttrib>::const_iterator const_iterator;
typedef list <BGPUpdateAttrib>::iterator iterator;
size_t wire_size() const;
uint8_t *encode(size_t &l, uint8_t *buf = 0) const;
void decode(const uint8_t *d, size_t len)
throw(CorruptMessage);
string str(string) const;
// XXX this needs to be fixed, we do not want to sort all the times.
bool operator== (const BGPUpdateAttribList& other) {
if (size() != other.size())
return false;
BGPUpdateAttribList me(*this);
BGPUpdateAttribList him(other);
me.sort();
him.sort();
const_iterator i, j;
// only check one iterator as we know length is the same
for (i=me.begin(), j=him.begin(); i!=me.end(); ++i, ++j)
if ( *i != *j )
return false;
return true;
}
};
#endif // __BGP_UPDATE_ATTRIB_HH__
Generated by: pavlin on kobe.xorp.net on Wed Jan 7 19:11:04 2009, using kdoc 2.0a54+XORP.