📄 mn_tool.c
字号:
/* $Id: mn_tool.c,v 1.55 2001/07/11 15:12:45 jm Exp $ * Mobile Node Configuration Tool implemetation file * * Dynamic hierarchial IP tunnel * Copyright (C) 1998-2001, Dynamics group * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. See README and COPYING for * more details. */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <stdio.h>#include <stdlib.h>#ifndef __USE_BSD#define __USE_BSD /* Add strncasecmp() etc. */#endif#include <string.h>#include <sys/time.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#ifdef DYN_TARGET_LINUX#include <values.h>#endif#include <time.h>#ifdef DYN_TARGET_WINDOWS#include "windows_extra.h"#endif#include "dyn_mnlib.h"#include "support_tool.h"#include "util.h"#define BUFLEN 1024#define PATH_SIZE 100#define DEFAULT_PATH SOCKETDIR "/dynamics_mn_admin"#define HELP_CAREOF "Usage\n\tcareof\n" \"Description\n\tGet current careof address for the mobile.\n"#define HELP_STATUS "Usage\n\tstatus [interval]\n" \"Description\n\tRetrieve agents status information.\n"\"\tIf interval is specified, command is run in monitoring mode and "\"interval specifies time between successive calls in seconds."\"To stop monitoring press CTRL-C.\n"#define HELP_CONNECT "Usage\n\ttunnel [mode]\n\tconnect [mode]\n" \"Description\n\tStart tunneling packets using Dynamics tunneling system.\n" \"Modes for tunneling are:\n"\"\t\t 0 - no tunnel\n"\"\t\t 1 - full tunnel\n"\"\t\t 2 - triangle tunnel\n"\"\t\t HA - connect directly to the Home Agent with mode 1\n"\"Default mode for tunneling is full tunnel.\n"#define HELP_DISC "Usage\n\tdisconnect\n" \"Description\n\tDisconnect from tunneling system.\n"#define HELP_LOCUPD "Usage\n\tupdate [block] <new-address>" \" | update [block] <interface> | update [block]\n" \"Description\n\tPerform location update and " \"start using [address <new-address> |\n\taddress of <interface> | address of" \" default interface] as co-located address.\n"#define HELP_CONFIRM "Usage\n\tconfirm\n" \"Description\n\tSend tunnel refreshing message."#define HELP_PATH "Usage\n\tpath <api path>\n" \"Description\n\tSet path to agent interface socket.\n" \"Example: path /etc/dynamics_mn_admin\n"#define HELP_FORCEFA "Usage\n\tforce [<fa-addr>]\n" \"Description\n\tForces MN to select specified FA for tunneling.\n" \"\tIf set to 0.0.0.0 (or no argument), force is\n\tremoved.\n" \"Example: force 10.2.3.4\n"#define HELP_LIST "Usage\n\tlist\n" \"Description\n\tLists heard FAs\n"#define HELP_SHOW "Usage\n\tshow <fa-addr> <interface>\n" \"Description\n\tShows detailed information about the FA\n"#define HELP_WIRELESS "Usage\n\twireless <command> [<options> ..]\n" \"\nDescription\n\tWireless extensions api interface. Command(s):\n\n\t"\"channel [<interface> <channel>]\n\n\tDescription\n\t\tWith "\"no arguments current"\" channel(s) are shown.\n\t\t<interface> is the wireless interface and"\" <channel> is\n\t\tthe channel number we want to set the"\" wireless\n\t\tinterface to use.\n"\"\tExample: wireless channel eth0 3\n"#define HELP_RESCAN "Usage\n\t rescan\n"\"\nDescription\n\tDetects new and removed interfaces.\n"#define HELP_REGISTER "Usage\n\tregister <device info socket path>\n"#define HELP_POLICY "Usage\n\tpolicy [<policy> on|off]\n"#define HELP_MONITOR "Usage\n\tmonitor [<variable> [<value>]]\n"struct tool_cmd_completion cmd_wireless_completion[] = { { "channel", NULL }, { NULL, NULL } };struct tool_cmd_completion cmd_boolean_completion[] = { { "on", NULL }, { "off", NULL }, { NULL, NULL } };struct tool_cmd_completion cmd_policy_completion[] = { { "Early-expire", cmd_boolean_completion }, { "Newest-FA", cmd_boolean_completion }, { "Eager-switching", cmd_boolean_completion }, { "Newest-ADV", cmd_boolean_completion }, { NULL, NULL } };void cmd_getcoaddr(int argc, char *argv[]);void cmd_getmode(int argc, char *argv[]);void cmd_getstatus(int argc, char *argv[]);void cmd_connect(int argc, char *argv[]);void cmd_disconnect(int argc, char *argv[]);void cmd_locupd(int argc, char *argv[]);void cmd_confirm(int argc, char *argv[]);void cmd_path(int argc, char *argv[]);void cmd_force(int argc, char *argv[]);void cmd_list(int argc, char *argv[]);void cmd_show(int argc, char *argv[]);void cmd_wireless(int argc, char *argv[]);void cmd_rescan(int argc, char *argv[]);void cmd_register(int argc, char *argv[]);void cmd_policy(int argc, char *argv[]);void cmd_monitor(int argc, char *argv[]);extern int interactive;#define MAX_NUM_FA 64int main(int argc, char *argv[]){ int i; char agent_path[PATH_SIZE]; dynamics_strlcpy(agent_path, DEFAULT_PATH, PATH_SIZE); tool_add_command("update", 3, cmd_locupd, HELP_LOCUPD, NULL); tool_add_command("tunnel", 3, cmd_connect, HELP_CONNECT, NULL); tool_add_command("connect", 3, cmd_connect, HELP_CONNECT, NULL); tool_add_command("status", 1, cmd_getstatus, HELP_STATUS, NULL); tool_add_command("disconnect", 3, cmd_disconnect, HELP_DISC, NULL); tool_add_command("careof", 2, cmd_getcoaddr, HELP_CAREOF, NULL); tool_add_command("confirm", 4, cmd_confirm, HELP_CONFIRM, NULL); tool_add_command("path", 4, cmd_path, HELP_PATH, NULL); tool_add_command("force", 5, cmd_force, HELP_FORCEFA, NULL); tool_add_command("list", 1, cmd_list, HELP_LIST, NULL); tool_add_command("show", 2, cmd_show, HELP_SHOW, NULL); tool_add_command("wireless", 1, cmd_wireless, HELP_WIRELESS, cmd_wireless_completion); tool_add_command("rescan", 3, cmd_rescan, HELP_RESCAN, NULL); tool_add_command("register", 3, cmd_register, HELP_REGISTER, NULL); tool_add_command("policy", 1, cmd_policy, HELP_POLICY, cmd_policy_completion); tool_add_command("monitor", 1, cmd_monitor, HELP_MONITOR, NULL); i = parse_long_options_tools(argc, argv, "Dynamics Mobile Agent Control Tool", agent_path, PATH_SIZE, PACKAGE, VERSION); dynamics_mn_init(agent_path); if (interactive) { printf("Dynamics Mobile Agent Control Tool v%s\n", VERSION); printf("Using agent path \"%s\" \n", agent_path); } return tool_main(argc - i , argv + i);}/*********************************************************************** * COMMAND HANDLERS * * These functions are callback functions, which tool_main calls * * when user executes a command. Commands arguments are passed * * in parameters. argc specifies count of aruments and argv is pointer * * to string array containing the actual argument strings. * * first argument is always commands invocation. It may be an * * abbreviation. * ***********************************************************************/void cmd_getcoaddr(int argc, char *argv[]){ struct in_addr addr; int r; r = dynamics_mn_get_care_of_addr(&addr, -1); if (r == API_SUCCESS) printf("Care-of address: %s\n", inet_ntoa(addr)); else { printf("Call failed: %s\n", dynamics_mn_get_error_string(r)); }}void cmd_getmode(int argc, char *argv[]){ int r,i; r = dynamics_mn_get_tunneling_mode(&i, -1); if (r == API_SUCCESS) { printf("Tunneling mode: "); switch (i) { case API_TUNNEL_NONE: printf("none"); break; case API_TUNNEL_FULL: printf("full"); break; case API_TUNNEL_TRIANGLE: printf("triangle"); break; case API_TUNNEL_FULL_HA: printf("full directly to HA"); break; default: printf("unknown mode %i", i); } printf("\n"); } else printf("Call failed: %s\n", dynamics_mn_get_error_string(r));}void cmd_getstatus(int argc, char *argv[]){ int r; struct dynamics_mobile_status status; time_t current_time; if (argc == 2 && (r = atoi(argv[1])) > 0) { tool_monitor(argv[0], r); } r = dynamics_mn_get_status(&status, -1); if (r == API_SUCCESS) { current_time = time(NULL); printf("Mobile status:\n"); printf("\tstate \t%s\n", status.state_str); printf("\tlocal addr\t%s\n", inet_ntoa(status.local_addr)); printf("\tco-addr \t%s\n", inet_ntoa(status.co_addr)); printf("\tFA-addr \t%s\n", inet_ntoa(status.fa_addr)); printf("\tHA-addr \t%s\n", inet_ntoa(status.ha_addr)); printf("\tHome addr \t%s\n", inet_ntoa(status.home_addr)); if (status.tunnel_up) { printf("\ttunnel is \tup\n"); printf("\tlifetime left\t%ds\n", status.lifetime); } else printf("\ttunnel is \tdown\n"); printf("\ttunneling mode\t%s\n", dynamics_mn_tunnel_mode_desc(status.tunnel_mode)); if (status.last_request_sent != 0) printf("\tlast request\t%ds ago; %s ", (int)(current_time - status.last_request_sent), ctime(&status.last_request_sent)); if (status.last_reply_rcvd != 0) { printf("\tlast reply\t%ds ago; %s", (int)(current_time - status.last_reply_rcvd), ctime(&status.last_reply_rcvd)); printf("\treply code\t%i - %s\n", status.last_reply_code, reply_code_str(status.last_reply_code)); } if (status.info_str[0] != '\0') { status.info_str[API_INFO_LEN] = '\0'; printf("\tinfo text\t%s\n", status.info_str); } if (status.warn_str[0] != '\0') { status.warn_str[API_INFO_LEN] = '\0'; printf("\tlast warning\t%s\n", status.warn_str); } printf("\tactive devices\t%i\n", status.device_count); printf("\tdiscarded msgs\t%li\n", status.discarded_msgs); } else printf("Call failed: %s\n", dynamics_mn_get_error_string(r));}void cmd_connect(int argc, char *argv[]){ int r, mode; mode = API_TUNNEL_FULL; if (argc == 2) { r = atoi(argv[1]); if (r > 0) mode = r; else if (strcmp("HA", argv[1]) == 0) mode = API_TUNNEL_FULL_HA; } r = dynamics_mn_connect(mode, -1); if (r == API_SUCCESS) printf("Connect success.\n"); else printf("Call failed: %s\n", dynamics_mn_get_error_string(r));}void cmd_disconnect(int argc, char *argv[]){ int r; r = dynamics_mn_disconnect(-1); if (r == API_SUCCESS) printf("Disconnected\n"); else printf("Call failed: %s\n", dynamics_mn_get_error_string(r));}void cmd_locupd(int argc, char *argv[]){ int r, pos, block; struct in_addr addr; pos = 1; block = 0; if (argc > 1 && strcmp(argv[1], "block") == 0) { block = 1; pos = 2; printf("Blocking call\n"); } else if (argc > 2) { printf("Invalid arguments. Usage example " "'update 10.11.12.13'\n"); return; } if (argc <= pos) { printf("Trying to use the default interface address.\n"); if (!block) r = dynamics_mn_update_location_dev(NULL, -1); else r = dynamics_mn_update_location_dev_block(NULL, -1); } else if (inet_aton(argv[pos], &addr) != 0) { if (!block) r = dynamics_mn_update_location(&addr, -1); else r = dynamics_mn_update_location_block(&addr, -1); } else { printf("Trying to use the address of the interface %s\n", argv[pos]); if (!block) r = dynamics_mn_update_location_dev(argv[pos], -1); else r = dynamics_mn_update_location_dev_block(argv[pos],
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -