X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/c03782046a6436da4bdce706318b95905fc99455..dbcad5e95606e5cb5289ebfa0bce8392c6270ad8:/cli.c diff --git a/cli.c b/cli.c index 52397f9..34038ef 100644 --- a/cli.c +++ b/cli.c @@ -2,9 +2,10 @@ // vim: sw=8 ts=8 char const *cvs_name = "$Name: $"; -char const *cvs_id_cli = "$Id: cli.c,v 1.59 2005/06/02 03:52:46 bodea Exp $"; +char const *cvs_id_cli = "$Id: cli.c,v 1.68 2005/11/14 20:19:08 bodea Exp $"; #include +#include #include #include #include @@ -25,6 +26,7 @@ char const *cvs_id_cli = "$Id: cli.c,v 1.59 2005/06/02 03:52:46 bodea Exp $"; #include #include "l2tpns.h" +#include "constants.h" #include "util.h" #include "cluster.h" #include "tbf.h" @@ -49,15 +51,6 @@ extern struct cli_tunnel_actions *cli_tunnel_actions; extern tbft *filter_list; extern ip_filtert *ip_filters; -static char *debug_levels[] = { - "CRIT", - "ERROR", - "WARN", - "INFO", - "CALL", - "DATA", -}; - struct { char critical; @@ -68,15 +61,24 @@ struct char data; } debug_flags; -static int debug_session; -static int debug_tunnel; +#ifdef RINGBUFFER + static int debug_rb_tail; +static char *debug_levels[] = { + "CRIT", + "ERROR", + "WARN", + "INFO", + "CALL", + "DATA", +}; + +#endif static int cmd_show_session(struct cli_def *cli, char *command, char **argv, int argc); static int cmd_show_tunnels(struct cli_def *cli, char *command, char **argv, int argc); static int cmd_show_users(struct cli_def *cli, char *command, char **argv, int argc); static int cmd_show_radius(struct cli_def *cli, char *command, char **argv, int argc); -static int cmd_show_counters(struct cli_def *cli, char *command, char **argv, int argc); static int cmd_show_version(struct cli_def *cli, char *command, char **argv, int argc); static int cmd_show_pool(struct cli_def *cli, char *command, char **argv, int argc); static int cmd_show_run(struct cli_def *cli, char *command, char **argv, int argc); @@ -84,7 +86,6 @@ static int cmd_show_banana(struct cli_def *cli, char *command, char **argv, int static int cmd_show_plugins(struct cli_def *cli, char *command, char **argv, int argc); static int cmd_show_throttle(struct cli_def *cli, char *command, char **argv, int argc); static int cmd_write_memory(struct cli_def *cli, char *command, char **argv, int argc); -static int cmd_clear_counters(struct cli_def *cli, char *command, char **argv, int argc); static int cmd_drop_user(struct cli_def *cli, char *command, char **argv, int argc); static int cmd_drop_tunnel(struct cli_def *cli, char *command, char **argv, int argc); static int cmd_drop_session(struct cli_def *cli, char *command, char **argv, int argc); @@ -102,6 +103,11 @@ static int cmd_uptime(struct cli_def *cli, char *command, char **argv, int argc) static int regular_stuff(struct cli_def *cli); static void parsemac(char *string, char mac[6]); +#ifdef STATISTICS +static int cmd_show_counters(struct cli_def *cli, char *command, char **argv, int argc); +static int cmd_clear_counters(struct cli_def *cli, char *command, char **argv, int argc); +#endif /* STATISTICS */ + #ifdef BGP #define MODE_CONFIG_BGP 8 static int cmd_router_bgp(struct cli_def *cli, char *command, char **argv, int argc); @@ -285,10 +291,10 @@ void cli_do(int sockfd) { int require_auth = 1; struct sockaddr_in addr; - int l = sizeof(addr); + socklen_t l = sizeof(addr); if (fork_and_close()) return; - if (getpeername(sockfd, (struct sockaddr *)&addr, &l) == 0) + if (getpeername(sockfd, (struct sockaddr *) &addr, &l) == 0) { require_auth = addr.sin_addr.s_addr != inet_addr("127.0.0.1"); LOG(require_auth ? 3 : 4, 0, 0, "Accepted connection to CLI from %s\n", @@ -312,8 +318,6 @@ void cli_do(int sockfd) cli->users = 0; } - debug_session = 0; - debug_tunnel = 0; #ifdef RINGBUFFER debug_rb_tail = ringbuffer->tail; #endif @@ -405,13 +409,26 @@ static int cmd_show_session(struct cli_def *cli, char *command, char **argv, int cli_print(cli, "\tCalling Num:\t%s", session[s].calling); cli_print(cli, "\tCalled Num:\t%s", session[s].called); cli_print(cli, "\tTunnel ID:\t%d", session[s].tunnel); + cli_print(cli, "\tPPP Phase:\t%s", ppp_phase(session[s].ppp.phase)); + switch (session[s].ppp.phase) + { + case Establish: + cli_print(cli, "\t LCP state:\t%s", ppp_state(session[s].ppp.lcp)); + break; + + case Authenticate: + case Network: + cli_print(cli, "\t IPCP state:\t%s", ppp_state(session[s].ppp.ipcp)); + cli_print(cli, "\t IPV6CP state:\t%s", ppp_state(session[s].ppp.ipv6cp)); + cli_print(cli, "\t CCP state:\t%s", ppp_state(session[s].ppp.ccp)); + } cli_print(cli, "\tIP address:\t%s", fmtaddr(htonl(session[s].ip), 0)); cli_print(cli, "\tUnique SID:\t%u", session[s].unique_id); - cli_print(cli, "\tOpened:\t\t%u seconds", abs(time_now - session[s].opened)); - cli_print(cli, "\tIdle time:\t%u seconds", abs(time_now - session[s].last_packet)); + cli_print(cli, "\tOpened:\t\t%u seconds", session[s].opened ? abs(time_now - session[s].opened) : 0); + cli_print(cli, "\tIdle time:\t%u seconds", session[s].last_packet ? abs(time_now - session[s].last_packet) : 0); cli_print(cli, "\tNext Recv:\t%u", session[s].nr); cli_print(cli, "\tNext Send:\t%u", session[s].ns); - cli_print(cli, "\tBytes In/Out:\t%u/%u", session[s].total_cout, session[s].total_cin); + cli_print(cli, "\tBytes In/Out:\t%u/%u", session[s].cout, session[s].cin); cli_print(cli, "\tPkts In/Out:\t%u/%u", session[s].pout, session[s].pin); cli_print(cli, "\tMRU:\t\t%d", session[s].mru); cli_print(cli, "\tRx Speed:\t%u", session[s].rx_connect_speed); @@ -505,10 +522,10 @@ static int cmd_show_session(struct cli_def *cli, char *command, char **argv, int (session[i].snoop_ip && session[i].snoop_port) ? "Y" : "N", (session[i].throttle_in || session[i].throttle_out) ? "Y" : "N", (session[i].walled_garden) ? "Y" : "N", - (session[i].flags & SF_IPV6CP_ACKED) ? "Y" : "N", + (session[i].ppp.ipv6cp == Opened) ? "Y" : "N", abs(time_now - (unsigned long)session[i].opened), - (unsigned long)session[i].total_cout, - (unsigned long)session[i].total_cin, + (unsigned long)session[i].cout, + (unsigned long)session[i].cin, abs(time_now - (session[i].last_packet ? session[i].last_packet : time_now)), fmtaddr(htonl(tunnel[ session[i].tunnel ].ip), 1), session[i].calling[0] ? session[i].calling : "*"); @@ -646,6 +663,7 @@ static int cmd_show_users(struct cli_def *cli, char *command, char **argv, int a return CLI_OK; } +#ifdef STATISTICS static int cmd_show_counters(struct cli_def *cli, char *command, char **argv, int argc) { if (CLI_HELP_REQUESTED) @@ -697,7 +715,7 @@ static int cmd_show_counters(struct cli_def *cli, char *command, char **argv, in cli_print(cli, "%-30s%u", "multi_read_exceeded", GET_STAT(multi_read_exceeded)); -#ifdef STATISTICS +#ifdef STAT_CALLS cli_print(cli, "\n%-30s%-10s", "Counter", "Value"); cli_print(cli, "-----------------------------------------"); cli_print(cli, "%-30s%u", "call_processtun", GET_STAT(call_processtun)); @@ -731,7 +749,7 @@ static int cmd_show_counters(struct cli_def *cli, char *command, char **argv, in cli_print(cli, "%-30s%u", "call_radiussend", GET_STAT(call_radiussend)); cli_print(cli, "%-30s%u", "call_radiusretry", GET_STAT(call_radiusretry)); cli_print(cli, "%-30s%u", "call_random_data", GET_STAT(call_random_data)); -#endif +#endif /* STAT_CALLS */ { time_t l = GET_STAT(last_reset); @@ -746,6 +764,19 @@ static int cmd_show_counters(struct cli_def *cli, char *command, char **argv, in return CLI_OK; } +static int cmd_clear_counters(struct cli_def *cli, char *command, char **argv, int argc) +{ + if (CLI_HELP_REQUESTED) + return CLI_HELP_NO_ARGS; + + memset(_statistics, 0, sizeof(struct Tstats)); + SET_STAT(last_reset, time(NULL)); + + cli_print(cli, "Counters cleared"); + return CLI_OK; +} +#endif /* STATISTICS */ + static int cmd_show_version(struct cli_def *cli, char *command, char **argv, int argc) { int tag = 0; @@ -800,7 +831,6 @@ static int cmd_show_version(struct cli_def *cli, char *command, char **argv, int cli_print(cli, " %s", cvs_id_icmp); cli_print(cli, " %s", cvs_id_l2tpns); cli_print(cli, " %s", cvs_id_ll); - cli_print(cli, " %s", cvs_id_md5); cli_print(cli, " %s", cvs_id_ppp); cli_print(cli, " %s", cvs_id_radius); cli_print(cli, " %s", cvs_id_tbf); @@ -1134,18 +1164,6 @@ static int cmd_show_banana(struct cli_def *cli, char *command, char **argv, int return CLI_OK; } -static int cmd_clear_counters(struct cli_def *cli, char *command, char **argv, int argc) -{ - if (CLI_HELP_REQUESTED) - return CLI_HELP_NO_ARGS; - - memset(_statistics, 0, sizeof(struct Tstats)); - SET_STAT(last_reset, time(NULL)); - - cli_print(cli, "Counters cleared"); - return CLI_OK; -} - static int cmd_drop_user(struct cli_def *cli, char *command, char **argv, int argc) { int i; @@ -1896,10 +1914,10 @@ static int cmd_set(struct cli_def *cli, char *command, char **argv, int argc) int regular_stuff(struct cli_def *cli) { +#ifdef RINGBUFFER int out = 0; int i; -#ifdef RINGBUFFER for (i = debug_rb_tail; i != ringbuffer->tail; i = (i + 1) % RINGBUFFER_SIZE) { char *m = ringbuffer->buffer[i].message; @@ -1921,7 +1939,7 @@ int regular_stuff(struct cli_def *cli) if (!show) continue; if (!(p = strchr(m, '\n'))) - p = m + strlen(p); + p = m + strlen(m); cli_error(cli, "\r%s-%u-%u %.*s", debug_levels[(int)ringbuffer->buffer[i].level], @@ -2312,17 +2330,6 @@ static int cmd_restart_bgp(struct cli_def *cli, char *command, char **argv, int #endif /* BGP*/ static int filt; -static int find_access_list(char const *name) -{ - int i; - - for (i = 0; i < MAXFILTER; i++) - if (!(*ip_filters[i].name && strcmp(ip_filters[i].name, name))) - return i; - - return -1; -} - static int access_list(struct cli_def *cli, char **argv, int argc, int add) { int extended; @@ -2373,7 +2380,7 @@ static int access_list(struct cli_def *cli, char **argv, int argc, int add) return CLI_OK; } - filt = find_access_list(argv[1]); + filt = find_filter(argv[1], strlen(argv[1])); if (add) { if (filt < 0) @@ -2878,7 +2885,7 @@ static int cmd_ip_access_list_rule(struct cli_def *cli, char *command, char **ar return CLI_OK; } - if (!memcmp(&ip_filters[filt].rules[i], rule, sizeof(*rule))) + if (!memcmp(&ip_filters[filt].rules[i], rule, offsetof(ip_filter_rulet, counter))) return CLI_OK; } @@ -2966,7 +2973,7 @@ static int cmd_filter(struct cli_def *cli, char *command, char **argv, int argc) return CLI_OK; } - v = find_access_list(argv[i+1]); + v = find_filter(argv[i+1], strlen(argv[i+1])); if (v < 0 || !*ip_filters[v].name) { cli_error(cli, "Access-list %s not defined", argv[i+1]); @@ -3042,7 +3049,7 @@ static int cmd_show_access_list(struct cli_def *cli, char *command, char **argv, for (i = 0; i < argc; i++) { - int f = find_access_list(argv[i]); + int f = find_filter(argv[i], strlen(argv[i])); ip_filter_rulet *rules; if (f < 0 || !*ip_filters[f].name) @@ -3062,7 +3069,7 @@ static int cmd_show_access_list(struct cli_def *cli, char *command, char **argv, { char const *r = show_access_list_rule(ip_filters[f].extended, rules); if (rules->counter) - cli_print(cli, "%s (%d match%s)", r, + cli_print(cli, "%s (%u match%s)", r, rules->counter, rules->counter > 1 ? "es" : ""); else cli_print(cli, "%s", r);