00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifdef HAVE_CONFIG_H
00018 # include <dtn-config.h>
00019 #endif
00020
00021 #include "InterfaceTable.h"
00022 #include "conv_layers/ConvergenceLayer.h"
00023 #include "oasys/util/StringBuffer.h"
00024
00025 namespace dtn {
00026
00027 InterfaceTable* InterfaceTable::instance_ = NULL;
00028
00029 InterfaceTable::InterfaceTable()
00030 : Logger("InterfaceTable", "/dtn/interface/table")
00031 {
00032 }
00033
00034 InterfaceTable::~InterfaceTable()
00035 {
00036 NOTREACHED;
00037 }
00038
00043 bool
00044 InterfaceTable::find(const std::string& name,
00045 InterfaceList::iterator* iter)
00046 {
00047 Interface* iface;
00048 for (*iter = iflist_.begin(); *iter != iflist_.end(); ++(*iter)) {
00049 iface = **iter;
00050
00051 if (iface->name() == name) {
00052 return true;
00053 }
00054 }
00055
00056 return false;
00057 }
00058
00064 bool
00065 InterfaceTable::add(const std::string& name,
00066 ConvergenceLayer* cl,
00067 const char* proto,
00068 int argc, const char* argv[])
00069 {
00070 InterfaceList::iterator iter;
00071
00072 if (find(name, &iter)) {
00073 log_err("interface %s already exists", name.c_str());
00074 return false;
00075 }
00076
00077 log_info("adding interface %s (%s)", name.c_str(), proto);
00078
00079 Interface* iface = new Interface(name, proto, cl);
00080 if (! cl->interface_up(iface, argc, argv)) {
00081 log_err("convergence layer error adding interface %s", name.c_str());
00082 delete iface;
00083 return false;
00084 }
00085
00086 iflist_.push_back(iface);
00087
00088 return true;
00089 }
00090
00094 bool
00095 InterfaceTable::del(const std::string& name)
00096 {
00097 InterfaceList::iterator iter;
00098 Interface* iface;
00099 bool retval = false;
00100
00101 log_info("removing interface %s", name.c_str());
00102
00103 if (! find(name, &iter)) {
00104 log_err("error removing interface %s: no such interface",
00105 name.c_str());
00106 return false;
00107 }
00108
00109 iface = *iter;
00110 iflist_.erase(iter);
00111
00112 if (iface->clayer()->interface_down(iface)) {
00113 retval = true;
00114 } else {
00115 log_err("error deleting interface %s from the convergence layer.",
00116 name.c_str());
00117 retval = false;
00118 }
00119
00120 delete iface;
00121 return retval;
00122 }
00123
00127 void
00128 InterfaceTable::list(oasys::StringBuffer *buf)
00129 {
00130 InterfaceList::iterator iter;
00131 Interface* iface;
00132
00133 for (iter = iflist_.begin(); iter != iflist_.end(); ++(iter)) {
00134 iface = *iter;
00135 buf->appendf("%s: Convergence Layer: %s\n",
00136 iface->name().c_str(), iface->proto().c_str());
00137 iface->clayer()->dump_interface(iface, buf);
00138 buf->append("\n");
00139 }
00140 }
00141
00142 }