diff options
author | Snaipe <franklinmathieu@gmail.com> | 2016-10-25 00:56:37 +0200 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2016-10-25 19:18:35 +0000 |
commit | d8db5646efc17dec73426e3745a9c9ef704a91c7 (patch) | |
tree | 005af28a93d9a82fc9a2381e9d256bdf8a77c4cf /epan/wslua | |
parent | 60a926dc32dfc5333961752e902c19d83b98d2ca (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.c | 25 | ||||
-rw-r--r-- | epan/wslua/wslua_tree.c | 22 | ||||
-rw-r--r-- | epan/wslua/wslua_tvb.c | 24 |
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), |