apps/tca_admin/tca_admin.cc
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/tca_admin/tca_admin.cc	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,200 @@
+/*
+ *    Copyright 2005-2006 University of Waterloo
+ * 
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ * 
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <dtn-config.h>
+#endif
+
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+#include <string>
+#include <oasys/debug/Log.h>
+
+#include "dtn_api.h"
+#include "TcaController.h"
+
+static const int debug = 1;
+
+static const int MAX_TTL = 604800;      // 604800 seconds == 1 week
+
+// parsed from command line args
+static const char* progname;
+static std::string node_type = "mobile";
+static bool tidy = false;           // discard pending bundles on startup
+static std::string link_id;         // published link id of node
+static std::string ask_addr;        // clayer address to send ask to
+static std::string adv_string;      // published adv string
+static int registry_ttl = MAX_TTL;  // registry entry ttl
+static int control_ttl = MAX_TTL;   // control bundle ttl
+
+
+static TcaController::Role  role = TcaController::TCA_MOBILE;
+
+
+void
+print_usage()
+{
+    fprintf(stderr, "usage: %s [opts]\n"
+            "options:\n"
+            " -h help\n"
+            " -n <node_type: mobile | router | gateway> (default = mobile)\n"
+            " -l <link_addr> local contact addr (required for gateway only)\n"
+            " -a <link_addr> send ask on startup\n"
+            " -d <adv_string> string to send in response to ASK\n"
+            " -r <time in seconds> TTL for Registry entries (default = 604800)\n"
+            " -e <time in seconds> control bundle expiration time (default = 604800)\n"
+            " -t tidy (discard pending bundles on startup)\n",
+           progname);
+    fprintf(stderr, "usage: %s [-h] -t <node_type: mobile | router |"
+            " gateway>\n", progname);
+    exit(1);
+}
+
+
+void
+parse_options(int argc, const char **argv)
+{
+    bool done = false;
+    int c;
+
+    progname = argv[0];
+
+    while (!done)
+    {
+        c = getopt(argc, (char **) argv, "htn:l:a:d:r:e:");
+
+        switch (c)
+        {
+        case 'h':
+            print_usage();
+            exit(0);
+            break;
+        case 't':
+            tidy = true;
+            break;
+        case 'n':
+            {
+                node_type = optarg;
+                if (node_type == "mobile")
+                    role = TcaController::TCA_MOBILE;
+                else if (node_type == "router")
+                    role = TcaController::TCA_ROUTER;
+                else if (node_type == "gateway")
+                    role = TcaController::TCA_GATEWAY;
+                else
+                    fprintf(stderr, "unknown node type '%s'\n",
+                            node_type.c_str());
+            }
+            break;
+        case 'l':
+            link_id = optarg;
+            break;
+        case 'a':
+            ask_addr = optarg;
+            // TODO: some syntax checking would be a nice idea
+            break;
+        case 'd':
+            adv_string = optarg;
+            // TODO: some syntax checking would be a nice idea
+            break;
+        case 'r':
+            {
+                int n = atoi(optarg);
+                if (n<=0 || n >MAX_TTL)
+                {
+                    fprintf(stderr, "registry TTL out of range (1..%d)\n",
+                            MAX_TTL);
+                    registry_ttl = MAX_TTL;
+                }
+                else
+                {
+                    registry_ttl = n;
+                }
+            }
+            break;
+        case 'e':
+             {
+                int n = atoi(optarg);
+                if (n<=0 || n >MAX_TTL)
+                {
+                    fprintf(stderr, "control bundle TTL out of range (1..%d)\n",
+                            MAX_TTL);
+                    control_ttl = MAX_TTL;
+                }
+                else
+                {
+                    control_ttl = n;
+                }
+            }
+            break;
+        case -1:
+            done = true;
+            break;
+        default:
+            print_usage();
+            break;
+        }
+    }
+
+    if (optind < argc)
+    {
+        fprintf(stderr, "unsupported argument '%s'\n", argv[optind]);
+        exit(1);
+    }
+
+    // echo args
+    printf("using options:\n");
+    printf("    node_type = '%s'\n", node_type.c_str());
+    printf("    link_id = '%s'\n", link_id.c_str());
+    printf("    ask_addr = '%s'\n", ask_addr.c_str());
+    printf("    adv_string = '%s'\n", adv_string.c_str());
+    printf("    registry_ttl = %d\n", registry_ttl);
+    printf("    control_ttl = %d\n", control_ttl);
+    if (tidy) printf("    tidy = true\n");
+    else printf("    tidy = false\n");
+
+}
+
+
+// main
+int
+main(int argc, const char** argv)
+{
+    oasys::Log::init("-", oasys::LOG_NOTICE, "", "~/.tcadebug");
+    log_notice_p("/tca/admin", "tca_admin starting up");
+    
+    parse_options(argc, argv);
+
+    TcaController controller(role, link_id, ask_addr, adv_string,
+                        registry_ttl, control_ttl);
+
+    if (!controller.init(tidy))
+    {
+        exit(1);
+    }
+
+    controller.run();
+
+    return 0;
+}
+
+
+