Wireshark-dev: [Wireshark-dev] patch for wslua to support getting ranges from ranges
From: Sam Roberts <vieuxtech@xxxxxxxxx>
Date: Fri, 5 Jun 2009 14:08:16 -0700
Useful when you want to pull a buffer range out, and then parse that range. For example, packets like: uint16 count uint8 flag uint32 payload -- ... flag and payload is repeated count times It's nice to be able to pull each substructure out as a Tvbr, then pass it to a function that will parse it assuming offset zero is the flag, and bytes 1-5 are the payload, tracking the current position in the Tvb/buffer becomes easier. Cheers, Sam
Index: epan/wslua/wslua_tvb.c
===================================================================
--- epan/wslua/wslua_tvb.c (revision 28639)
+++ epan/wslua/wslua_tvb.c (working copy)
@@ -864,6 +865,46 @@
WSLUA_RETURN(1); /* The ByteArray */
}
+WSLUA_METHOD TvbRange_bitfield(lua_State* L) {
+ /* Get a bitfield from a TvbRange. */
+#define WSLUA_OPTARG_TvbRange_bitfield_POSITION 2 /* The bit offset from the begining of the TvbRange. Defaults to 0. */
+#define WSLUA_OPTARG_TvbRange_bitfield_LENGTH 3 /* The length (in bits) of the field. Defaults to 1. */
+
+ TvbRange tvbr = checkTvbRange(L,1);
+ int pos = luaL_optint(L,WSLUA_OPTARG_TvbRange_bitfield_POSITION,0);
+ int len = luaL_optint(L,WSLUA_OPTARG_TvbRange_bitfield_LENGTH,1);
+
+ if (!(tvbr && tvbr->tvb)) return 0;
+ if (tvbr->tvb->expired) {
+ luaL_error(L,"expired tvb");
+ return 0;
+ }
+
+ if ((pos+len) > (tvbr->len<<3)) {
+ luaL_error(L, "Requested bitfield out of range");
+ return 0;
+ }
+
+ if (len <= 8) {
+ lua_pushnumber(L,(lua_Number)tvb_get_bits8(tvbr->tvb->ws_tvb,tvbr->offset*8 + pos, len));
+ return 1;
+ } else if (len <= 16) {
+ lua_pushnumber(L,tvb_get_bits16(tvbr->tvb->ws_tvb,tvbr->offset*8 + pos, len, FALSE));
+ return 1;
+ } else if (len <= 32) {
+ lua_pushnumber(L,tvb_get_bits32(tvbr->tvb->ws_tvb,tvbr->offset*8 + pos, len, FALSE));
+ return 1;
+ } else if (len <= 64) {
+ UInt64 num = g_malloc(sizeof(guint64));
+ *num = tvb_get_bits64(tvbr->tvb->ws_tvb,tvbr->offset*8 + pos, len, FALSE);
+ pushUInt64(L,num);
+ return 1;
+ } else {
+ luaL_error(L,"TvbRange:bitfield() does not handle %d bits",len);
+ return 0;
+ }
+}
+
WSLUA_METHOD TvbRange_len(lua_State* L) {
/* Obtain the length of a TvbRange */
TvbRange tvbr = checkTvbRange(L,1);
@@ -890,7 +931,33 @@
return 1;
}
+WSLUA_METHOD TvbRange_range(lua_State* L) {
+ /* Creates a sub-TbvRange from this TvbRange. This is used also as the TvbRange:__call() metamethod. */
+#define WSLUA_OPTARG_TvbRange_range_OFFSET 2 /* The offset (in octets) from the begining of the TvbRange. Defaults to 0. */
+#define WSLUA_OPTARG_TvbRange_range_LENGTH 3 /* The length (in octets) of the range. Defaults to until the end of the TvbRange. */
+ TvbRange tvbr = checkTvbRange(L,1);
+ int offset;
+ int len;
+
+ if (!tvbr) return 0;
+
+ offset = luaL_optint(L,WSLUA_OPTARG_TvbRange_range_OFFSET,0);
+ len = luaL_optint(L,WSLUA_OPTARG_TvbRange_range_LENGTH,tvbr->len-offset);
+
+ if (offset >= tvbr->len || (len + offset) > tvbr->len) {
+ luaL_error(L,"Range is out of bounds");
+ return 0;
+ }
+
+ if ((tvbr = new_TvbRange(L,tvbr->tvb->ws_tvb,tvbr->offset+offset,len))) {
+ PUSH_TVBRANGE(L,tvbr);
+ WSLUA_RETURN(1); /* The TvbRange */
+ }
+
+ return 0;
+}
+
WSLUA_METAMETHOD TvbRange__tostring(lua_State* L) {
/* Converts the TvbRange into a string. As the string gets truncated
you should use this only for debugging purposes
@@ -916,17 +983,20 @@
{"le_float", TvbRange_le_float},
{"ether", TvbRange_ether},
{"ipv4", TvbRange_ipv4},
- {"le_ipv4", TvbRange_le_ipv4},
+ {"le_ipv4", TvbRange_le_ipv4},
{"string", TvbRange_string},
{"bytes", TvbRange_bytes},
{"len", TvbRange_len},
{"offset", TvbRange_offset},
+ {"range", TvbRange_range},
{"tvb", Tvb_tvb},
{ NULL, NULL }
};
static const luaL_reg TvbRange_meta[] = {
{"__tostring", TvbRange__tostring},
+ {"__call", TvbRange_range},
{ NULL, NULL }
};
- Prev by Date: Re: [Wireshark-dev] [Wireshark-users] bit operations are missingfrom lua bindings?
- Next by Date: Re: [Wireshark-dev] On Copy as Filter
- Previous by thread: Re: [Wireshark-dev] Help with adding/displaying a particular type of field to a subtree
- Next by thread: Re: [Wireshark-dev] On Copy as Filter
- Index(es):