⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mn_tool.c

📁 mobile ip 在linux下的一种实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $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 + -