InterfaceTable.cc

Go to the documentation of this file.
00001 /*
00002  *    Copyright 2004-2006 Intel Corporation
00003  * 
00004  *    Licensed under the Apache License, Version 2.0 (the "License");
00005  *    you may not use this file except in compliance with the License.
00006  *    You may obtain a copy of the License at
00007  * 
00008  *        http://www.apache.org/licenses/LICENSE-2.0
00009  * 
00010  *    Unless required by applicable law or agreed to in writing, software
00011  *    distributed under the License is distributed on an "AS IS" BASIS,
00012  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  *    See the License for the specific language governing permissions and
00014  *    limitations under the License.
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 } // namespace dtn

Generated on Thu Jun 7 16:56:50 2007 for DTN Reference Implementation by  doxygen 1.5.1