From: Ken-ichirou MATSUZAWA <chamaken@gmail.com>
To: The netfilter developer mailinglist <netfilter-devel@vger.kernel.org>
Cc: Eric Leblond <eric@regit.org>
Subject: [ulogd RFC PATCH 2/2] ip2str: introduce changable address separator
Date: Sat, 29 Mar 2014 13:29:15 +0900 [thread overview]
Message-ID: <20140329042915.GC22821@gmail.com> (raw)
In-Reply-To: <20140329042336.GA22821@gmail.com>
This patch make change address string separator by "v4sep" or "v6sep" in config
file, because graphite uses `.' as path separator and statsd uses `:' as path
and value separator. Now I am testing ulogd and statsd (actually statsite) using
ulogd config:
stack=ct1:NFCT,ip2str1:IP2STR,sprint:SPRINT
[ct1]
# in event mode, NF_NETLINK_CONNTRACK_DESTROY only
event_mask=4
[ip2str1]
v4sep="_"
v6sep="_"
[sprint]
form="myrouter.<orig.ip.daddr.str>.<orig.ip.protocol>.(<icmp.type>|<orig.l4.dport>|unknown).<orig.ip.saddr.str>:<orig.raw.pktlen> + <reply.raw.pktlen>\|kv\n"
proto="tcp"
dest="8125@192.168.1.1"
Signed-off-by: Ken-ichirou MATSUZAWA <chamas@h4.dion.ne.jp>
---
filter/ulogd_filter_IP2STR.c | 74 ++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 72 insertions(+), 2 deletions(-)
diff --git a/filter/ulogd_filter_IP2STR.c b/filter/ulogd_filter_IP2STR.c
index 732e1ef..774b9cf 100644
--- a/filter/ulogd_filter_IP2STR.c
+++ b/filter/ulogd_filter_IP2STR.c
@@ -137,10 +137,55 @@ static struct ulogd_key ip2str_keys[] = {
},
};
+enum ip2str_conf {
+ IP2STR_CONF_V6SEP = 0,
+ IP2STR_CONF_V4SEP,
+ IP2STR_CONF_MAX
+};
+
+static struct config_keyset ip2str_config_kset = {
+ .num_ces = 2,
+ .ces = {
+ [IP2STR_CONF_V6SEP] = {
+ .key = "v6sep",
+ .type = CONFIG_TYPE_STRING,
+ .options = CONFIG_OPT_NONE,
+ .u = {.string = ":"},
+ },
+ [IP2STR_CONF_V4SEP] = {
+ .key = "v4sep",
+ .type = CONFIG_TYPE_STRING,
+ .options = CONFIG_OPT_NONE,
+ .u = {.string = "."},
+ },
+ },
+};
+
+#define v6sep_ce(x) (x->ces[IP2STR_CONF_V6SEP])
+#define v4sep_ce(x) (x->ces[IP2STR_CONF_V4SEP])
+
static char ipstr_array[MAX_KEY-START_KEY][IPADDR_LENGTH];
-static int ip2str(struct ulogd_key *inp, int index, int oindex)
+void change_separator(char family, char *addr, char to)
{
+ char from;
+ char *cur;
+
+ switch(family) {
+ case AF_INET6: from = ':'; break;
+ case AF_INET: from = '.'; break;
+ default:
+ ulogd_log(ULOGD_NOTICE, "Unknown protocol family\n");
+ return;
+ }
+
+ for (cur = strchr(addr, from); cur != NULL; cur = strchr(cur + 1, from))
+ *cur = to;
+}
+
+static int ip2str(struct ulogd_pluginstance *upi, int index, int oindex)
+{
+ struct ulogd_key *inp = upi->input.keys;
char family = ikey_get_u8(&inp[KEY_OOB_FAMILY]);
char convfamily = family;
@@ -173,11 +218,17 @@ static int ip2str(struct ulogd_key *inp, int index, int oindex)
inet_ntop(AF_INET6,
ikey_get_u128(&inp[index]),
ipstr_array[oindex], sizeof(ipstr_array[oindex]));
+ if (*v6sep_ce(upi->config_kset).u.string != ':')
+ change_separator(convfamily, ipstr_array[oindex],
+ *v6sep_ce(upi->config_kset).u.string);
break;
case AF_INET:
ip = ikey_get_u32(&inp[index]);
inet_ntop(AF_INET, &ip,
ipstr_array[oindex], sizeof(ipstr_array[oindex]));
+ if (*v4sep_ce(upi->config_kset).u.string != '.')
+ change_separator(convfamily, ipstr_array[oindex],
+ *v4sep_ce(upi->config_kset).u.string);
break;
default:
/* TODO error handling */
@@ -197,7 +248,7 @@ static int interp_ip2str(struct ulogd_pluginstance *pi)
/* Iter on all addr fields */
for (i = START_KEY; i <= MAX_KEY; i++) {
if (pp_is_valid(inp, i)) {
- fret = ip2str(inp, i, i-START_KEY);
+ fret = ip2str(pi, i, i-START_KEY);
if (fret != ULOGD_IRET_OK)
return fret;
okey_set_ptr(&ret[i-START_KEY],
@@ -208,6 +259,23 @@ static int interp_ip2str(struct ulogd_pluginstance *pi)
return ULOGD_IRET_OK;
}
+static int configure_ip2str(struct ulogd_pluginstance *upi,
+ struct ulogd_pluginstance_stack *stack)
+{
+ int ret = config_parse_file(upi->id, upi->config_kset);
+
+ if (ret < 0)
+ return ret;
+
+ if (strlen(v6sep_ce(upi->config_kset).u.string) > 1)
+ ulogd_log(ULOGD_NOTICE, "only one char v6 separator is allowed,"
+ " using: %c\n", *v6sep_ce(upi->config_kset).u.string);
+ if (strlen(v4sep_ce(upi->config_kset).u.string) > 1)
+ ulogd_log(ULOGD_NOTICE, "only one char v4 separator is allowed,"
+ " using: %c\n", *v4sep_ce(upi->config_kset).u.string);
+ return ret;
+}
+
static struct ulogd_plugin ip2str_pluging = {
.name = "IP2STR",
.input = {
@@ -220,7 +288,9 @@ static struct ulogd_plugin ip2str_pluging = {
.num_keys = ARRAY_SIZE(ip2str_keys),
.type = ULOGD_DTYPE_PACKET | ULOGD_DTYPE_FLOW,
},
+ .config_kset = &ip2str_config_kset,
.interp = &interp_ip2str,
+ .configure = &configure_ip2str,
.version = VERSION,
};
--
1.8.5.3
next prev parent reply other threads:[~2014-03-29 4:29 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-29 4:23 [ulogd RFC PATCH 0/2] introduce new string output plugin Ken-ichirou MATSUZAWA
2014-03-29 4:27 ` [ulogd RFC PATCH 1/2] sprint: introduce new " Ken-ichirou MATSUZAWA
2014-03-31 21:06 ` Eric Leblond
2014-03-29 4:29 ` Ken-ichirou MATSUZAWA [this message]
2014-03-31 20:17 ` [ulogd RFC PATCH 2/2] ip2str: introduce changable address separator Eric Leblond
2014-03-31 20:51 ` [ulogd RFC PATCH 0/2] introduce new string output plugin Eric Leblond
2014-04-02 10:14 ` Ken-ichirou MATSUZAWA
2014-04-21 9:05 ` Eric Leblond
2014-04-22 11:51 ` [ulogd RFC PATCH 0/2 resend] " Ken-ichirou MATSUZAWA
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140329042915.GC22821@gmail.com \
--to=chamaken@gmail.com \
--cc=eric@regit.org \
--cc=netfilter-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).