-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

hi

neightbl is a lua lib for reading mac,ip6 table from kernel

Signed-off-by: Patrick Grimm <patrick at lunatiki.de>

- --- /dev/null 2013-02-17 21:23:56.068000000 +0100
+++ lang/luaneightbl/Makefile   2013-03-20 10:03:46.000000000 +0100
@@ -0,0 +1,57 @@
+#
+# Copyright (C) 2012-2013 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+# $Id$
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=luaneightbl
+PKG_VERSION:=0.2
+PKG_RELEASE:=1
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/luaneightbl
+  SUBMENU:=Lua
+  SECTION:=lang
+  CATEGORY:=Languages
+  TITLE:=neightbl - Lua lib for IPv6 neighbors
+  DEPENDS:=+liblua +lua
+endef
+
+define Package/luaneightbl/description
+ neightbl is a lua lib for reading mac,ip6 table from kernel
+endef
+
+
+define Build/Prepare
+       mkdir -p $(PKG_BUILD_DIR)
+       $(CP) ./src/* $(PKG_BUILD_DIR)/
+endef
+
+TARGET_CFLAGS += \
+       -I$(STAGING_DIR)/usr/include \
+       -D_GNU_SOURCE
+
+MAKE_FLAGS += \
+       FPIC="$(FPIC)" \
+       CFLAGS="$(TARGET_CFLAGS)" \
+       LDFLAGS="$(TARGET_LDFLAGS)" \
+
+define Build/InstallDev
+       $(INSTALL_DIR) $(1)/usr/lib/lua
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/neightbl.so $(1)/usr/lib/lua/neightbl.so
+endef
+
+define Package/luaneightbl/install
+       $(INSTALL_DIR) $(1)/usr/lib/lua
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/neightbl.so $(1)/usr/lib/lua
+endef
+
+
+$(eval $(call BuildPackage,luaneightbl))
- --- /dev/null 2013-02-17 21:23:56.068000000 +0100
+++ lang/luaneightbl/src/Makefile       2013-02-04 20:14:13.000000000 +0100
@@ -0,0 +1,13 @@
+NEIGHTBL_CFLAGS      = $(CFLAGS) -std=gnu99 -fstrict-aliasing -Iinclude
+NEIGHTBL_LIB         = neightbl.so
+NEIGHTBL_LIB_LDFLAGS = $(LDFLAGS) -shared -L.-llua
+NEIGHTBL_LIB_OBJ     = neightbl.o
+
+%.o: %.c
+       $(CC) $(NEIGHTBL_CFLAGS) $(FPIC) -c -o $@ $<
+
+compile: clean $(NEIGHTBL_LIB_OBJ)
+       $(CC) $(NEIGHTBL_LIB_LDFLAGS) -o $(NEIGHTBL_LIB) $(NEIGHTBL_LIB_OBJ)
+
+clean:
+       rm -f *.o $(IWINFO_LIB) $(IWINFO_LUA) $(IWINFO_CLI)
- --- /dev/null 2013-02-17 21:23:56.068000000 +0100
+++ lang/luaneightbl/src/neightbl.c     2013-02-05 13:35:41.000000000 +0100
@@ -0,0 +1,122 @@
+/*
+License:
+Copyright 2013 Steven Barth <[email protected]>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+#include <stdlib.h>
+#include <stdbool.h>
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+#include <linux/rtnetlink.h>
+#include <sys/socket.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <net/if.h>
+#include <arpa/inet.h>
+#include <netinet/ether.h>
+
+char *ether_ntoa_l (const struct ether_addr *addr, char *buf)
+{
+  sprintf (buf, "%02x:%02x:%02x:%02x:%02x:%02x",
+           addr->ether_addr_octet[0], addr->ether_addr_octet[1],
+           addr->ether_addr_octet[2], addr->ether_addr_octet[3],
+           addr->ether_addr_octet[4], addr->ether_addr_octet[5]);
+  return buf;
+}
+
+static int neightbl_get(lua_State *L) {
+       int sock = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE);
+       struct sockaddr_nl kernel = {AF_NETLINK, 0, 0, 0};
+       if (connect(sock, (struct sockaddr*)&kernel, sizeof(kernel)))
+               goto error;
+
+       const char *ifname = luaL_checkstring(L, 1);
+       int ifindex = if_nametoindex(ifname);
+       if (ifindex <= 0)
+               goto error;
+
+       struct {
+               struct nlmsghdr hdr;
+               struct ndmsg ndm;
+       } req = {
+               {sizeof(req), RTM_GETNEIGH, NLM_F_REQUEST | NLM_F_DUMP, 1, 0},
+               {AF_INET6, 0, 0, ifindex, 0, 0, 0},
+       };
+
+       if (send(sock, &req, sizeof(req), 0) != sizeof(req))
+               goto error;
+
+       lua_newtable(L);
+
+       char buf[8192];
+       struct nlmsghdr *nh = (struct nlmsghdr*)buf;
+       do {
+               ssize_t len = recv(sock, buf, sizeof(buf), 0);
+               if (len < 0) {
+                       lua_pop(L, 1);
+                       goto error;
+               }
+
+
+               for (;NLMSG_OK(nh, (size_t)len) && nh->nlmsg_type == 
RTM_NEWNEIGH;
+                               nh = NLMSG_NEXT(nh, len)) {
+                       struct ndmsg *ndm = NLMSG_DATA(nh);
+                       if (NLMSG_PAYLOAD(nh, 0) < sizeof(*ndm) || 
ndm->ndm_ifindex != ifindex)
+                               continue;
+
+                       ssize_t alen = NLMSG_PAYLOAD(nh, sizeof(*ndm));
+                       char buf[INET6_ADDRSTRLEN] = {0}, *mac = NULL, 
str_buf[ETH_ALEN];
+                       for (struct rtattr *rta = (struct rtattr*)&ndm[1]; 
RTA_OK(rta, alen);
+                                       rta = RTA_NEXT(rta, alen)) {
+                               if (rta->rta_type == NDA_DST && 
RTA_PAYLOAD(rta) >= sizeof(struct in6_addr))
+                                       inet_ntop(AF_INET6, RTA_DATA(rta), buf, 
sizeof(buf));
+                               else if (rta->rta_type == NDA_LLADDR && 
RTA_PAYLOAD(rta) >= 6)
+                                       mac = 
ether_ntoa_l(RTA_DATA(rta),str_buf);
+                       }
+
+                       if (mac)
+                               lua_pushstring(L, mac);
+                       else
+                               lua_pushboolean(L, false);
+
+                       lua_setfield(L, -2, buf);
+               }
+       } while (nh->nlmsg_type == RTM_NEWNEIGH);
+
+       close(sock);
+        return 1;
+
+error:
+       close(sock);
+       lua_pushnil(L);
+       lua_pushinteger(L, errno);
+       lua_pushstring(L, strerror(errno));
+       return 3;
+}
+
+
+static const luaL_reg R[] = {
+        {"get", neightbl_get},
+        {NULL, NULL}
+};
+
+
+int luaopen_neightbl(lua_State *l)
+{
+       luaL_register(l, "neightbl", R);
+       return 1;
+}
-----BEGIN PGP SIGNATURE-----
Version: GnuPG/MacGPG2 v2.0.18 (Darwin)
Comment: GPGTools - http://gpgtools.org
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iEYEARECAAYFAlFJfXUACgkQr9m0OkMZoqR2vQCg8jpW2GhFy+rBAeUxHbV6EVtl
+vgAoON+/emvdE/JvntEECPiBLnw+f+G
=uKak
-----END PGP SIGNATURE-----
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to