00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "DiscoveryCommand.h"
00018 #include "discovery/Discovery.h"
00019 #include "discovery/DiscoveryTable.h"
00020 #include "conv_layers/ConvergenceLayer.h"
00021 #include <oasys/util/StringBuffer.h>
00022
00023 namespace dtn {
00024
00025 DiscoveryCommand::DiscoveryCommand()
00026 : TclCommand("discovery")
00027 {
00028 add_to_help("add <discovery_name> <address_family> <port=N> "
00029 "[<addr=A.B.C.D> <local_addr=A.B.C.D> <multicast_ttl=N> "
00030 "<channel=N> <unicast=true|false>]",
00031 "add discovery agent (address family can be ip or bt "
00032 "[Bluetooth])");
00033 add_to_help("del <discovery_name>","remove discovery agent");
00034
00035 add_to_help("announce <cl_name> <discovery_name> <cl_type> "
00036 "<interval=N> [<cl_addr=A.B.C.D> <cl_port=N>]",
00037 "announce the address of a local interface (convergence "
00038 "layer)");
00039 add_to_help("remove <name>","remove announcement for local interface");
00040 add_to_help("list","list all discovery agents and announcements");
00041 }
00042
00043 int
00044 DiscoveryCommand::exec(int argc, const char** argv, Tcl_Interp* interp)
00045 {
00046 (void)interp;
00047 if (strncasecmp("list",argv[1],4) == 0)
00048 {
00049 if (argc > 2)
00050 {
00051 wrong_num_args(argc, argv, 1, 2, 2);
00052 }
00053
00054 oasys::StringBuffer buf;
00055 DiscoveryTable::instance()->dump(&buf);
00056 set_result(buf.c_str());
00057
00058 return TCL_OK;
00059 }
00060 else
00061
00062
00063 if (strncasecmp("add",argv[1],3) == 0)
00064 {
00065 if (argc < 4)
00066 {
00067 wrong_num_args(argc, argv, 2, 4, INT_MAX);
00068 return TCL_ERROR;
00069 }
00070
00071 const char* name = argv[2];
00072 const char* afname = argv[3];
00073
00074 if (! DiscoveryTable::instance()->add(name,afname,argc - 4,argv + 4))
00075 {
00076 resultf("error adding agent %s", name);
00077 return TCL_ERROR;
00078 }
00079 return TCL_OK;
00080 }
00081 else
00082
00083 if (strncasecmp("del",argv[1],3) == 0)
00084 {
00085 if (argc != 3)
00086 {
00087 wrong_num_args(argc,argv,2,3,3);
00088 return TCL_ERROR;
00089 }
00090
00091 const char* name = argv[2];
00092
00093 if (! DiscoveryTable::instance()->del(name))
00094 {
00095 resultf("error removing agent %s", name);
00096 return TCL_ERROR;
00097 }
00098
00099 return TCL_OK;
00100 }
00101
00102
00103 else
00104 if (strncasecmp("announce",argv[1],8) == 0)
00105 {
00106 if (argc < 6)
00107 {
00108 wrong_num_args(argc,argv,2,6,INT_MAX);
00109 return TCL_ERROR;
00110 }
00111
00112 const char* name = argv[2];
00113 const char* dname = argv[3];
00114
00115 DiscoveryList::iterator iter;
00116 if (! DiscoveryTable::instance()->find(dname,&iter))
00117 {
00118 resultf("error adding announce %s to %s: "
00119 "no such discovery agent",
00120 name,dname);
00121 return TCL_ERROR;
00122 }
00123
00124 Discovery* disc = *iter;
00125 if (! disc->announce(name,argc - 4,argv + 4))
00126 {
00127 resultf("error adding announce %s to %s",name,dname);
00128 return TCL_ERROR;
00129 }
00130 return TCL_OK;
00131 }
00132 else
00133
00134 if (strncasecmp("remove",argv[1],6) == 0)
00135 {
00136 if (argc != 4)
00137 {
00138 wrong_num_args(argc,argv,2,4,4);
00139 return TCL_ERROR;
00140 }
00141
00142 const char* name = argv[2];
00143 const char* dname = argv[3];
00144
00145 DiscoveryList::iterator iter;
00146 if (! DiscoveryTable::instance()->find(dname,&iter))
00147 {
00148 resultf("error removing announce %s from %s: no such discovery agent",
00149 name,dname);
00150 return TCL_ERROR;
00151 }
00152
00153 Discovery* disc = *iter;
00154 if (! disc->remove(name))
00155 {
00156 resultf("error removing announce %s from %s: no such announce",
00157 name,dname);
00158 return TCL_ERROR;
00159 }
00160 return TCL_OK;
00161 }
00162
00163 resultf("invalid discovery command: %s",argv[1]);
00164 return TCL_ERROR;
00165 }
00166
00167 }