lua-ethtool-stats: remove
This commit is contained in:
parent
651b11ac35
commit
fea8f67d5d
|
@ -1,34 +0,0 @@
|
|||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=lua-ethtool-stats
|
||||
PKG_VERSION:=1
|
||||
|
||||
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/lua-ethtool-stats
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
TITLE:=Lua libary to obtain interface stats via ethtool
|
||||
DEPENDS:=+lua
|
||||
endef
|
||||
|
||||
define Build/Prepare
|
||||
mkdir -p $(PKG_BUILD_DIR)
|
||||
$(CP) ./src/* $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
CFLAGS="$(TARGET_CFLAGS)" CPPFLAGS="$(TARGET_CPPFLAGS)" $(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS)
|
||||
endef
|
||||
|
||||
define Package/lua-ethtool-stats/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua
|
||||
$(CP) $(PKG_BUILD_DIR)/ethtool_stats.so $(1)/usr/lib/lua/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,lua-ethtool-stats))
|
|
@ -1,7 +0,0 @@
|
|||
This package provides a Lua module with the name 'ethtool_stats'. The module has
|
||||
a single function, interface_stats().
|
||||
|
||||
interface_stats() expects one parameter, the name of the interface to get the
|
||||
stats from. It returns a table with string keys and numeric values which
|
||||
contains the stats returned by ethtool (the same `ethtool -S interface` would
|
||||
yield).
|
|
@ -1,6 +0,0 @@
|
|||
all: ethtool_stats.so
|
||||
|
||||
CFLAGS += -Wall
|
||||
|
||||
ethtool_stats.so: ethtool_stats.c
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -shared -fPIC -o $@ $^ $(LDLIBS)
|
|
@ -1,170 +0,0 @@
|
|||
|
||||
/*
|
||||
Copyright (c) 2014, Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <net/if.h>
|
||||
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/sockios.h>
|
||||
|
||||
#include <lua.h>
|
||||
#include <lauxlib.h>
|
||||
#include <lualib.h>
|
||||
|
||||
|
||||
struct stats_context {
|
||||
struct ifreq ifr;
|
||||
int fd;
|
||||
|
||||
struct ethtool_gstrings *strings;
|
||||
struct ethtool_stats *stats;
|
||||
};
|
||||
|
||||
|
||||
static inline void do_ioctl(lua_State *L, struct stats_context *ctx, void *data) {
|
||||
ctx->ifr.ifr_data = data;
|
||||
if (ioctl(ctx->fd, SIOCETHTOOL, &ctx->ifr) < 0)
|
||||
luaL_error(L, "ioctl: %s", strerror(errno));
|
||||
}
|
||||
|
||||
static inline uint32_t get_stats_length(lua_State *L, struct stats_context *ctx) {
|
||||
const size_t sset_info_len = sizeof(struct ethtool_sset_info) + sizeof(uint32_t);
|
||||
struct ethtool_sset_info *sset_info = alloca(sset_info_len);
|
||||
memset(sset_info, 0, sset_info_len);
|
||||
|
||||
sset_info->cmd = ETHTOOL_GSSET_INFO;
|
||||
sset_info->sset_mask = 1ull << ETH_SS_STATS;
|
||||
do_ioctl(L, ctx, sset_info);
|
||||
|
||||
return sset_info->sset_mask ? sset_info->data[0] : 0;
|
||||
}
|
||||
|
||||
static inline void get_stats_strings(lua_State *L, struct stats_context *ctx) {
|
||||
uint32_t n_stats = get_stats_length(L, ctx);
|
||||
|
||||
if (!n_stats)
|
||||
return;
|
||||
|
||||
ctx->strings = calloc(1, sizeof(*ctx->strings) + n_stats * ETH_GSTRING_LEN);
|
||||
if (!ctx->strings) {
|
||||
luaL_error(L, "calloc: %s", strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
ctx->strings->cmd = ETHTOOL_GSTRINGS;
|
||||
ctx->strings->string_set = ETH_SS_STATS;
|
||||
ctx->strings->len = n_stats;
|
||||
|
||||
do_ioctl(L, ctx, ctx->strings);
|
||||
}
|
||||
|
||||
static inline int get_stats(lua_State *L, struct stats_context *ctx) {
|
||||
get_stats_strings(L, ctx);
|
||||
|
||||
if (!ctx->strings) {
|
||||
lua_newtable(L);
|
||||
return 1;
|
||||
}
|
||||
|
||||
ctx->stats = calloc(1, sizeof(struct ethtool_stats) + ctx->strings->len * sizeof(uint64_t));
|
||||
if (!ctx->stats)
|
||||
return luaL_error(L, "calloc: %s", strerror(errno));
|
||||
|
||||
ctx->stats->cmd = ETHTOOL_GSTATS;
|
||||
ctx->stats->n_stats = ctx->strings->len;
|
||||
|
||||
do_ioctl(L, ctx, ctx->stats);
|
||||
|
||||
lua_createtable(L, 0, ctx->strings->len);
|
||||
|
||||
size_t i;
|
||||
for (i = 0; i < ctx->strings->len; i++) {
|
||||
const char *key = (const char*)&ctx->strings->data[i * ETH_GSTRING_LEN];
|
||||
lua_pushlstring(L, key, strnlen(key, ETH_GSTRING_LEN));
|
||||
lua_pushnumber(L, (lua_Number)ctx->stats->data[i]);
|
||||
lua_settable(L, -3);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int interface_stats(lua_State *L) {
|
||||
const char *ifname = luaL_checkstring(L, 1);
|
||||
|
||||
struct stats_context *ctx = lua_newuserdata(L, sizeof(*ctx));
|
||||
memset(ctx, 0, sizeof(*ctx));
|
||||
|
||||
luaL_getmetatable(L, "ethtool_stats.ctx");
|
||||
lua_setmetatable(L, -2);
|
||||
|
||||
strncpy(ctx->ifr.ifr_name, ifname, IFNAMSIZ);
|
||||
|
||||
ctx->fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (ctx->fd < 0)
|
||||
return luaL_error(L, "socket: %s", strerror(errno));
|
||||
|
||||
return get_stats(L, ctx);
|
||||
}
|
||||
|
||||
static int ctx_gc(lua_State *L) {
|
||||
struct stats_context *ctx = lua_touserdata(L, 1);
|
||||
|
||||
if (ctx->fd >= 0)
|
||||
close(ctx->fd);
|
||||
|
||||
free(ctx->strings);
|
||||
free(ctx->stats);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const luaL_reg R[] = {
|
||||
{"interface_stats", interface_stats},
|
||||
{NULL, NULL },
|
||||
};
|
||||
|
||||
LUALIB_API int luaopen_ethtool_stats(lua_State *L) {
|
||||
luaL_newmetatable(L, "ethtool_stats.ctx");
|
||||
lua_pushstring(L, "__gc");
|
||||
lua_pushcfunction(L, ctx_gc);
|
||||
lua_settable(L, -3);
|
||||
|
||||
luaL_register(L, "ethtool_stats", R);
|
||||
return 1;
|
||||
}
|
Loading…
Reference in New Issue