diff options
author | Reyk Floeter <reyk@cvs.openbsd.org> | 2016-11-15 08:15:08 +0000 |
---|---|---|
committer | Reyk Floeter <reyk@cvs.openbsd.org> | 2016-11-15 08:15:08 +0000 |
commit | 30e35202c19e7e9e19578677d1bbca3dd554a285 (patch) | |
tree | 29f4120bff332b30bef3547d0f4d1634100bf3db /usr.sbin/switchctl/parser.c | |
parent | 96a2eb214016d7cb10507c1cdab290df415d2236 (diff) |
Add a simple openflow client to dump switch information. The
implementation re-uses the openflow code from switchd. Not finished
yet, but it is better to continue working on it in the tree. Later
versions will also include a way to add flows from the command line -
this is being worked on for switchd and some code of the
"ASCII-to-flow" parser will be shared here as well.
As discussed with and lightly tested by rzalamena@
Diffstat (limited to 'usr.sbin/switchctl/parser.c')
-rw-r--r-- | usr.sbin/switchctl/parser.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/usr.sbin/switchctl/parser.c b/usr.sbin/switchctl/parser.c index 39fa77414d0..57ced7b967e 100644 --- a/usr.sbin/switchctl/parser.c +++ b/usr.sbin/switchctl/parser.c @@ -1,4 +1,4 @@ -/* $OpenBSD: parser.c,v 1.3 2016/10/12 19:07:42 reyk Exp $ */ +/* $OpenBSD: parser.c,v 1.4 2016/11/15 08:15:07 reyk Exp $ */ /* * Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org> @@ -57,6 +57,7 @@ static const struct token t_reset[]; static const struct token t_log[]; static const struct token t_load[]; static const struct token t_show[]; +static const struct token t_dump[]; static const struct token t_connect[]; static const struct token t_disconnect[]; static const struct token t_forward_to[]; @@ -65,6 +66,7 @@ static const struct token t_uri[]; static const struct token t_main[] = { { KEYWORD, "connect", CONNECT, t_connect }, { KEYWORD, "disconnect", DISCONNECT, t_disconnect }, + { KEYWORD, "dump", NONE, t_dump }, { KEYWORD, "load", LOAD, t_load }, { KEYWORD, "log", NONE, t_log }, { KEYWORD, "monitor", MONITOR, NULL }, @@ -90,12 +92,21 @@ static const struct token t_load[] = { { ENDTOKEN, "", NONE, NULL } }; +static const struct token t_dump[] = { + { KEYWORD, "desc", DUMP_DESC, t_uri }, + { KEYWORD, "features", DUMP_FEATURES, t_uri }, + { KEYWORD, "flows", DUMP_FLOWS, t_uri }, + { KEYWORD, "tables", DUMP_TABLES, t_uri }, + { ENDTOKEN, "", NONE, NULL } +}; + static const struct token t_show[] = { { KEYWORD, "summary", SHOW_SUM, NULL }, { KEYWORD, "switches", SHOW_SWITCHES, NULL }, { KEYWORD, "macs", SHOW_MACS, NULL }, { ENDTOKEN, "", NONE, NULL } }; + static const struct token t_connect[] = { { ADDRESS, "", NONE, t_forward_to }, { ENDTOKEN, "", NONE, NULL } @@ -109,6 +120,7 @@ static const struct token t_forward_to[] = { { KEYWORD, "forward-to", NONE, t_uri }, { ENDTOKEN, "", NONE, NULL } }; + static const struct token t_uri[] = { { URI, "", NONE, NULL }, { ENDTOKEN, "", NONE, NULL } @@ -216,6 +228,7 @@ match_token(char *word, const struct token table[]) { unsigned int i, match = 0; const struct token *t = NULL; + size_t len; for (i = 0; table[i].type != ENDTOKEN; i++) { switch (table[i].type) { @@ -250,7 +263,24 @@ match_token(char *word, const struct token table[]) break; case URI: if (!match && word != NULL && strlen(word) > 0) { - res.uri = strdup(word); + len = 4; + if (strncmp(word, "tcp:", len) == 0) + res.uri.swa_type = SWITCH_CONN_TCP; + else if (strncmp(word, "tls:", len) == 0) + res.uri.swa_type = SWITCH_CONN_TLS; + else { + /* set the default */ + res.uri.swa_type = SWITCH_CONN_TCP; + len = 0; + } + if (parsehostport(word + len, + (struct sockaddr *)&res.uri.swa_addr, + sizeof(res.uri.swa_addr)) != 0) { + fprintf(stderr, + "could not parse address: %s\n", + word); + return (NULL); + } match++; t = &table[i]; } |