00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "RouteTable.h"
00040 #include "contacts/Link.h"
00041
00042 namespace dtn {
00043
00047 RouteTable::RouteTable(const std::string& router_name)
00048 : Logger("RouteTable", "/dtn/routing/%s/table", router_name.c_str())
00049 {
00050 }
00051
00055 RouteTable::~RouteTable()
00056 {
00057 }
00058
00062 bool
00063 RouteTable::add_entry(RouteEntry* entry)
00064 {
00065 log_debug("add_route *%p", entry);
00066
00067 route_table_.push_back(entry);
00068
00069 return true;
00070 }
00071
00075 bool
00076 RouteTable::del_entry(const EndpointIDPattern& dest, Link* next_hop)
00077 {
00078 RouteEntryVec::iterator iter;
00079 RouteEntry* entry;
00080
00081 for (iter = route_table_.begin(); iter != route_table_.end(); ++iter) {
00082 entry = *iter;
00083
00084 if (entry->dest_pattern_.equals(dest) && entry->next_hop_ == next_hop) {
00085 log_debug("del_entry *%p", entry);
00086
00087 route_table_.erase(iter);
00088 delete entry;
00089 return true;
00090 }
00091 }
00092
00093 log_debug("del_entry %s -> %s: no match!",
00094 dest.c_str(), next_hop->nexthop());
00095 return false;
00096 }
00097
00101 size_t
00102 RouteTable::del_entries(const EndpointIDPattern& dest)
00103 {
00104 RouteEntryVec::iterator iter;
00105 RouteEntry* entry;
00106
00107
00108
00109
00110 int num_found = 0;
00111 bool found;
00112 do {
00113 found = false;
00114 for (iter = route_table_.begin(); iter != route_table_.end(); ++iter) {
00115 entry = *iter;
00116
00117 if (dest.equals(entry->dest_pattern_)) {
00118 log_debug("del_route *%p", entry);
00119
00120 route_table_.erase(iter);
00121 delete entry;
00122 found = true;
00123 ++num_found;
00124 break;
00125 }
00126 }
00127 } while (found);
00128
00129 if (num_found == 0) {
00130 log_debug("del_entries %s: no matches!", dest.c_str());
00131 } else {
00132 log_debug("del_entries %s: removed %d routes", dest.c_str(), num_found);
00133 }
00134
00135 return num_found;
00136 }
00137
00138 size_t
00139 RouteTable::del_entries_for_nexthop(Link* next_hop)
00140 {
00141 RouteEntryVec::iterator iter;
00142 RouteEntry* entry;
00143
00144
00145
00146
00147
00148
00149
00150 int num_found = 0;
00151 bool found;
00152 do {
00153 found = false;
00154 for (iter = route_table_.begin(); iter != route_table_.end(); ++iter) {
00155 entry = *iter;
00156
00157 if (entry->next_hop_ == next_hop) {
00158 log_debug("del_route *%p", entry);
00159
00160 route_table_.erase(iter);
00161 delete entry;
00162 found = true;
00163 ++num_found;
00164 break;
00165 }
00166 }
00167 } while (found);
00168
00169 if (num_found == 0) {
00170 log_debug("del_entries_for_nexthop %s: no matches!",
00171 next_hop->name());
00172 } else {
00173 log_debug("del_entries_for_nexthop %s: removed %d routes",
00174 next_hop->name(), num_found);
00175 }
00176
00177 return num_found;
00178 }
00179
00186 size_t
00187 RouteTable::get_matching(const EndpointID& eid, Link* next_hop,
00188 RouteEntryVec* entry_vec) const
00189 {
00190 RouteEntryVec::const_iterator iter;
00191 RouteEntry* entry;
00192 size_t count = 0;
00193
00194 log_debug("get_matching %s", eid.c_str());
00195
00196 for (iter = route_table_.begin(); iter != route_table_.end(); ++iter) {
00197 entry = *iter;
00198
00199 log_debug("check entry *%p", entry);
00200
00201 if ((next_hop == NULL || entry->next_hop_ == next_hop) &&
00202 entry->dest_pattern_.match(eid))
00203 {
00204 ++count;
00205
00206 log_debug("match entry *%p", entry);
00207
00208 entry_vec->push_back(entry);
00209 }
00210 }
00211
00212 log_debug("get_matching %s done, %zu match(es)", eid.c_str(), count);
00213 return count;
00214 }
00215
00219 void
00220 RouteTable::dump(oasys::StringBuffer* buf, EndpointIDVector* long_eids) const
00221 {
00222 RouteEntry::dump_header(buf);
00223 RouteEntryVec::const_iterator iter;
00224 for (iter = route_table_.begin(); iter != route_table_.end(); ++iter) {
00225 (*iter)->dump(buf, long_eids);
00226 }
00227 }
00228 }