aboutsummaryrefslogtreecommitdiffstats
path: root/epan/wslua
diff options
context:
space:
mode:
authorSnaipe <franklinmathieu@gmail.com>2016-10-25 00:56:37 +0200
committerMichael Mann <mmann78@netscape.net>2016-10-25 19:18:35 +0000
commitd8db5646efc17dec73426e3745a9c9ef704a91c7 (patch)
tree005af28a93d9a82fc9a2381e9d256bdf8a77c4cf /epan/wslua
parent60a926dc32dfc5333961752e902c19d83b98d2ca (diff)
lua: Added support for FT_IPv6 fields
* Implement Tvb:ipv6() * Handle FT_IPv6 protofields during insertion in the lua tree * Implement Address.ipv6(hostname) Change-Id: I585c392681b3aef02ed8ee956f74051d77fb28d4 Signed-off-by: Franklin "Snaipe" Mathieu <snaipe@diacritic.io> Reviewed-on: https://code.wireshark.org/review/18442 Reviewed-by: Peter Wu <peter@lekensteyn.nl> Petri-Dish: Peter Wu <peter@lekensteyn.nl> Tested-by: Peter Wu <peter@lekensteyn.nl> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/wslua')
-rw-r--r--epan/wslua/wslua_address.c25
-rw-r--r--epan/wslua/wslua_tree.c22
-rw-r--r--epan/wslua/wslua_tvb.c24
3 files changed, 61 insertions, 10 deletions
diff --git a/epan/wslua/wslua_address.c b/epan/wslua/wslua_address.c
index d4e5694f36..5524eb2800 100644
--- a/epan/wslua/wslua_address.c
+++ b/epan/wslua/wslua_address.c
@@ -39,7 +39,7 @@
WSLUA_CLASS_DEFINE(Address,FAIL_ON_NULL("Address")); /* Represents an address. */
WSLUA_CONSTRUCTOR Address_ip(lua_State* L) {
- /* Creates an Address Object representing an IP address. */
+ /* Creates an Address Object representing an IPv4 address. */
#define WSLUA_ARG_Address_ip_HOSTNAME 1 /* The address or name of the IP host. */
Address addr = (Address)g_malloc(sizeof(address));
@@ -55,16 +55,25 @@ WSLUA_CONSTRUCTOR Address_ip(lua_State* L) {
WSLUA_RETURN(1); /* The Address object. */
}
-#if 0
-/* TODO */
-static int Address_ipv6(lua_State* L) {
- Address addr = g_malloc(sizeof(address));
+WSLUA_CONSTRUCTOR Address_ipv6(lua_State* L) {
+ /* Creates an Address Object representing an IPv6 address. */
- /* alloc_address() */
+#define WSLUA_ARG_Address_ipv6_HOSTNAME 1 /* The address or name of the IP host. */
+ Address addr = (Address)g_malloc(sizeof(address));
+ struct e_in6_addr ip_addr;
+ const gchar* name = luaL_checkstring(L,WSLUA_ARG_Address_ipv6_HOSTNAME);
+
+ if (!get_host_ipaddr6(name, &ip_addr)) {
+ memset(&ip_addr, 0, sizeof(ip_addr));
+ }
+ alloc_address_wmem(NULL, addr, AT_IPv6, sizeof(ip_addr.bytes), &ip_addr.bytes);
pushAddress(L,addr);
- return 1;
+ WSLUA_RETURN(1); /* The Address object */
}
+
+#if 0
+/* TODO */
static int Address_ss7(lua_State* L) {
Address addr = g_malloc(sizeof(address));
@@ -166,8 +175,8 @@ static int Address_tipc(lua_State* L) {
WSLUA_METHODS Address_methods[] = {
WSLUA_CLASS_FNREG(Address,ip),
WSLUA_CLASS_FNREG_ALIAS(Address,ipv4,ip),
-#if 0
WSLUA_CLASS_FNREG(Address,ipv6),
+#if 0
WSLUA_CLASS_FNREG_ALIAS(Address,ss7pc,ss7),
WSLUA_CLASS_FNREG(Address,eth),
WSLUA_CLASS_FNREG(Address,sna},
diff --git a/epan/wslua/wslua_tree.c b/epan/wslua/wslua_tree.c
index 8e824a8eeb..46ce4ad9ec 100644
--- a/epan/wslua/wslua_tree.c
+++ b/epan/wslua/wslua_tree.c
@@ -407,11 +407,29 @@ static int TreeItem_add_item_any(lua_State *L, gboolean little_endian) {
item = proto_tree_add_int64(tree_item->tree,hfid,tvbr->tvb->ws_tvb,tvbr->offset,tvbr->len,checkInt64(L,1));
break;
case FT_IPv4:
- item = proto_tree_add_ipv4(tree_item->tree,hfid,tvbr->tvb->ws_tvb,tvbr->offset,tvbr->len,*((const guint32*)(checkAddress(L,1)->data)));
+ {
+ Address addr = checkAddress(L,1);
+ if (addr->type != AT_IPv4) {
+ luaL_error(L, "Expected IPv4 address for FT_IPv4 field");
+ return 0;
+ }
+
+ item = proto_tree_add_ipv4(tree_item->tree,hfid,tvbr->tvb->ws_tvb,tvbr->offset,tvbr->len,*((const guint32*)(addr->data)));
+ }
+ break;
+ case FT_IPv6:
+ {
+ Address addr = checkAddress(L,1);
+ if (addr->type != AT_IPv6) {
+ luaL_error(L, "Expected IPv6 address for FT_IPv6 field");
+ return 0;
+ }
+
+ item = proto_tree_add_ipv6(tree_item->tree, hfid, tvbr->tvb->ws_tvb, tvbr->offset, tvbr->len, (struct e_in6_addr *)addr->data);
+ }
break;
case FT_ETHER:
case FT_UINT_BYTES:
- case FT_IPv6:
case FT_IPXNET:
case FT_GUID:
case FT_OID:
diff --git a/epan/wslua/wslua_tvb.c b/epan/wslua/wslua_tvb.c
index e10ff394d8..5d12df941e 100644
--- a/epan/wslua/wslua_tvb.c
+++ b/epan/wslua/wslua_tvb.c
@@ -794,6 +794,29 @@ WSLUA_METHOD TvbRange_le_ipv4(lua_State* L) {
WSLUA_RETURN(1); /* The IPv4 `Address` object. */
}
+WSLUA_METHOD TvbRange_ipv6(lua_State* L) {
+ /* Get an IPv6 Address from a `TvbRange`, as an `Address` object. */
+ TvbRange tvbr = checkTvbRange(L,1);
+ Address addr;
+
+ if ( !(tvbr && tvbr->tvb)) return 0;
+ if (tvbr->tvb->expired) {
+ luaL_error(L,"expired tvb");
+ return 0;
+ }
+
+ if (tvbr->len != 16) {
+ WSLUA_ERROR(TvbRange_ipv6,"The range must be 16 octets long");
+ return 0;
+ }
+
+ addr = g_new(address,1);
+ alloc_address_tvb(NULL,addr,AT_IPv6,16,tvbr->tvb->ws_tvb,tvbr->offset);
+ pushAddress(L,addr);
+
+ WSLUA_RETURN(1); /* The IPv6 `Address` object. */
+}
+
WSLUA_METHOD TvbRange_ether(lua_State* L) {
/* Get an Ethernet Address from a `TvbRange`, as an `Address` object. */
TvbRange tvbr = checkTvbRange(L,1);
@@ -1372,6 +1395,7 @@ WSLUA_METHODS TvbRange_methods[] = {
WSLUA_CLASS_FNREG(TvbRange,ether),
WSLUA_CLASS_FNREG(TvbRange,ipv4),
WSLUA_CLASS_FNREG(TvbRange,le_ipv4),
+ WSLUA_CLASS_FNREG(TvbRange,ipv6),
WSLUA_CLASS_FNREG(TvbRange,nstime),
WSLUA_CLASS_FNREG(TvbRange,le_nstime),
WSLUA_CLASS_FNREG(TvbRange,string),