From patchwork Thu May 13 14:02:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Sarmanow X-Patchwork-Id: 18319 X-Patchwork-Delegate: sw@simonwunderlich.de Return-Path: X-Original-To: patchwork@open-mesh.org Delivered-To: patchwork@open-mesh.org Received: from diktynna.open-mesh.org (localhost [IPv6:::1]) by diktynna.open-mesh.org (Postfix) with ESMTP id 33A0983EEC; Thu, 13 May 2021 16:08:56 +0200 (CEST) Received: from mail-ed1-x52c.google.com (mail-ed1-x52c.google.com [IPv6:2a00:1450:4864:20::52c]) by diktynna.open-mesh.org (Postfix) with ESMTPS id 4FA09814E7 for ; Thu, 13 May 2021 16:08:53 +0200 (CEST) Received: by mail-ed1-x52c.google.com with SMTP id df21so3894638edb.3 for ; Thu, 13 May 2021 07:08:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kwbYuvNj6n/qWGnAbzLtp0c60PCixsNe0mcYa6/xWkI=; b=MbNOnZW5+WyY+LsyrVjwfBlnjrXHhWbHx4oa3u+/SsSMc7qVIF/Dzz0j7su33CQ+8Q GHbi63YtHKyoRNbW+rzT8xkkUX9QhrCyCIApQwaFiVKow+sIPeANm0kmsDzSh1mNk44A TcoYLiBLFrcwxpyBKtF4ajLowf+ZFoYpk9yJ3Mp1Q3+2O/7MdKrREd3kIkz+5UaZrssn xsw6vkHZvEyOBtn85J3RbSlLCKwQ4bknxXwbJkKkyCSBlU/P4nJ1TmsnSTcUq6TAxcJS 7oXAgV5z4BTYJK6Rc912Ut6otHjCLiZ/e91mSAKu8CmsJm6hDSeTU16H1/KvX4dODa08 ivVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kwbYuvNj6n/qWGnAbzLtp0c60PCixsNe0mcYa6/xWkI=; b=tJEJ8JzjBRzVfpA5HBdnMI2mUT7hrezbP2DgSuNHsAAKmq+jsBzgS4F7AabN7py04P 3b59Bx7Z/lvxm9C6XDN3Cr1NAgDLZMo/oI/e1X+LR7HQYbSE7zK7uI/rbZlMunx5WGmW W4mz9LFa8EZm+AKInKxH4HSQb2OpOjdDcb6CGr/tk4xaWHQmiwglU0yRKISVD2/VpnY5 W0weKllNwxtTyzy5StkPveunDjIkociASvh3+FjWqgPSOOJR9TSpBwmw2Dy6TpoUyfZZ iz1DTRNLV4tGFETvNoyl6f0Rhfh+CR25OjZrQfOvr1+NvJo+DtuPy9zwx8lWkhmIEiEB WALQ== X-Gm-Message-State: AOAM531hZgfbq7OlAiyFzUzb1zYcFJpnkxtka3/tFZQ1CIKrMmenRtN5 rJyeMvuHDIXNiej5r3o8/69f1PWCS6FPu6ZoZNA= X-Google-Smtp-Source: ABdhPJz+Sv3AwUz85Cv/ximCYZoE6T7n0NWpKTw2gLKx8PYregmjB5iVFXATc+9JvYy+J/5Y5l6IjA== X-Received: by 2002:a17:906:1cc3:: with SMTP id i3mr1033044ejh.87.1620914570398; Thu, 13 May 2021 07:02:50 -0700 (PDT) Received: from machine.fritz.box (p4fc0a3a3.dip0.t-ipconnect.de. [79.192.163.163]) by smtp.googlemail.com with ESMTPSA id by20sm1825055ejc.74.2021.05.13.07.02.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 May 2021 07:02:49 -0700 (PDT) From: Alexander Sarmanow To: sven@narfation.org Subject: [PATCH v3 1/2] batctl: netlink: Make netlink_query_common non-static Date: Thu, 13 May 2021 16:02:33 +0200 Message-Id: <20210513140234.1624460-2-asarmanow@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210513140234.1624460-1-asarmanow@gmail.com> References: <20210513140234.1624460-1-asarmanow@gmail.com> MIME-Version: 1.0 ARC-Seal: i=1; s=20121; d=open-mesh.org; t=1620914933; a=rsa-sha256; cv=none; b=X89B3G3Tg2cSPhj1JjXohyHqkUH72kCDggUKRpE0tUyY5n8SmW2pRwrai3MkUnk7SrmiYP eYXPSOHISxOHiylAk6TkJJcj/d4I5A6kbne6emdh6lm2jdy9XsgIuSfyAx2lIPmbubAuag 7Mz99JYyv2aGsvptDpEO4h/RoWDfV0U= ARC-Authentication-Results: i=1; diktynna.open-mesh.org; dkim=pass header.d=gmail.com header.s=20161025 header.b=MbNOnZW5; spf=pass (diktynna.open-mesh.org: domain of asarmanow@gmail.com designates 2a00:1450:4864:20::52c as permitted sender) smtp.mailfrom=asarmanow@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=open-mesh.org; s=20121; t=1620914933; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=kwbYuvNj6n/qWGnAbzLtp0c60PCixsNe0mcYa6/xWkI=; b=iZCcTszHSh0PTuq9cGVoJPaYJc061e9ZL7qJ4YgU3VDLefkmxgvBf4GSnQ/8Q8hJHN9hWR cWvee5L3ofUdhSll6z1ZSs6TGJ4qMTwHvCjuC7s9LDyF6mmgx9pxS47u7OBSFQHZ+XFsDZ bNy1l8V+UrOb3+DuTc2XjzZeonVuVOY= Message-ID-Hash: YO7DMY23W4T2JECWX4J3T6FFKAQBPOT3 X-Message-ID-Hash: YO7DMY23W4T2JECWX4J3T6FFKAQBPOT3 X-MailFrom: asarmanow@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-b.a.t.m.a.n.lists.open-mesh.org-0; header-match-b.a.t.m.a.n.lists.open-mesh.org-1; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: b.a.t.m.a.n@lists.open-mesh.org, Alexander Sarmanow X-Mailman-Version: 3.2.1 Precedence: list Reply-To: The list for a Better Approach To Mobile Ad-hoc Networking List-Id: The list for a Better Approach To Mobile Ad-hoc Networking Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: With a view to the introduction of a JSON debug support the netlink_query_common can be used for simple query of batman-adv atttirubtes without any filters. Signed-off-by: Alexander Sarmanow --- netlink.c | 12 ++++-------- netlink.h | 8 ++++++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/netlink.c b/netlink.c index eb5888b..2c45645 100644 --- a/netlink.c +++ b/netlink.c @@ -29,10 +29,6 @@ #include "functions.h" #include "main.h" -struct nlquery_opts { - int err; -}; - struct nla_policy batadv_netlink_policy[NUM_BATADV_ATTR] = { [BATADV_ATTR_VERSION] = { .type = NLA_STRING, @@ -623,10 +619,10 @@ static int nlquery_stop_cb(struct nl_msg *msg, void *arg) return NL_STOP; } -static int netlink_query_common(struct state *state, - unsigned int mesh_ifindex, uint8_t nl_cmd, - nl_recvmsg_msg_cb_t callback, int flags, - struct nlquery_opts *query_opts) +int netlink_query_common(struct state *state, + unsigned int mesh_ifindex, uint8_t nl_cmd, + nl_recvmsg_msg_cb_t callback, int flags, + struct nlquery_opts *query_opts) { struct nl_msg *msg; struct nl_cb *cb; diff --git a/netlink.h b/netlink.h index 2cc5862..c93f500 100644 --- a/netlink.h +++ b/netlink.h @@ -25,6 +25,10 @@ struct print_opts { uint8_t nl_cmd; }; +struct nlquery_opts { + int err; +}; + struct ether_addr; int netlink_create(struct state *state); @@ -54,6 +58,10 @@ int netlink_print_error(struct sockaddr_nl *nla, struct nlmsgerr *nlerr, void *arg); void netlink_print_remaining_header(struct print_opts *opts); +int netlink_query_common(struct state *state, unsigned int mesh_ifindex, + uint8_t nl_cmd, nl_recvmsg_msg_cb_t callback, int flags, + struct nlquery_opts *query_opts); + extern char algo_name_buf[256]; extern int last_err; extern int64_t mcast_flags; From patchwork Thu May 13 14:02:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Sarmanow X-Patchwork-Id: 18317 X-Patchwork-Delegate: sw@simonwunderlich.de Return-Path: X-Original-To: patchwork@open-mesh.org Delivered-To: patchwork@open-mesh.org Received: from diktynna.open-mesh.org (localhost [IPv6:::1]) by diktynna.open-mesh.org (Postfix) with ESMTP id 1117483E26; Thu, 13 May 2021 16:08:02 +0200 (CEST) Received: from mail-ej1-x630.google.com (mail-ej1-x630.google.com [IPv6:2a00:1450:4864:20::630]) by diktynna.open-mesh.org (Postfix) with ESMTPS id 565C8809F3 for ; Thu, 13 May 2021 16:07:59 +0200 (CEST) Received: by mail-ej1-x630.google.com with SMTP id b25so39983679eju.5 for ; Thu, 13 May 2021 07:07:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wtAuKjcvI4XV5M67/OVX86oWn/5Psw6Q3W/5zt41k8k=; b=hqlD//yEIBB0yAQw7nSfLkWqus+Jo0xY4vhK4JGnJwPuHVmDmhR9dqh+NqhXXQrxIe YQi+Nb4MaAj2U8mYBkpmvWX9hKMf63UWtn6g+V0jKNp1YYNSd8u+jFMrpHUUeGvKbu9n VfLaduD1xpgUAzigxlnvv/C6TsQDe12w5R+PVV4rWypvv8dT8YD6SN21N80hkYatsut2 +TIBTCWT+ddh35yLsdZbrSuXHlmc7+75FocvyGtT+A+ZU8/3W7BEHj/rSs76a3RA+PV5 nWNXu9PtTanlLTOb9Jgg45iDTdbbL7KqpgnNssdQhhRhLr9kpKtzpKTl/k+31+BdPMve svOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wtAuKjcvI4XV5M67/OVX86oWn/5Psw6Q3W/5zt41k8k=; b=bcmP/jvG/FqNKgeKiqPkW+X+hCBClxSjwecS0ZGJIVRFH9PV15eIXYXSO0yi4Udndw Zfx2wL0+DokZWq78+2TWihFVpQ1+9s0/Pf7NeFp4Plb9M6PJt74Rl5MIgxQ+moDmbEf1 Xq9fXSWWdQYjDn7ZE632qpBTqVYvA2atnnKRMrr2ue+UjEIHG+GVEdu37kTT2mYVxhJc reIEQ58QWrgxc7i+34+MFQJFI42WXnqLC2XrNiPJAcGev3eViYge5dfvRO7ejsNpiIw/ ACImpc1d7NXn5fGYMdHjburL1i9hMCKA65hHuUHJasPdMCVQUdhX+DINd5dqI4C0G28s CPSg== X-Gm-Message-State: AOAM532Z66ZC2kkQx6pdzZAi2YFNMRS+mF7Te8miqNd/fll6blPaSl3V GOAgZfY/HTAkDIjZ89ptLwK5+mC5+qilhebadM8= X-Google-Smtp-Source: ABdhPJxi/ZYpGiXPcEsYt7OWIy73zd175QH7qqURQdyk/ua/23Q14fGhd3lM2uUeMc+yzGlyIASk5A== X-Received: by 2002:a17:907:7634:: with SMTP id jy20mr43823158ejc.553.1620914577941; Thu, 13 May 2021 07:02:57 -0700 (PDT) Received: from machine.fritz.box (p4fc0a3a3.dip0.t-ipconnect.de. [79.192.163.163]) by smtp.googlemail.com with ESMTPSA id by20sm1825055ejc.74.2021.05.13.07.02.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 May 2021 07:02:57 -0700 (PDT) From: Alexander Sarmanow To: sven@narfation.org Subject: [PATCH v3 2/2] batctl: genl_json: Add generic JSON interface Date: Thu, 13 May 2021 16:02:34 +0200 Message-Id: <20210513140234.1624460-3-asarmanow@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210513140234.1624460-1-asarmanow@gmail.com> References: <20210513140234.1624460-1-asarmanow@gmail.com> MIME-Version: 1.0 ARC-Seal: i=1; s=20121; d=open-mesh.org; t=1620914879; a=rsa-sha256; cv=none; b=fm7h54Dh3ZWE4j0b32cnauxIi1nP1cF/XElKHVfDeah6ppopp3A25nIxq2hxIqKh2nxWqc GC1kn7bwMyMG9BVTpgmk8/BUlXO3a110ajw4pI+0WJN1Z6OQH+qpc0M+doE06WJGKnDlGV ujSiVGmlx0LBT8g13DqrTtiq2JvJm0A= ARC-Authentication-Results: i=1; diktynna.open-mesh.org; dkim=pass header.d=gmail.com header.s=20161025 header.b="hqlD//yE"; spf=pass (diktynna.open-mesh.org: domain of asarmanow@gmail.com designates 2a00:1450:4864:20::630 as permitted sender) smtp.mailfrom=asarmanow@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=open-mesh.org; s=20121; t=1620914879; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=wtAuKjcvI4XV5M67/OVX86oWn/5Psw6Q3W/5zt41k8k=; b=wiWpjsI/fyMpDPzPG3ulP6xpbAXimwGy53wV0IAr+SIUE94fNrB0tLcfs8jQT4BvYeV3cP lcpDdwyOwvVysDhyZVwAdir4cMKhzMQsgF0GVgIjqIaHX9lRKbgDGexYfK0x6cKQ2QJkQq JNO1/k4/jCuqq4ysTjNA5kn20D5vehk= Message-ID-Hash: 27SOHXCAC23NPKTLKWSEAN3BWYSB7BF6 X-Message-ID-Hash: 27SOHXCAC23NPKTLKWSEAN3BWYSB7BF6 X-MailFrom: asarmanow@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-b.a.t.m.a.n.lists.open-mesh.org-0; header-match-b.a.t.m.a.n.lists.open-mesh.org-1; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: b.a.t.m.a.n@lists.open-mesh.org, Alexander Sarmanow X-Mailman-Version: 3.2.1 Precedence: list Reply-To: The list for a Better Approach To Mobile Ad-hoc Networking List-Id: The list for a Better Approach To Mobile Ad-hoc Networking Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: To print JSON strings in a generic way a second nla_policy is used, with a name (dict key) and a callback function for each entry corresponding to its formats. There are multiple callback functions created, depending on the NLA type. Signed-off-by: Alexander Sarmanow --- Makefile | 1 + genl_json.c | 359 ++++++++++++++++++++++++++++++++++++++++++++++++++++ genl_json.h | 24 ++++ netlink.h | 6 + 4 files changed, 390 insertions(+) create mode 100644 genl_json.c create mode 100644 genl_json.h diff --git a/Makefile b/Makefile index 98bf695..cee4f0c 100755 --- a/Makefile +++ b/Makefile @@ -16,6 +16,7 @@ obj-y += bat-hosts.o obj-y += debug.o obj-y += functions.o obj-y += genl.o +obj-y += genl_json.o obj-y += hash.o obj-y += icmp_helper.o obj-y += main.o diff --git a/genl_json.c b/genl_json.c new file mode 100644 index 0000000..cff54d8 --- /dev/null +++ b/genl_json.c @@ -0,0 +1,359 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (C) B.A.T.M.A.N. contributors: + * + * Alexander Sarmanow + * + * License-Filename: LICENSES/preferred/GPL-2.0 + */ + +#include +#include +#include +#include +#include + +#include "genl_json.h" +#include "batman_adv.h" +#include "netlink.h" +#include "main.h" + +static void nljson_print_str(struct nlattr *attrs[], int idx) +{ + const char *value; + + value = nla_get_string(attrs[idx]); + + putc('"', stdout); + sanitize_string(value); + putc('"', stdout); +} + +static void nljson_print_uint8_t(struct nlattr *attrs[], int idx) +{ + uint8_t value = nla_get_u8(attrs[idx]); + + printf("%u", value); +} + +static void nljson_print_uint16_t(struct nlattr *attrs[], int idx) +{ + uint16_t value = nla_get_u16(attrs[idx]); + + printf("%u", value); +} + +static void nljson_print_uint32_t(struct nlattr *attrs[], int idx) +{ + uint32_t value = nla_get_u32(attrs[idx]); + + printf("%u", value); +} + +static void nljson_print_uint64_t(struct nlattr *attrs[], int idx) +{ + uint64_t value = nla_get_u64(attrs[idx]); + + printf("%llu", value); +} + +static void nljson_print_mac(struct nlattr *attrs[], int idx) +{ + uint8_t *value = nla_data(attrs[idx]); + + printf("\"%02x:%02x:%02x:%02x:%02x:%02x\"", + value[0], value[1], value[2], value[3], value[4], value[5]); +} + +static void nljson_print_flag(struct nlattr *attrs[], int idx) +{ + if (nla_get_flag(attrs[idx])) + printf("true"); +} + +void sanitize_string(const char *str) +{ + while (*str) { + if (*str == '"' || *str == '\\') { + putchar('\\'); + putchar(*str); + } else if (*str == '\\') { + printf("\\\\"); + } else if (!isprint(*str)) { + printf("\\x%02x", *str); + } else { + printf("%c", *str); + } + str++; + } +} + +void netlink_print_json_entries(struct nlattr *attrs[], struct json_opts *json_opts) +{ + bool first_valid_attr = true; + int i; + + if (!json_opts->is_first) + printf(","); + + printf("{"); + for (i = 0; i < BATADV_ATTR_MAX + 1; i++) { + if (!attrs[i]) + continue; + + if (!batadv_netlink_policy_json[i].cb) + continue; + + if (!first_valid_attr) + printf(","); + + putc('"', stdout); + sanitize_string(batadv_netlink_policy_json[i].name); + printf("\":"); + batadv_netlink_policy_json[i].cb(attrs, i); + + first_valid_attr = false; + } + printf("}"); +} + + +struct nla_policy_json batadv_netlink_policy_json[NUM_BATADV_ATTR] = { + [BATADV_ATTR_VERSION] = { + .name = "version", + .cb = nljson_print_str, + }, + [BATADV_ATTR_ALGO_NAME] = { + .name = "algo_name", + .cb = nljson_print_str, + }, + [BATADV_ATTR_MESH_IFINDEX] = { + .name = "mesh_ifindex", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_MESH_IFNAME] = { + .name = "mesh_ifname", + .cb = nljson_print_str, + }, + [BATADV_ATTR_MESH_ADDRESS] = { + .name = "mesh_address", + .cb = nljson_print_mac, + }, + [BATADV_ATTR_HARD_IFINDEX] = { + .name = "hard_ifindex", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_HARD_IFNAME] = { + .name = "hard_ifname", + .cb = nljson_print_str, + }, + [BATADV_ATTR_HARD_ADDRESS] = { + .name = "hard_address", + .cb = nljson_print_mac, + }, + [BATADV_ATTR_ORIG_ADDRESS] = { + .name = "orig_address", + .cb = nljson_print_mac, + }, + [BATADV_ATTR_TPMETER_RESULT] = { + .name = "tpmeter_result", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_TPMETER_TEST_TIME] = { + .name = "tpmeter_test_time", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_TPMETER_BYTES] = { + .name = "tpmeter_bytes", + .cb = nljson_print_uint64_t + }, + [BATADV_ATTR_TPMETER_COOKIE] = { + .name = "tpmeter_cookie", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_PAD] = { + .name = "pad", + }, + [BATADV_ATTR_ACTIVE] = { + .name = "active", + .cb = nljson_print_flag, + }, + [BATADV_ATTR_TT_ADDRESS] = { + .name = "tt_address", + .cb = nljson_print_mac, + }, + [BATADV_ATTR_TT_TTVN] = { + .name = "tt_ttvn", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_TT_LAST_TTVN] = { + .name = "last_ttvn", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_TT_CRC32] = { + .name = "crc32", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_TT_VID] = { + .name = "tt_vid", + .cb = nljson_print_uint16_t, + }, + [BATADV_ATTR_TT_FLAGS] = { + .name = "tt_flags", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_FLAG_BEST] = { + .name = "best", + .cb = nljson_print_flag, + }, + [BATADV_ATTR_LAST_SEEN_MSECS] = { + .name = "last_seen_msecs", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_NEIGH_ADDRESS] = { + .name = "neigh_address", + .cb = nljson_print_mac, + }, + [BATADV_ATTR_TQ] = { + .name = "tq", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_THROUGHPUT] = { + .name = "throughput", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_BANDWIDTH_UP] = { + .name = "bandwidth_up", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_BANDWIDTH_DOWN] = { + .name = "bandwidth_down", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_ROUTER] = { + .name = "router", + .cb = nljson_print_mac, + }, + [BATADV_ATTR_BLA_OWN] = { + .name = "bla_own", + .cb = nljson_print_flag, + }, + [BATADV_ATTR_BLA_ADDRESS] = { + .name = "bla_address", + .cb = nljson_print_mac, + }, + [BATADV_ATTR_BLA_VID] = { + .name = "bla_vid", + .cb = nljson_print_uint16_t, + }, + [BATADV_ATTR_BLA_BACKBONE] = { + .name = "bla_backbone", + .cb = nljson_print_mac, + }, + [BATADV_ATTR_BLA_CRC] = { + .name = "bla_crc", + .cb = nljson_print_uint16_t, + }, + [BATADV_ATTR_DAT_CACHE_IP4ADDRESS] = { + .name = "dat_cache_ip4_address", + }, + [BATADV_ATTR_DAT_CACHE_HWADDRESS] = { + .name = "dat_cache_hw_address", + .cb = nljson_print_mac, + }, + [BATADV_ATTR_DAT_CACHE_VID] = { + .name = "dat_cache_vid", + .cb = nljson_print_uint16_t, + }, + [BATADV_ATTR_MCAST_FLAGS] = { + .name = "mcast_flags", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_MCAST_FLAGS_PRIV] = { + .name = "mcast_flags_priv", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_VLANID] = { + .name = "vlan_id", + .cb = nljson_print_uint16_t, + }, + [BATADV_ATTR_AGGREGATED_OGMS_ENABLED] = { + .name = "aggregated_ogms_enabled", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_AP_ISOLATION_ENABLED] = { + .name = "ap_isolation_enabled", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_ISOLATION_MARK] = { + .name = "isolation_mark", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_ISOLATION_MASK] = { + .name = "isolation_mask", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_BONDING_ENABLED] = { + .name = "bonding_enabled", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_BRIDGE_LOOP_AVOIDANCE_ENABLED] = { + .name = "bridge_loop_avoidance_enabled", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_DISTRIBUTED_ARP_TABLE_ENABLED] = { + .name = "distributed_arp_table_enabled", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_FRAGMENTATION_ENABLED] = { + .name = "fragmented_enabled", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_GW_BANDWIDTH_DOWN] = { + .name = "bandwidth_down", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_GW_BANDWIDTH_UP] = { + .name = "bandwidth_up", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_GW_MODE] = { + .name = "gw_mode", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_GW_SEL_CLASS] = { + .name = "gw_sel_class", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_HOP_PENALTY] = { + .name = "hop_penalty", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_LOG_LEVEL] = { + .name = "log_level", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_MULTICAST_FORCEFLOOD_ENABLED] = { + .name = "multicast_forceflood_enabled", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_NETWORK_CODING_ENABLED] = { + .name = "network_coding_enabled", + .cb = nljson_print_uint8_t, + }, + [BATADV_ATTR_ORIG_INTERVAL] = { + .name = "orig_interval", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_ELP_INTERVAL] = { + .name = "elp_interval", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_THROUGHPUT_OVERRIDE] = { + .name = "throughput_override", + .cb = nljson_print_uint32_t, + }, + [BATADV_ATTR_MULTICAST_FANOUT] = { + .name = "multicast_fanout", + .cb = nljson_print_uint32_t, + }, +}; diff --git a/genl_json.h b/genl_json.h new file mode 100644 index 0000000..0336b40 --- /dev/null +++ b/genl_json.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (C) B.A.T.M.A.N. contributors: + * + * Alexander Sarmanow + * + * License-Filename: LICENSES/preferred/GPL-2.0 + */ + +#ifndef _BATCTL_GENLJSON_H +#define _BATCTL_GENLJSON_H + +#include + +#include "netlink.h" + +struct json_opts { + uint8_t is_first; + struct nlquery_opts query_opts; +}; + +void netlink_print_json_entries(struct nlattr *attrs[], struct json_opts *json_opts); +void sanitize_string(const char *str); + +#endif /* _BATCTL_GENLJSON_H */ diff --git a/netlink.h b/netlink.h index c93f500..d96935a 100644 --- a/netlink.h +++ b/netlink.h @@ -29,6 +29,11 @@ struct nlquery_opts { int err; }; +struct nla_policy_json { + const char *name; + void (*cb)(struct nlattr *attrs[], int idx); +}; + struct ether_addr; int netlink_create(struct state *state); @@ -44,6 +49,7 @@ int get_algoname_netlink(struct state *state, unsigned int mesh_ifindex, char *algoname, size_t algoname_len); extern struct nla_policy batadv_netlink_policy[]; +extern struct nla_policy_json batadv_netlink_policy_json[]; int missing_mandatory_attrs(struct nlattr *attrs[], const int mandatory[], int num);