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