// // nr.cc : Network Routing // authors : Dan Coffin, John Heidemann, Dan Van Hook // authors : Fabio Silva // // Copyright (C) 2000-2003 by the University of Southern California // $Id: nr.cc,v 1.8 2005/09/13 04:53:50 tomh Exp $ // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License, // version 2, as published by the Free Software Foundation. // // 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. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, write to the Free Software Foundation, Inc., // 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. // // Linking this file statically or dynamically with other modules is making // a combined work based on this file. Thus, the terms and conditions of // the GNU General Public License cover the whole combination. // // In addition, as a special exception, the copyright holders of this file // give you permission to combine this file with free software programs or // libraries that are released under the GNU LGPL and with code included in // the standard release of ns-2 under the Apache 2.0 license or under // otherwise-compatible licenses with advertising requirements (or modified // versions of such code, with unchanged license). You may copy and // distribute such a system following the terms of the GNU GPL for this // file and the licenses of the other code concerned, provided that you // include the source code of that other code when and as the GNU GPL // requires distribution of source code. // // Note that people who make modified versions of this file are not // obligated to grant this special exception for their modified versions; // it is their choice whether to do so. The GNU General Public License // gives permission to release a modified version without this exception; // this exception also makes it possible to release a modified version // which carries forward this exception. #include // for null #include // for strdup #include // for stl min #include "nr.hh" NRSimpleAttributeFactory NRScopeAttr(NRAttribute::SCOPE_KEY, NRAttribute::INT32_TYPE); NRSimpleAttributeFactory NRClassAttr(NRAttribute::CLASS_KEY, NRAttribute::INT32_TYPE); NRSimpleAttributeFactory NRAlgorithmAttr(NRAttribute::ALGORITHM_KEY, NRAttribute::INT32_TYPE); NRSimpleAttributeFactory NRSubscriptionAttr(NRAttribute::SUBSCRIPTION_ID_KEY, NRAttribute::INT32_TYPE); NRSimpleAttributeFactory NRFlowAttr(NRAttribute::FLOWS_KEY, NRAttribute::BLOB_TYPE); NRSimpleAttributeFactory LatitudeAttr(NRAttribute::LATITUDE_KEY, NRAttribute::FLOAT32_TYPE); NRSimpleAttributeFactory LongitudeAttr(NRAttribute::LONGITUDE_KEY, NRAttribute::FLOAT32_TYPE); NRSimpleAttributeFactory RouteAttr(NRAttribute::ROUTE_KEY, NRAttribute::STRING_TYPE); NRSimpleAttributeFactory SourceRouteAttr(NRAttribute::SOURCE_ROUTE_KEY, NRAttribute::STRING_TYPE); NRSimpleAttributeFactory ReinforcementAttr(NRAttribute::REINFORCEMENT_KEY, NRAttribute::BLOB_TYPE); // RMST attribute factory definitions NRSimpleAttributeFactory RmstIdAttr(NRAttribute::RMST_ID_KEY, NRAttribute::INT32_TYPE); NRSimpleAttributeFactory RmstFragAttr(NRAttribute::RMST_FRAG_KEY, NRAttribute::INT32_TYPE); NRSimpleAttributeFactory RmstMaxFragAttr(NRAttribute::RMST_MAX_FRAG_KEY, NRAttribute::INT32_TYPE); NRSimpleAttributeFactory RmstDataAttr(NRAttribute::RMST_DATA_KEY, NRAttribute::BLOB_TYPE); NRSimpleAttributeFactory RmstTsprtCtlAttr(NRAttribute::RMST_TSPRT_CTL_KEY, NRAttribute::INT32_TYPE); NRSimpleAttributeFactory RmstPktsSentAttr(NRAttribute::RMST_PKTS_SENT_KEY, NRAttribute::INT32_TYPE); NRSimpleAttributeFactory RmstTargetAttr(NRAttribute::RMST_TARGET_KEY, NRAttribute::STRING_TYPE); NRAttributeFactory *NRAttributeFactory::first_ = NULL; NRAttribute::NRAttribute(int key, int type, int op, int len, void *val) : key_(key), type_(type), op_(op), len_(len) { if (val != NULL){ val_ = (void *) new char[len_]; memcpy(val_, val, len_); } } NRAttribute::NRAttribute() : key_(0), type_(0), op_(0), len_(0), val_(NULL) {} NRAttribute::NRAttribute(const NRAttribute &rhs) { key_ = rhs.key_; type_ = rhs.type_; op_ = rhs.op_; len_ = rhs.len_; val_ = new char[len_]; memcpy(val_, rhs.val_, len_); } NRAttribute::~NRAttribute() { } NRAttribute * NRAttribute::find_key_from(int key, NRAttrVec *attrs, NRAttrVec::iterator start, NRAttrVec::iterator *place) { NRAttrVec::iterator i; for (i = start; i != attrs->end(); ++i) { if ((*i)->getKey() == key) { if (place) *place = i; return (*i); }; }; return NULL; } bool NRAttribute::isEQ(NRAttribute *attr) { // Keys need to be the same if (!isSameKey(attr)) abort(); switch (type_){ case INT32_TYPE: return (*(int32_t *) val_ == *(int32_t *) attr->getGenericVal()); break; case FLOAT32_TYPE: return (*(float *) val_ == *(float *) attr->getGenericVal()); break; case FLOAT64_TYPE: return (*(double *) val_ == *(double *) attr->getGenericVal()); break; case STRING_TYPE: if (len_ != attr->getLen()) return false; return (!strncmp((char *) val_, (char *) attr->getGenericVal(), len_)); break; case BLOB_TYPE: if (len_ != attr->getLen()) return false; return (!memcmp((void *) val_, (void *) attr->getGenericVal(), len_)); break; default: abort(); break; } } bool NRAttribute::isGT(NRAttribute *attr) { int cmplen, cmp; // must be here for initialization reasons // Keys need to be the same if (!isSameKey(attr)) abort(); switch (type_) { case INT32_TYPE: return (*(int32_t *) val_ > *(int32_t *) attr->getGenericVal()); break; case FLOAT32_TYPE: return (*(float *) val_ > *(float *) attr->getGenericVal()); break; case FLOAT64_TYPE: return (*(double *) val_ > *(double *) attr->getGenericVal()); break; case STRING_TYPE: return strncmp((char *) val_, (char *) attr->getGenericVal(), min(len_, attr->getLen())); break; case BLOB_TYPE: cmplen = min(len_, attr->getLen()); cmp = memcmp((void *) val_, (void *) attr->getGenericVal(), cmplen); // We are greater than attr if (cmp > 0) return true; // We are equal to attr up to len_, but we are longer if (cmp == 0 && (len_ > attr->getLen())) return true; return false; break; default: abort(); break; } } bool NRAttribute::isGE(NRAttribute *attr) { int cmplen, cmp; // must be here for initialization reasons // Keys need to be the same if (!isSameKey(attr)) abort(); switch (type_) { case INT32_TYPE: return (*(int32_t *) val_ >= *(int32_t *) attr->getGenericVal()); break; case FLOAT32_TYPE: return (*(float *) val_ >= *(float *) attr->getGenericVal()); break; case FLOAT64_TYPE: return (*(double *) val_ >= *(double *) attr->getGenericVal()); break; case STRING_TYPE: return (strcmp((char *) val_, (char *) attr->getGenericVal()) >= 0); break; case BLOB_TYPE: cmplen = min(len_, attr->getLen()); cmp = memcmp((void *) val_, (void *) attr->getGenericVal(), cmplen); // We are greater or equal to attr if (cmp >= 0) return true; return false; break; default: abort(); break; } } NRSimpleAttribute::NRSimpleAttribute(int key, int type, int op, char *val, int size) : NRAttribute(key, type, op, (strlen(val) + 1)) { assert(type == STRING_TYPE); val_ = NULL; setVal(val); } void NRSimpleAttribute::setVal(char *value) { delete [] (char *) val_; len_ = strlen(value) + 1; val_ = (void *) new char[len_ + 1]; memcpy(val_, value, len_); } NRSimpleAttribute::NRSimpleAttribute(int key, int type, int op, void *val, int size) : NRAttribute(key, type, op, size) { assert(type == BLOB_TYPE); val_ = NULL; setVal(val, len_); } void NRSimpleAttribute::setVal(void *value, int len) { delete [] (char *) val_; len_ = len; val_ = (void *) new char[len_]; memcpy(val_, value, len_); } void NRAttributeFactory::verify_unique(NRAttributeFactory *baby) { NRAttributeFactory *i = first_, *last = NULL; while (i) { if (baby->key_ == i->key_) { // identical factories are ok assert(baby->type_ == i->type_); return; // don't enlist duplictates } last = i; i = i->next_; } // must not exist, add it if (last) last->next_ = first_; first_ = baby; }