From patchwork Thu May 13 14:28:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Sarmanow X-Patchwork-Id: 18324 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 36F6583F49; Thu, 13 May 2021 16:28:26 +0200 (CEST) Received: from mail-ej1-x636.google.com (mail-ej1-x636.google.com [IPv6:2a00:1450:4864:20::636]) by diktynna.open-mesh.org (Postfix) with ESMTPS id 277A68020F for ; Thu, 13 May 2021 16:28:23 +0200 (CEST) Received: by mail-ej1-x636.google.com with SMTP id b25so40082767eju.5 for ; Thu, 13 May 2021 07:28:23 -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=I4axOVpVYWIanTOId1MFNV4mjMtkoG3LGpmN0oXzQcg=; b=b3fcNPZZqR+ZFQ1Av0vF0RvIXOy492Sd6GLhfthuK08h4aY2JkLt6heWK567KA8n6o RziaE1hY4AhVhZYKgdAwVCkEHfSkOfGiiUWQO/8n9GRZF5gt9vBHi6Feu0hY15wnqHMj g/Ov/804ob87DBRZKOjg+Gf0JVepDMkyQ0B9t2d5mmEYzFiedC138hvLHqLdeYokO5IV jx+yuhW/E4Pbo5Cx9iz43KvgoSdBXK7/iG53SIFZzDBsYKq8Yd3BEOxAeHSAeXbRNsT9 v+dgfiY8ezYPuEASE/4QKoVytSmkvxkUbGyWX7wfqu6EtXXfcloSndR40m5c3H8CebfA Z25g== 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=I4axOVpVYWIanTOId1MFNV4mjMtkoG3LGpmN0oXzQcg=; b=eRTqPlXtrJrhKRU73yq7Q97slCq1ORLCwyUCtxFgGYeZBFB7Q13+DbCoTyzPeUlcsb 9NX6UAgD8AwGy217DuYVute/MH2tZWgR/kMUJpXSYdygEQxcxvb6yAW+tGO36+QLXUOl esyzQttSQSNxF1GjOiK4u22T9Nj3qApIPMQPMM6h0e7GT8pxf18cZqtiesv2S1RwhIaA aYgyTkdJKwuCJ5gRDvX8gcXwWYbSi3D+bi92RpOe1a3GWNbrsMMPyJ6h2EDk/YPqsS4f xfTdCOfYMzAA1s/xY0ztZamdyFNKdPOXbu//0r+wQpU8EHCXvUAe1IOCNBDN6YT6gb5P sQBA== X-Gm-Message-State: AOAM530YvHOXHiLY01J+hYWuS7GO1sSvUJzLylufytr8HFzGhqmtdwyg MVxMb+jjqvdZBk/WZs/iZRM= X-Google-Smtp-Source: ABdhPJzGeSt+onnpVaAJ9R/cjifQovM9QpYFofvZG5fk/cpVBer8wXXM6RMRl4grZkzNiL1jSoKycQ== X-Received: by 2002:a17:906:84d:: with SMTP id f13mr650745ejd.451.1620916102781; Thu, 13 May 2021 07:28:22 -0700 (PDT) Received: from machine.fritz.box (p4fc0a3a3.dip0.t-ipconnect.de. [79.192.163.163]) by smtp.googlemail.com with ESMTPSA id yw9sm1897153ejb.91.2021.05.13.07.28.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 May 2021 07:28:22 -0700 (PDT) From: Alexander Sarmanow To: sven@narfation.org Subject: [PATCH v3 1/4] batctl: originators_json: Add originators_json command Date: Thu, 13 May 2021 16:28:09 +0200 Message-Id: <20210513142812.1707215-2-asarmanow@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210513142812.1707215-1-asarmanow@gmail.com> References: <20210513142812.1707215-1-asarmanow@gmail.com> MIME-Version: 1.0 ARC-Seal: i=1; s=20121; d=open-mesh.org; t=1620916103; a=rsa-sha256; cv=none; b=iqzk15+GlkuhX/a8wEuAq4L49XtPEfgF51V23s9ZOD9sdy4941bGX+vGS/wxjtGYcdAqmW lid/0wtKE4Wny/RJqkeK8gd6pBzQtBmWUO2F8viKa0qAKOqVWwaaSsqCYFc69ST+T6AWEz WxdGOXVT/5ROo0hOXjnmBw6rtyFt5VY= ARC-Authentication-Results: i=1; diktynna.open-mesh.org; dkim=pass header.d=gmail.com header.s=20161025 header.b=b3fcNPZZ; spf=pass (diktynna.open-mesh.org: domain of asarmanow@gmail.com designates 2a00:1450:4864:20::636 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=1620916103; 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=I4axOVpVYWIanTOId1MFNV4mjMtkoG3LGpmN0oXzQcg=; b=JCMoeMpiGSCke08dXyY/HKVllY9inZYuL/YR9aNcubD2Mi7mZRJL0UoVuA385BuvBvCXW/ Zroe/dBZUqiqMoIcAR1FjsdztJELv79Zy5S65VBt2JiFPTHZMk0YvxL7smqWHtJmOHUiBQ T9Df6nKTWjc9q9wukgjM3E2lvLtdszU= Message-ID-Hash: 64HBMJGIGI5K6O7PQWGXHMQ6MPI6QA5M X-Message-ID-Hash: 64HBMJGIGI5K6O7PQWGXHMQ6MPI6QA5M 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: This is the JSON analogue of the originators table. By using the netlink_query_common function to query the available netlink attributes. Signed-off-by: Alexander Sarmanow --- Makefile | 1 + README.rst | 15 +++++++++ man/batctl.8 | 3 ++ originators_json.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+) create mode 100644 originators_json.c diff --git a/Makefile b/Makefile index cee4f0c..9dfcfde 100755 --- a/Makefile +++ b/Makefile @@ -62,6 +62,7 @@ $(eval $(call add_command,neighbors,y)) $(eval $(call add_command,network_coding,y)) $(eval $(call add_command,orig_interval,y)) $(eval $(call add_command,originators,y)) +$(eval $(call add_command,originators_json,y)) $(eval $(call add_command,ping,y)) $(eval $(call add_command,routing_algo,y)) $(eval $(call add_command,statistics,y)) diff --git a/README.rst b/README.rst index 9c55ad5..c884bb3 100644 --- a/README.rst +++ b/README.rst @@ -356,6 +356,21 @@ Example:: fe:f0:00:00:01:01 0.510s (255) fe:f0:00:00:01:01 [ eth0]: fe:f1:00:00:01:01 (240) fe:f0:00:00:01:01 (255) +batctl originators_json +======================= + +Check the Originators JSON (it's a JSON analogue of the Originators table) + +Usage:: + + batctl originators_json|oj + +Example:: + + $ batctl originators_json + [{"hard_ifindex":7,"orig_address":"fe:fe:00:00:01:01","best":true,"last_seen_msecs":700,"neigh_address":"fe:fe:00:00:02:01","tq":119},{"hard_ifindex":2,"orig_address":"fe:fe:00:00:03:01","best":true,"last_seen_msecs":1040,"neigh_address":"fe:fe:00:00:02:01","tq":116},{"hard_ifindex":7,"orig_address":"fe:fe:00:00:04:01","best":true,"last_seen_msecs":700,"neigh_address":"fe:fe:00:00:02:01","tq":119},{"hard_ifindex":2,"orig_address":"fe:fe:00:00:05:01","best":true,"last_seen_msecs":270,"neigh_address":"fe:fe:00:00:02:01","tq":140},{"hard_ifindex":2,"orig_address":"fe:fe:00:00:06:01","best":true,"last_seen_msecs":770,"neigh_address":"fe:fe:00:00:02:01","tq":91}] + + batctl interface ================ diff --git a/man/batctl.8 b/man/batctl.8 index b2abedc..155791d 100644 --- a/man/batctl.8 +++ b/man/batctl.8 @@ -303,6 +303,9 @@ seen by each individual node. .RS 7 List of debug JSONs: +.RS 10 +\- originators_json|oj +.RE .RE .br .IP "[\fBmeshif \fP] \fBtranslate\fP|\fBt\fP \fBMAC_address\fP|\fBbat\-host_name\fP|\fBhost_name\fP|\fBIP_address\fP" diff --git a/originators_json.c b/originators_json.c new file mode 100644 index 0000000..fc71098 --- /dev/null +++ b/originators_json.c @@ -0,0 +1,84 @@ +// 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 +#include +#include +#include +#include + +#include "batman_adv.h" +#include "debug.h" +#include "main.h" +#include "netlink.h" +#include "genl_json.h" + +static int originators_json_callback(struct nl_msg *msg, void *arg) +{ + struct nlattr *attrs[BATADV_ATTR_MAX+1]; + struct nlmsghdr *nlh = nlmsg_hdr(msg); + struct nlquery_opts *query_opts = arg; + struct json_opts *json_opts; + struct genlmsghdr *ghdr; + + json_opts = container_of(query_opts, struct json_opts, query_opts); + + if (!genlmsg_valid_hdr(nlh, 0)) { + fputs("Received invalid data from kernel.\n", stderr); + exit(1); + } + + ghdr = nlmsg_data(nlh); + + if (ghdr->cmd != BATADV_CMD_GET_ORIGINATORS) + return NL_OK; + + if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0), + genlmsg_len(ghdr), batadv_netlink_policy)) { + fputs("Received invalid data from kernel.\n", stderr); + exit(1); + } + + netlink_print_json_entries(attrs, json_opts); + json_opts->is_first = 0; + + return NL_OK; +} + +static int netlink_print_originators_json(struct state *state) +{ + int ret; + struct json_opts json_opts = { + .is_first = 1, + .query_opts = { + .err = 0, + }, + }; + + putc('[', stdout); + ret = netlink_query_common(state, state->mesh_ifindex, + BATADV_CMD_GET_ORIGINATORS, + originators_json_callback, + NLM_F_DUMP, &json_opts.query_opts); + puts("]\n"); + + return ret; +} + +static struct debug_json_data batctl_debug_json_originators = { + .netlink_fn = netlink_print_originators_json, +}; + +COMMAND_NAMED(DEBUGJSON, originators_json, "oj", handle_debug_json, + COMMAND_FLAG_MESH_IFACE | COMMAND_FLAG_NETLINK, + &batctl_debug_json_originators, ""); From patchwork Thu May 13 14:28:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Sarmanow X-Patchwork-Id: 18325 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 D1B098406F; Thu, 13 May 2021 16:28:31 +0200 (CEST) Received: from mail-ed1-x52f.google.com (mail-ed1-x52f.google.com [IPv6:2a00:1450:4864:20::52f]) by diktynna.open-mesh.org (Postfix) with ESMTPS id A99118020F for ; Thu, 13 May 2021 16:28:23 +0200 (CEST) Received: by mail-ed1-x52f.google.com with SMTP id a25so7068021edr.12 for ; Thu, 13 May 2021 07:28:23 -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=Xez61dVHRMEfg8cBr1awaJNs+vP6eEeF+XXQIUs2ahw=; b=KM/DEE4mNT1RplLxjtP8YSO4fIm2/YOvYgC4AtKV/55kPBblJz3g3agr1tauvbOSN9 WfiSzDy8zvIkMBSwCSXmX7DFmpm+g212pVE4suXwDu6Bmqh7lnG2aIRqUMlelpBonW2c 38pV/ogXHbL9luBVWRKX30zLy92YXlLDKjWlrroOdMQ2EJDCeEOSh+ealqZl4HOkWNIk hf/np9UDTWjG+aWSga10CqFFq0gPh8lRa0ESQFum4mCsjVIHZ3OdvtOF64nmrO+tfUyb 5jKPKuc/miztd0s9UKHX7XF9FJ/LGhPJ24LFY8YRjd38UOs8BBN95gGqUcxleNcQAdeq 2EPQ== 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=Xez61dVHRMEfg8cBr1awaJNs+vP6eEeF+XXQIUs2ahw=; b=ActQgo3v5iN3Fl+FDkKhTZSf6u+0GDA0gfssze5WLEm5TVZQQdSidmJ88KML72hne/ 02w2O42xMXJC9OeVJiYDe0sQWjuY32VbPijshoFe7oA9gpfoDySccxcokCiORZ7A0BKF 2zCkByT5PRNsvgL3gL4WPllwUP+8GpXwowjHp8roTvak59Xg+PdXUhXCQy+kCb+QSpmI 06yPUeERowfzSMMJvup/aTne+P3uRSYZPIRw1O004WOBPa2BByCy2ZFf5nYwu9VdCTED vZFqb6TxZVPDXVZv5YArBNOhzAuJrpcQWBVo0QQdHi6OpvmKmtry9xZkR/vsOUZ719ix NhwQ== X-Gm-Message-State: AOAM530v4XK4IeEK8B0KKEsBYcpBLaCRT1C3mosZ1FOdWKaNH5iIfeGV mi4M22jQIggwTVYrUn4mraw= X-Google-Smtp-Source: ABdhPJzuRNvqEswR0Eb84ebcjsVfkQ0BfgOHGgHYU/2mOjmPmrAXiDdA5HXK+EHdTvvpxGzZ7iOxqA== X-Received: by 2002:a50:eb47:: with SMTP id z7mr51393102edp.68.1620916103301; Thu, 13 May 2021 07:28:23 -0700 (PDT) Received: from machine.fritz.box (p4fc0a3a3.dip0.t-ipconnect.de. [79.192.163.163]) by smtp.googlemail.com with ESMTPSA id yw9sm1897153ejb.91.2021.05.13.07.28.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 May 2021 07:28:23 -0700 (PDT) From: Alexander Sarmanow To: sven@narfation.org Subject: [PATCH v3 2/4] batctl: neighbors_json: Add neighbors_json command Date: Thu, 13 May 2021 16:28:10 +0200 Message-Id: <20210513142812.1707215-3-asarmanow@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210513142812.1707215-1-asarmanow@gmail.com> References: <20210513142812.1707215-1-asarmanow@gmail.com> MIME-Version: 1.0 ARC-Seal: i=1; s=20121; d=open-mesh.org; t=1620916103; a=rsa-sha256; cv=none; b=ipkfOBVuiCWUBlJh9KIObIn9A1Od3sxOSt/Q3n8uNDfmOfGCYs9ln/QIDiC29szIGstVkK 7BT+xK6YXWqw8g+0fPC3JlKgWoIq345O7h7ZDdIbCsFABhsFNqcz4kUuzASTLZEJOTy4YR WS31q0n2pkZeaRphCaBPZOMIFMxwD9s= ARC-Authentication-Results: i=1; diktynna.open-mesh.org; dkim=pass header.d=gmail.com header.s=20161025 header.b="KM/DEE4m"; spf=pass (diktynna.open-mesh.org: domain of asarmanow@gmail.com designates 2a00:1450:4864:20::52f 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=1620916103; 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=Xez61dVHRMEfg8cBr1awaJNs+vP6eEeF+XXQIUs2ahw=; b=tOOBUADmXlm1uhJW6wLZ2GAQUW3e0c8zZT33aHK/FKWjl2jOtetqzF4jWBzf3Ozx+vFGKr +mSZzoksolAoPooDEDjqEfhsXzeINe2lCBBLvyN1Q94Pw1ydvEzvnOvA0YcmFKr5WkqMND zBvVEbKcSHraAkZxvuQ94b3tufYnUMQ= Message-ID-Hash: TR5UEMQJYY4FGRYWZ2E2EPM32ULFYFNN X-Message-ID-Hash: TR5UEMQJYY4FGRYWZ2E2EPM32ULFYFNN 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: This is the JSON analogue of the neighbors table. By using the netlink_query_common function to query the available netlink attributes. Signed-off-by: Alexander Sarmanow --- Makefile | 1 + README.rst | 15 +++++++++ man/batctl.8 | 3 ++ neighbors_json.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+) create mode 100644 neighbors_json.c diff --git a/Makefile b/Makefile index 9dfcfde..874dc2f 100755 --- a/Makefile +++ b/Makefile @@ -59,6 +59,7 @@ $(eval $(call add_command,multicast_fanout,y)) $(eval $(call add_command,multicast_forceflood,y)) $(eval $(call add_command,multicast_mode,y)) $(eval $(call add_command,neighbors,y)) +$(eval $(call add_command,neighbors_json,y)) $(eval $(call add_command,network_coding,y)) $(eval $(call add_command,orig_interval,y)) $(eval $(call add_command,originators,y)) diff --git a/README.rst b/README.rst index c884bb3..f0ce43a 100644 --- a/README.rst +++ b/README.rst @@ -371,6 +371,21 @@ Example:: [{"hard_ifindex":7,"orig_address":"fe:fe:00:00:01:01","best":true,"last_seen_msecs":700,"neigh_address":"fe:fe:00:00:02:01","tq":119},{"hard_ifindex":2,"orig_address":"fe:fe:00:00:03:01","best":true,"last_seen_msecs":1040,"neigh_address":"fe:fe:00:00:02:01","tq":116},{"hard_ifindex":7,"orig_address":"fe:fe:00:00:04:01","best":true,"last_seen_msecs":700,"neigh_address":"fe:fe:00:00:02:01","tq":119},{"hard_ifindex":2,"orig_address":"fe:fe:00:00:05:01","best":true,"last_seen_msecs":270,"neigh_address":"fe:fe:00:00:02:01","tq":140},{"hard_ifindex":2,"orig_address":"fe:fe:00:00:06:01","best":true,"last_seen_msecs":770,"neigh_address":"fe:fe:00:00:02:01","tq":91}] +batctl neighbors_json +===================== + +display the Neighbors JSON (analogue of the neighbors table) + +Usage:: + + batctl neighbors_json + +Example:: + + $ batctl neighbors_json|nj + [{"hard_ifindex":2,"last_seen_msecs":650,"neigh_address":"fe:fe:00:00:01:01"},{"hard_ifindex":2,"last_seen_msecs":650,"neigh_address":"fe:fe:00:00:01:02"}] + + batctl interface ================ diff --git a/man/batctl.8 b/man/batctl.8 index 155791d..1130a81 100644 --- a/man/batctl.8 +++ b/man/batctl.8 @@ -304,6 +304,9 @@ seen by each individual node. .RS 7 List of debug JSONs: .RS 10 +\- neighbors_json|nj +.RE +.RS 10 \- originators_json|oj .RE .RE diff --git a/neighbors_json.c b/neighbors_json.c new file mode 100644 index 0000000..7051c63 --- /dev/null +++ b/neighbors_json.c @@ -0,0 +1,82 @@ +// 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 +#include +#include + +#include "batman_adv.h" +#include "debug.h" +#include "main.h" +#include "netlink.h" +#include "genl_json.h" + +static int neighbors_json_callback(struct nl_msg *msg, void *arg) +{ + struct nlattr *attrs[BATADV_ATTR_MAX+1]; + struct nlmsghdr *nlh = nlmsg_hdr(msg); + struct nlquery_opts *query_opts = arg; + struct json_opts *json_opts; + struct genlmsghdr *ghdr; + + json_opts = container_of(query_opts, struct json_opts, query_opts); + + if (!genlmsg_valid_hdr(nlh, 0)) { + fputs("Received invalid data from kernel.\n", stderr); + exit(1); + } + + ghdr = nlmsg_data(nlh); + + if (ghdr->cmd != BATADV_CMD_GET_NEIGHBORS) + return NL_OK; + + if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0), + genlmsg_len(ghdr), batadv_netlink_policy)) { + fputs("Received invalid data from kernel.\n", stderr); + exit(1); + } + + netlink_print_json_entries(attrs, json_opts); + json_opts->is_first = 0; + + return NL_OK; +} + +static int netlink_print_neighbors_json(struct state *state) +{ + int ret; + struct json_opts json_opts = { + .is_first = 1, + .query_opts = { + .err = 0, + }, + }; + + putc('[', stdout); + ret = netlink_query_common(state, state->mesh_ifindex, + BATADV_CMD_GET_NEIGHBORS, + neighbors_json_callback, + NLM_F_DUMP, &json_opts.query_opts); + puts("]\n"); + + return ret; +} + +static struct debug_json_data batctl_debug_json_neighbors = { + .netlink_fn = netlink_print_neighbors_json, +}; + +COMMAND_NAMED(DEBUGJSON, neighbors_json, "nj", handle_debug_json, + COMMAND_FLAG_MESH_IFACE | COMMAND_FLAG_NETLINK, + &batctl_debug_json_neighbors, ""); From patchwork Thu May 13 14:28:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Sarmanow X-Patchwork-Id: 18326 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 63C7B84078; Thu, 13 May 2021 16:28:37 +0200 (CEST) Received: from mail-ej1-x631.google.com (mail-ej1-x631.google.com [IPv6:2a00:1450:4864:20::631]) by diktynna.open-mesh.org (Postfix) with ESMTPS id 48A9E8020F for ; Thu, 13 May 2021 16:28:24 +0200 (CEST) Received: by mail-ej1-x631.google.com with SMTP id l1so4137557ejb.6 for ; Thu, 13 May 2021 07:28:24 -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=ILXGc7pZPTVZdpBxMudBcnI0m+cQ8P0sZXkvqXOPXaM=; b=RgMj8a1vK1awUP+mBZv/0nK00LhPD7zuNR74c0IYKbX2Kb9Wywn/AjbzZKYfhlkjzA d8z1jR5MCgAryBpsSyAUmEkmsJWoGGXwGrmFo6BEne8VA+L2M95XE1GpObBzdZGCoIHa /kT+ggn7epmR5FFf3RApWhiJWtuCCgqxhOnPC/wdYWKqyUZkD9FqaeSOZOo/K2K6DrA0 +71rs+L/xc5rQ41IY8LSpyjl7WValrodb8DiZ9ckle7wcXPEgscGaGmo+jo3YctJE60b lJ8EHEzNMYdZUR6VbXsFaQQjo6AclyVURJja8P36pfAhkb4NKbG0FXak7M/3JBA/hTDW Yy5g== 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=ILXGc7pZPTVZdpBxMudBcnI0m+cQ8P0sZXkvqXOPXaM=; b=ZzNISU1I7X2N3w8rSoCxkX8RhhD3Eq6VwnudjRX7XZE6Tm294POt924dQL2xrXcA9s 6aW3SznW1uf2/S3gXtTUjnj4/e2RXvQ5m/GDOFjy4ifv9J0sdomi3MPuBEw3E6Eu/FCJ C2WOyPlkdj5R1AkLBuArgQ5ueC3xEuznRGgj4qFGOlS1xZEfpQ7vDsI7EgeScCPs92d2 mQuf6z0AqivKbJSMmJLl4W7A3U7Dr0dslE6EydFs6MeyHaCK4NXx6KburS1u9PVEtubD wwmPxE8vz0Fsto1m7sDSFNKb2JDzdyqwB7O6P/Q041rTKCbt8SZg8+yUbC8lw4uWKdyv kRVQ== X-Gm-Message-State: AOAM531zm2bsHBxOwbYgRj5JeXQhhiP2zd0Nkq7iXR87g6s0RnsqUo9K Jz0ZSvcA2JjcoBgPHlBlH9k= X-Google-Smtp-Source: ABdhPJzI1CddQ99qc0Dbak6K+115l1cH/EAHhFDF2NC9pt2N5jCU5VSoD+Gj+1/sh69At+smJ+zIFQ== X-Received: by 2002:a17:906:2ed0:: with SMTP id s16mr18609548eji.543.1620916103909; Thu, 13 May 2021 07:28:23 -0700 (PDT) Received: from machine.fritz.box (p4fc0a3a3.dip0.t-ipconnect.de. [79.192.163.163]) by smtp.googlemail.com with ESMTPSA id yw9sm1897153ejb.91.2021.05.13.07.28.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 May 2021 07:28:23 -0700 (PDT) From: Alexander Sarmanow To: sven@narfation.org Subject: [PATCH v3 3/4] batctl: transglobal_json: Add transglobal_json command Date: Thu, 13 May 2021 16:28:11 +0200 Message-Id: <20210513142812.1707215-4-asarmanow@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210513142812.1707215-1-asarmanow@gmail.com> References: <20210513142812.1707215-1-asarmanow@gmail.com> MIME-Version: 1.0 ARC-Seal: i=1; s=20121; d=open-mesh.org; t=1620916104; a=rsa-sha256; cv=none; b=tRhk6lDPgzQ51uxnJFovyE2HGEqPTYVzrx3FBzzFN0H7XNIjf+ZReqehCXEekI9rURA34F n4naX9J5X3BppjGuLvNwALx8ixCcRnTHGYwAel56zg/yUG5wEW4RHcPvmCwchYd3LQvmNa 9Il2qdauR2oaj8TFi61Chn+Xw9jSng8= ARC-Authentication-Results: i=1; diktynna.open-mesh.org; dkim=pass header.d=gmail.com header.s=20161025 header.b=RgMj8a1v; spf=pass (diktynna.open-mesh.org: domain of asarmanow@gmail.com designates 2a00:1450:4864:20::631 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=1620916104; 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=ILXGc7pZPTVZdpBxMudBcnI0m+cQ8P0sZXkvqXOPXaM=; b=G4K/q6kb0W5CQQ5mNz9kHcwN6z8hMXKR08uiJjEHPGKniIR6BruhofNapPqYtvCYy20Ff/ a8ReUQ6tgvZH2x8HixagkQD+0ar5GFj1U5W2+RqzNyhCqv08AwzCQCJd2nd5VJSlbiqG6L XjtWMnN3j5yqvvotTWPsw+fQ/VZapFw= Message-ID-Hash: Y26I64RPZJ6SALRECZPMPIMZ3QFKYP54 X-Message-ID-Hash: Y26I64RPZJ6SALRECZPMPIMZ3QFKYP54 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: This is the JSON analogue of the transglobal table. By using the netlink_query_common function to query the available netlink attributes. Signed-off-by: Alexander Sarmanow --- Makefile | 1 + README.rst | 15 +++++++++ man/batctl.8 | 3 ++ transglobal_json.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 transglobal_json.c diff --git a/Makefile b/Makefile index 874dc2f..cea3271 100755 --- a/Makefile +++ b/Makefile @@ -72,6 +72,7 @@ $(eval $(call add_command,throughput_override,y)) $(eval $(call add_command,throughputmeter,y)) $(eval $(call add_command,traceroute,y)) $(eval $(call add_command,transglobal,y)) +$(eval $(call add_command,transglobal_json,y)) $(eval $(call add_command,translate,y)) $(eval $(call add_command,translocal,y)) diff --git a/README.rst b/README.rst index f0ce43a..905e313 100644 --- a/README.rst +++ b/README.rst @@ -687,6 +687,21 @@ Flags that mean: If any of the flags is not enabled, a '.' will substitute its symbol. +batctl transglobal_json +======================= + +display the global translation JSON (analogue of the transglobal table) + +Usage:: + + batctl transglobal_json|tgj + +Example:: + + $ batctl translglobal_json + [{"orig_address":"fe:fe:00:00:01:01","tt_address":"33:33:00:00:00:01","tt_ttvn":3,"last_ttvn":3,"crc32":1916279217,"tt_vid":0,"tt_flags":0,"best":true},{"orig_address":"fe:fe:00:00:01:02","tt_address":"33:33:00:00:00:02","tt_ttvn":3,"last_ttvn":3,"crc32":1916279217,"tt_vid":0,"tt_flags":0}] + + batctl dat_cache ================= diff --git a/man/batctl.8 b/man/batctl.8 index 1130a81..97d5738 100644 --- a/man/batctl.8 +++ b/man/batctl.8 @@ -309,6 +309,9 @@ List of debug JSONs: .RS 10 \- originators_json|oj .RE +.RS 10 +\- transglobal_json|tgj +.RE .RE .br .IP "[\fBmeshif \fP] \fBtranslate\fP|\fBt\fP \fBMAC_address\fP|\fBbat\-host_name\fP|\fBhost_name\fP|\fBIP_address\fP" diff --git a/transglobal_json.c b/transglobal_json.c new file mode 100644 index 0000000..612ffb8 --- /dev/null +++ b/transglobal_json.c @@ -0,0 +1,81 @@ +// 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 +#include + +#include "batman_adv.h" +#include "debug.h" +#include "main.h" +#include "netlink.h" +#include "genl_json.h" + +static int transglobal_json_callback(struct nl_msg *msg, void *arg) +{ + struct nlquery_opts *query_opts = arg; + struct json_opts *json_opts; + struct nlattr *attrs[BATADV_ATTR_MAX+1]; + struct nlmsghdr *nlh = nlmsg_hdr(msg); + struct genlmsghdr *ghdr; + + json_opts = container_of(query_opts, struct json_opts, query_opts); + + if (!genlmsg_valid_hdr(nlh, 0)) { + fputs("Received invalid data from kernel.\n", stderr); + exit(1); + } + + ghdr = nlmsg_data(nlh); + + if (ghdr->cmd != BATADV_CMD_GET_TRANSTABLE_GLOBAL) + return NL_OK; + + if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0), + genlmsg_len(ghdr), batadv_netlink_policy)) { + fputs("Received invalid data from kernel.\n", stderr); + exit(1); + } + + netlink_print_json_entries(attrs, json_opts); + json_opts->is_first = 0; + + return NL_OK; +} + +static int netlink_print_transglobal_json(struct state *state) +{ + int ret; + struct json_opts json_opts = { + .is_first = 1, + .query_opts = { + .err = 0, + }, + }; + + putc('[', stdout); + ret = netlink_query_common(state, state->mesh_ifindex, + BATADV_CMD_GET_TRANSTABLE_GLOBAL, + transglobal_json_callback, + NLM_F_DUMP, &json_opts.query_opts); + puts("]\n"); + + return ret; +} + +static struct debug_json_data batctl_debug_json_transglobal = { + .netlink_fn = netlink_print_transglobal_json, +}; + +COMMAND_NAMED(DEBUGJSON, transglobal_json, "tgj", handle_debug_json, + COMMAND_FLAG_MESH_IFACE | COMMAND_FLAG_NETLINK, + &batctl_debug_json_transglobal, ""); From patchwork Thu May 13 14:28:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Sarmanow X-Patchwork-Id: 18327 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 981FB84073; Thu, 13 May 2021 16:28:44 +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 CE89A8020F for ; Thu, 13 May 2021 16:28:24 +0200 (CEST) Received: by mail-ej1-x630.google.com with SMTP id t4so40217074ejo.0 for ; Thu, 13 May 2021 07:28:24 -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=C+dA3hagLUs4SR61xOx/n4A1X2egaRMHDIiaSHU6wDw=; b=VznyQErJKoL7b7Byk6LDYKpV2et41a61CX2zZDtcB1F1b5MSJ2QV0iopMWus3Cz06y 4VXaNEDh0IA/Cyw/nueqRPsqOLhHTab7UpIwDnJrj6WSe0wq1VDn1QeHRpz2edL8wf6k PAdBEoaNPsDmnHmAAkdV9spTse92s4SZe455aPap3hxf/MagKFbj5RDt6yQjjfFBPMyF dOU7VC3FSFPM9Esw3qBhs6HMZhpDKRdctHJpyxVioNaENEMpW6Mv1HD3rDTWVNYJ79kk 7/RyQmj4s1+gBtnPD9UD63WQbAnjGybDoDpGLPVNqZITSJi5ksXuC1pGFGafTWWAIvsC n5kA== 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=C+dA3hagLUs4SR61xOx/n4A1X2egaRMHDIiaSHU6wDw=; b=hvQjLfiXUvzCYSpTLw3e7zgEkCZntWQuqS2YFNg+G/mEhLdk/R6AEnbVwfFAYNCe6x /IxO9SgNfEDcRhX54csX84HBY0kd0u2ut0pZ14RWUqE1eiGcNfOCZP+sSTYD/OnhFvOC 4/fIABFqxMp1ZQl0P7wUnMXqSFJYgiWj0jeXZRMRG5sX8c013NDgXZ+vpkiLxCqV7ePk MHX2g7Xrw3Zps9PgZNwOHKfHbCPNVObPc1ZtZNaxAPHo9fcU20TrPbbllLQlWlXcw/xl 5au+HZpclW+6gzrafX1WVLQEMm+hQuNfAduFF4yFUNXFpwS5/BpBq6J2WyDagvO2o0tf 8TtQ== X-Gm-Message-State: AOAM533WUxYWqP0hHfI8MyK765IyLhIg7pIWd+T9NxfmkPkg2kzSR323 Vz/3dg6O9K8XYVqvf9Q/TACsgOGZ+FPVlg4Z6Ns= X-Google-Smtp-Source: ABdhPJw+xlSASsGT+3cjdiVN3MxYpq8L0A2QAxUF2MV7UJCR7pjrY82S39+KDxbvkAtRT1NMnZhrZA== X-Received: by 2002:a17:906:8a51:: with SMTP id gx17mr43642888ejc.549.1620916104416; Thu, 13 May 2021 07:28:24 -0700 (PDT) Received: from machine.fritz.box (p4fc0a3a3.dip0.t-ipconnect.de. [79.192.163.163]) by smtp.googlemail.com with ESMTPSA id yw9sm1897153ejb.91.2021.05.13.07.28.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 May 2021 07:28:24 -0700 (PDT) From: Alexander Sarmanow To: sven@narfation.org Subject: [PATCH v3 4/4] batctl: translocal_json: Add translocal_json command Date: Thu, 13 May 2021 16:28:12 +0200 Message-Id: <20210513142812.1707215-5-asarmanow@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210513142812.1707215-1-asarmanow@gmail.com> References: <20210513142812.1707215-1-asarmanow@gmail.com> MIME-Version: 1.0 ARC-Seal: i=1; s=20121; d=open-mesh.org; t=1620916104; a=rsa-sha256; cv=none; b=uuppWZSeKqAn0wvkDU5kMTjWFMsuHH7+CmML8iJZm67TRrDnhENjP0oNSU80iAYFHatWtu ECfqfxG8WmOmo8WsWRydEAT17O428O+dBwPk9GiLPRaoW/AD8kW8Y7weTOfQOIBAVF1AWz TIgbUOdJ3Oma5myr/UxFvIhYpOzMfGg= ARC-Authentication-Results: i=1; diktynna.open-mesh.org; dkim=pass header.d=gmail.com header.s=20161025 header.b=VznyQErJ; 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=1620916104; 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=C+dA3hagLUs4SR61xOx/n4A1X2egaRMHDIiaSHU6wDw=; b=gkJJTKoof/78M+/0ytnwNYcl0MBx5WDmRF/lzpqLEzkn1YklbhTOFPYYsztcV76Ryjesva w4Va+pG4nj6mpn9dB4o2iig+vD4NXNfJJORaqSGIN39Yk9iIn2remKvGtVv2itEEfiEuTQ g6u51pzgJVu1EMAGRX6n+vd1Ed+XVWo= Message-ID-Hash: A6IJVEOEM6TLZZ2BNQUAJDF5HEO5IPIP X-Message-ID-Hash: A6IJVEOEM6TLZZ2BNQUAJDF5HEO5IPIP 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: This is the JSON analogue of the translocal table. By using the netlink_query_common function to query the available netlink attributes. Signed-off-by: Alexander Sarmanow --- Makefile | 1 + README.rst | 15 +++++++++ man/batctl.8 | 3 ++ translocal_json.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 translocal_json.c diff --git a/Makefile b/Makefile index cea3271..8afbdbe 100755 --- a/Makefile +++ b/Makefile @@ -75,6 +75,7 @@ $(eval $(call add_command,transglobal,y)) $(eval $(call add_command,transglobal_json,y)) $(eval $(call add_command,translate,y)) $(eval $(call add_command,translocal,y)) +$(eval $(call add_command,translocal_json,y)) MANPAGE = man/batctl.8 diff --git a/README.rst b/README.rst index 905e313..065c0ab 100644 --- a/README.rst +++ b/README.rst @@ -651,6 +651,21 @@ W/Wireless: If any of the flags is not enabled, a '.' will substitute its symbol. +batctl translocal_json +====================== + +display the local translation JSON (analogue of the translocal table) + +Usage:: + + batctl translocal_json|tlj + +Example:: + + $ batctl translocal_json + [{"tt_address":"33:33:00:00:00:01","crc32":2147984693,"tt_vid":0,"tt_flags":256},{"tt_address":"33:33:00:00:00:01","crc32":2147984693,"tt_vid":0,"tt_flags":256},{"tt_address":"11:11:00:00:00:03","crc32":2147984693,"tt_vid":0,"tt_flags":256}] + + batctl transglobal ================== diff --git a/man/batctl.8 b/man/batctl.8 index 97d5738..2b8a975 100644 --- a/man/batctl.8 +++ b/man/batctl.8 @@ -310,6 +310,9 @@ List of debug JSONs: \- originators_json|oj .RE .RS 10 +\- translocal_json|tlj +.RE +.RS 10 \- transglobal_json|tgj .RE .RE diff --git a/translocal_json.c b/translocal_json.c new file mode 100644 index 0000000..38b64a0 --- /dev/null +++ b/translocal_json.c @@ -0,0 +1,81 @@ +// 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 +#include + +#include "batman_adv.h" +#include "debug.h" +#include "main.h" +#include "netlink.h" +#include "genl_json.h" + +static int translocal_json_callback(struct nl_msg *msg, void *arg) +{ + struct nlquery_opts *query_opts = arg; + struct json_opts *json_opts; + struct nlattr *attrs[BATADV_ATTR_MAX+1]; + struct nlmsghdr *nlh = nlmsg_hdr(msg); + struct genlmsghdr *ghdr; + + json_opts = container_of(query_opts, struct json_opts, query_opts); + + if (!genlmsg_valid_hdr(nlh, 0)) { + fputs("Received invalid data from kernel.\n", stderr); + exit(1); + } + + ghdr = nlmsg_data(nlh); + + if (ghdr->cmd != BATADV_CMD_GET_TRANSTABLE_LOCAL) + return NL_OK; + + if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0), + genlmsg_len(ghdr), batadv_netlink_policy)) { + fputs("Received invalid data from kernel.\n", stderr); + exit(1); + } + + netlink_print_json_entries(attrs, json_opts); + json_opts->is_first = 0; + + return NL_OK; +} + +static int netlink_print_translocal_json(struct state *state) +{ + int ret; + struct json_opts json_opts = { + .is_first = 1, + .query_opts = { + .err = 0, + }, + }; + + putc('[', stdout); + ret = netlink_query_common(state, state->mesh_ifindex, + BATADV_CMD_GET_TRANSTABLE_LOCAL, + translocal_json_callback, + NLM_F_DUMP, &json_opts.query_opts); + puts("]\n"); + + return ret; +} + +static struct debug_json_data batctl_debug_json_translocal = { + .netlink_fn = netlink_print_translocal_json, +}; + +COMMAND_NAMED(DEBUGJSON, translocal_json, "tlj", handle_debug_json, + COMMAND_FLAG_MESH_IFACE | COMMAND_FLAG_NETLINK, + &batctl_debug_json_translocal, "");