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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.