summaryrefslogtreecommitdiff
path: root/epan/wslua/wslua_pinfo.c
diff options
context:
space:
mode:
authorLuis Ontanon <luis.ontanon@gmail.com>2006-09-25 01:09:00 +0000
committerLuis Ontanon <luis.ontanon@gmail.com>2006-09-25 01:09:00 +0000
commit6462d05044d74e475253518912c0635222bd7fc2 (patch)
tree32834c107cb9baab32f865999d3d69d877452e71 /epan/wslua/wslua_pinfo.c
parent299469d48d57337e6381f2d5363ece52c9a36d37 (diff)
downloadwireshark-6462d05044d74e475253518912c0635222bd7fc2.tar.gz
Move the Lua interface into epan... (not a plugin anymore).
- Rename Tap into Listener - add a mechanism to pass protocols' tap data to the Listener svn path=/trunk/; revision=19319
Diffstat (limited to 'epan/wslua/wslua_pinfo.c')
-rw-r--r--epan/wslua/wslua_pinfo.c888
1 files changed, 888 insertions, 0 deletions
diff --git a/epan/wslua/wslua_pinfo.c b/epan/wslua/wslua_pinfo.c
new file mode 100644
index 0000000000..9037505857
--- /dev/null
+++ b/epan/wslua/wslua_pinfo.c
@@ -0,0 +1,888 @@
+/*
+ * wslua_pinfo.c
+ *
+ * Wireshark's interface to the Lua Programming Language
+ *
+ * (c) 2006, Luis E. Garcia Ontanon <luis.ontanon@gmail.com>
+ *
+ * $Id: wslua_pinfo.c 18231 2006-05-28 16:32:49Z etxrab $
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "wslua.h"
+
+#include <epan/addr_resolv.h>
+#include <string.h>
+
+
+/*
+ * NULLify lua userdata to avoid crashing when trying to
+ * access saved copies of invalid stuff.
+ *
+ * see comment on lua_tvb.c
+ */
+
+static GPtrArray* outstanding_stuff = NULL;
+
+void clear_outstanding_pinfos(void) {
+ while (outstanding_stuff->len) {
+ void** p = (void**)g_ptr_array_remove_index_fast(outstanding_stuff,0);
+ *p = NULL;
+ }
+}
+
+void* push_Pinfo(lua_State* L, Pinfo pinfo) {
+ void** p = (void**)pushPinfo(L,pinfo);
+ g_ptr_array_add(outstanding_stuff,p);
+ return p;
+}
+
+#define PUSH_COLUMN(L,c) g_ptr_array_add(outstanding_stuff,pushColumn(L,c))
+#define PUSH_COLUMNS(L,c) g_ptr_array_add(outstanding_stuff,pushColumns(L,c))
+
+WSLUA_CLASS_DEFINE(Address,NOP,NOP);
+
+WSLUA_CONSTRUCTOR Address_ip(lua_State* L) { /* Creates an Address Object representing an IP address. */
+#define WSLUA_ARG_Address_ip_HOSTNAME 1 /* The address or name of the IP host. */
+ Address addr = g_malloc(sizeof(address));
+ guint32* ip_addr = g_malloc(sizeof(guint32));
+ const gchar* name = luaL_checkstring(L,WSLUA_ARG_Address_ip_HOSTNAME);
+
+ if (! get_host_ipaddr(name, (guint32*)ip_addr)) {
+ *ip_addr = 0;
+ }
+
+ SET_ADDRESS(addr, AT_IPv4, 4, ip_addr);
+ pushAddress(L,addr);
+ WSLUA_RETURN(1); /* the Address object */
+}
+
+#if 0
+/* TODO */
+static int Address_ipv6(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+static int Address_ss7(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+static int Address_eth(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+static int Address_sna(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+static int Address_atalk(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+static int Address_vines(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+static int Address_osi(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+static int Address_arcnet(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+static int Address_fc(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+static int Address_string(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+static int Address_eui64(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+static int Address_uri(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+static int Address_tipc(lua_State* L) {
+ Address addr = g_malloc(sizeof(address));
+
+ SET_ADDRESS(addr, AT_NONE, 4, g_malloc(4));
+
+ pushAddress(L,addr);
+ return 1;
+}
+#endif
+
+WSLUA_METHODS Address_methods[] = {
+ {"ip", Address_ip },
+ {"ipv4", Address_ip },
+#if 0
+ {"ipv6", Address_ipv6 },
+ {"ss7pc", Address_ss7 },
+ {"eth", Address_eth },
+ {"sna", Address_sna },
+ {"atalk", Address_atalk },
+ {"vines", Address_vines },
+ {"osi", Address_osi },
+ {"arcnet", Address_arcnet },
+ {"fc", Address_fc },
+ {"string", Address_string },
+ {"eui64", Address_eui64 },
+ {"uri", Address_uri },
+ {"tipc", Address_tipc },
+#endif
+ {0,0}
+};
+
+WSLUA_METAMETHOD Address__tostring(lua_State* L) {
+ Address addr = checkAddress(L,1);
+
+ lua_pushstring(L,get_addr_name(addr));
+
+ WSLUA_RETURN(1); /* The string representing the address. */
+}
+
+static int Address__gc(lua_State* L) {
+ Address addr = checkAddress(L,1);
+
+ if (addr) {
+ if (addr->data) g_free((void*)addr->data);
+ g_free((void*)addr);
+ }
+
+ return 0;
+}
+
+WSLUA_METAMETHOD Address__eq(lua_State* L) { /* compares two Addresses */
+ Address addr1 = checkAddress(L,1);
+ Address addr2 = checkAddress(L,2);
+ gboolean result = FALSE;
+
+ if (ADDRESSES_EQUAL(addr1, addr2))
+ result = TRUE;
+
+ lua_pushboolean(L,result);
+
+ return 1;
+}
+
+WSLUA_METAMETHOD Address__le(lua_State* L) { /* compares two Addresses */
+ Address addr1 = checkAddress(L,1);
+ Address addr2 = checkAddress(L,2);
+ gboolean result = FALSE;
+
+ if (CMP_ADDRESS(addr1, addr2) <= 0)
+ result = TRUE;
+
+ lua_pushboolean(L,result);
+
+ return 1;
+}
+
+WSLUA_METAMETHOD Address__lt(lua_State* L) { /* compares two Addresses */
+ Address addr1 = checkAddress(L,1);
+ Address addr2 = checkAddress(L,2);
+ gboolean result = FALSE;
+
+ if (CMP_ADDRESS(addr1, addr2) < 0)
+ result = TRUE;
+
+ lua_pushboolean(L,result);
+
+ return 1;
+}
+
+WSLUA_META Address_meta[] = {
+ {"__gc", Address__gc },
+ {"__tostring", Address__tostring },
+ {"__eq",Address__eq},
+ {"__le",Address__le},
+ {"__lt",Address__lt},
+ {0,0}
+};
+
+
+int Address_register(lua_State *L) {
+ WSLUA_REGISTER_CLASS(Address);
+ return 1;
+}
+
+
+WSLUA_CLASS_DEFINE(Column,FAIL_ON_NULL("expired column"),NOP); /* A Column in the packet list */
+
+struct col_names_t {
+ const gchar* name;
+ int id;
+};
+
+static const struct col_names_t colnames[] = {
+ {"number",COL_NUMBER},
+ {"abs_time",COL_ABS_TIME},
+ {"cls_time",COL_CLS_TIME},
+ {"rel_time",COL_REL_TIME},
+ {"date",COL_ABS_DATE_TIME},
+ {"delta_time",COL_DELTA_TIME},
+ {"src",COL_DEF_SRC},
+ {"src_res",COL_RES_SRC},
+ {"src_unres",COL_UNRES_SRC},
+ {"dl_src",COL_DEF_DL_SRC},
+ {"dl_src_res",COL_RES_DL_SRC},
+ {"dl_src_unres",COL_UNRES_DL_SRC},
+ {"net_src",COL_DEF_NET_SRC},
+ {"net_src_res",COL_RES_NET_SRC},
+ {"net_src_unres",COL_UNRES_NET_SRC},
+ {"dst",COL_DEF_DST},
+ {"dst_res",COL_RES_DST},
+ {"dst_unres",COL_UNRES_DST},
+ {"dl_dst",COL_DEF_DL_DST},
+ {"dl_dst_res",COL_RES_DL_DST},
+ {"dl_dst_unres",COL_UNRES_DL_DST},
+ {"net_dst",COL_DEF_NET_DST},
+ {"net_dst_res",COL_RES_NET_DST},
+ {"net_dst_unres",COL_UNRES_NET_DST},
+ {"src_port",COL_DEF_SRC_PORT},
+ {"src_port_res",COL_RES_SRC_PORT},
+ {"src_port_unres",COL_UNRES_SRC_PORT},
+ {"dst_port",COL_DEF_DST_PORT},
+ {"dst_port_res",COL_RES_DST_PORT},
+ {"dst_port_unres",COL_UNRES_DST_PORT},
+ {"protocol",COL_PROTOCOL},
+ {"info",COL_INFO},
+ {"packet_len",COL_PACKET_LENGTH},
+ {"cumulative_bytes",COL_CUMULATIVE_BYTES},
+ {"oxid",COL_OXID},
+ {"rxid",COL_RXID},
+ {"direction",COL_IF_DIR},
+ {"circuit_id",COL_CIRCUIT_ID},
+ {"src_idx",COL_SRCIDX},
+ {"dst_idx",COL_DSTIDX},
+ {"vsan",COL_VSAN},
+ {"tx_rate",COL_TX_RATE},
+ {"rssi",COL_RSSI},
+ {"hpux_subsys",COL_HPUX_SUBSYS},
+ {"hpux_devid",COL_HPUX_DEVID},
+ {"dce_call",COL_DCE_CALL},
+ {NULL,0}
+};
+
+static gint col_name_to_id(const gchar* name) {
+ const struct col_names_t* cn;
+ for(cn = colnames; cn->name; cn++) {
+ if (g_str_equal(cn->name,name)) {
+ return cn->id;
+ }
+ }
+
+ return 0;
+}
+
+static const gchar* col_id_to_name(gint id) {
+ const struct col_names_t* cn;
+ for(cn = colnames; cn->name; cn++) {
+ if ( cn->id == id ) {
+ return cn->name;
+ }
+ }
+ return NULL;
+}
+
+
+WSLUA_METAMETHOD Column__tostring(lua_State *L) {
+ Column c = checkColumn(L,1);
+ const gchar* name;
+
+ if (!(c)) {
+ return 0;
+ }
+
+ /* XXX: should return the column's text ! */
+ name = col_id_to_name(c->col);
+ lua_pushstring(L,name ? name : "Unknown Column");
+
+ WSLUA_RETURN(1); /* A string representing the column */
+}
+
+WSLUA_METHOD Column_clear(lua_State *L) {
+ /* Clears a Column */
+ Column c = checkColumn(L,1);
+
+ if (!(c && c->cinfo)) return 0;
+
+ if (check_col(c->cinfo, c->col))
+ col_clear(c->cinfo, c->col);
+
+ return 0;
+}
+
+WSLUA_METHOD Column_set(lua_State *L) {
+ /* Sets the text of a Column */
+#define WSLUA_ARG_Column_set_TEXT 2 /* The text to which to set the Column */
+ Column c = checkColumn(L,1);
+ const gchar* s = luaL_checkstring(L,WSLUA_ARG_Column_set_TEXT);
+
+ if (!(c && c->cinfo))
+ return 0;
+
+ if (!s) WSLUA_ARG_ERROR(Column_set,TEXT,"must be a string");
+
+ if (check_col(c->cinfo, c->col))
+ col_set_str(c->cinfo, c->col, s);
+
+ return 0;
+}
+
+WSLUA_METHOD Column_append(lua_State *L) {
+ /* Appends text to a Column */
+#define WSLUA_ARG_Column_append_TEXT 2 /* The text to append to the Column */
+ Column c = checkColumn(L,1);
+ const gchar* s = luaL_checkstring(L,WSLUA_ARG_Column_append_TEXT);
+
+ if (!(c && c->cinfo))
+ return 0;
+
+ if (!s) WSLUA_ARG_ERROR(Column_append,TEXT,"must be a string");
+
+
+ if (check_col(c->cinfo, c->col))
+ col_append_str(c->cinfo, c->col, s);
+
+ return 0;
+}
+
+WSLUA_METHOD Column_preppend(lua_State *L) {
+ /* Prepends text to a Column */
+#define WSLUA_ARG_Column_prepend_TEXT 2 /* The text to prepend to the Column */
+ Column c = checkColumn(L,1);
+ const gchar* s = luaL_checkstring(L,WSLUA_ARG_Column_prepend_TEXT);
+
+ if (!(c && c->cinfo))
+ return 0;
+
+ if (!s) WSLUA_ARG_ERROR(Column_prepend,TEXT,"must be a string");
+
+ if (check_col(c->cinfo, c->col))
+ col_prepend_fstr(c->cinfo, c->col, "%s",s);
+
+ return 0;
+}
+
+WSLUA_METHODS Column_methods[] = {
+ {"clear", Column_clear },
+ {"set", Column_set },
+ {"append", Column_append },
+ {"preppend", Column_preppend },
+ {0,0}
+};
+
+
+WSLUA_META Column_meta[] = {
+ {"__tostring", Column__tostring },
+ {0,0}
+};
+
+
+int Column_register(lua_State *L) {
+ WSLUA_REGISTER_CLASS(Column);
+ return 1;
+}
+
+
+
+
+
+
+WSLUA_CLASS_DEFINE(Columns,NOP,NOP);
+/* The Columns of the packet list. */
+
+WSLUA_METAMETHOD Columns__tostring(lua_State *L) {
+ lua_pushstring(L,"Columns");
+ WSLUA_RETURN(1);
+ /* The string "Columns", no real use, just for debugging purposes. */
+}
+
+WSLUA_METAMETHOD Columns__newindex(lua_State *L) {
+ /* Sets the text of a specific column */
+#define WSLUA_ARG_Columns__newindex_COLUMN 2 /* the name of the column to set */
+#define WSLUA_ARG_Columns__newindex_TEXT 3 /* the text for the column */
+ Columns cols = checkColumns(L,1);
+ const struct col_names_t* cn;
+ const char* colname;
+ const char* text;
+
+ if (!cols) return 0;
+
+ colname = luaL_checkstring(L,WSLUA_ARG_Columns__newindex_COLUMN);
+ text = luaL_checkstring(L,WSLUA_ARG_Columns__newindex_TEXT);
+
+ for(cn = colnames; cn->name; cn++) {
+ if( g_str_equal(cn->name,colname) ) {
+ if (check_col(cols, cn->id))
+ col_set_str(cols, cn->id, text);
+ return 0;
+ }
+ }
+
+ WSLUA_ARG_ERROR(Columns__newindex,COLUMN,"the column name must be a valid column");
+
+ return 0;
+}
+
+WSLUA_METAMETHOD Columns_index(lua_State *L) {
+ Columns cols = checkColumns(L,1);
+ const struct col_names_t* cn;
+ const char* colname = luaL_checkstring(L,2);
+
+ if (!cols) {
+ Column c = ep_alloc(sizeof(struct _wslua_col_info));
+ c->cinfo = NULL;
+ c->col = col_name_to_id(colname);
+
+ PUSH_COLUMN(L,c);
+ return 1;
+ }
+
+
+
+ if (!colname) return 0;
+
+ for(cn = colnames; cn->name; cn++) {
+ if( g_str_equal(cn->name,colname) ) {
+ Column c = ep_alloc(sizeof(struct _wslua_col_info));
+ c->cinfo = cols;
+ c->col = col_name_to_id(colname);
+
+ PUSH_COLUMN(L,c);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
+static const luaL_reg Columns_meta[] = {
+ {"__tostring", Columns__tostring },
+ {"__newindex", Columns__newindex },
+ {"__index", Columns_index},
+ {0,0}
+};
+
+
+int Columns_register(lua_State *L) {
+ WSLUA_REGISTER_META(Columns);
+ return 1;
+}
+
+
+WSLUA_CLASS_DEFINE(Pinfo,FAIL_ON_NULL("expired pinfo"),NOP);
+/* Packet information */
+
+static int Pinfo_tostring(lua_State *L) { lua_pushstring(L,"a Pinfo"); return 1; }
+
+#define PINFO_GET_NUMBER(name,val) static int name(lua_State *L) { \
+ Pinfo pinfo = checkPinfo(L,1); \
+ if (!pinfo) return 0;\
+ lua_pushnumber(L,(lua_Number)(val));\
+ return 1;\
+}
+
+#define PINFO_GET_STRING(name,val) static int name(lua_State *L) { \
+ Pinfo pinfo = checkPinfo(L,1); \
+ const gchar* value; \
+ if (!pinfo) return 0; \
+ value = val; \
+ if (value) lua_pushstring(L,(const char*)(value)); else lua_pushnil(L); \
+ return 1; \
+}
+
+#define PINFO_GET_ADDRESS(name,role) static int name(lua_State *L) { \
+ Pinfo pinfo = checkPinfo(L,1); \
+ Address addr = g_malloc(sizeof(address)); \
+ if (!pinfo) return 0; \
+ COPY_ADDRESS(addr, &(pinfo->role)); \
+ pushAddress(L,addr); \
+ return 1; \
+}
+
+PINFO_GET_NUMBER(Pinfo_number,pinfo->fd->num)
+PINFO_GET_NUMBER(Pinfo_len,pinfo->fd->pkt_len)
+PINFO_GET_NUMBER(Pinfo_caplen,pinfo->fd->cap_len)
+PINFO_GET_NUMBER(Pinfo_abs_ts,(((double)pinfo->fd->abs_ts.secs) + (((double)pinfo->fd->abs_ts.nsecs) / 1000000000.0) ))
+PINFO_GET_NUMBER(Pinfo_rel_ts,(((double)pinfo->fd->rel_ts.secs) + (((double)pinfo->fd->rel_ts.nsecs) / 1000000000.0) ))
+PINFO_GET_NUMBER(Pinfo_delta_ts,(((double)pinfo->fd->del_ts.secs) + (((double)pinfo->fd->del_ts.nsecs) / 1000000000.0) ))
+PINFO_GET_NUMBER(Pinfo_ipproto,pinfo->ipproto)
+PINFO_GET_NUMBER(Pinfo_circuit_id,pinfo->circuit_id)
+PINFO_GET_NUMBER(Pinfo_ptype,pinfo->ptype)
+PINFO_GET_NUMBER(Pinfo_src_port,pinfo->srcport)
+PINFO_GET_NUMBER(Pinfo_dst_port,pinfo->destport)
+
+PINFO_GET_STRING(Pinfo_curr_proto,pinfo->current_proto)
+
+PINFO_GET_ADDRESS(Pinfo_net_src,net_src)
+PINFO_GET_ADDRESS(Pinfo_net_dst,net_dst)
+PINFO_GET_ADDRESS(Pinfo_dl_src,dl_src)
+PINFO_GET_ADDRESS(Pinfo_dl_dst,dl_dst)
+PINFO_GET_ADDRESS(Pinfo_src,src)
+PINFO_GET_ADDRESS(Pinfo_dst,dst)
+
+static int Pinfo_visited(lua_State *L) {
+ Pinfo pinfo = checkPinfo(L,1);
+ if (!pinfo) return 0;
+ lua_pushboolean(L,pinfo->fd->flags.visited);
+ return 1;
+}
+
+
+static int Pinfo_match(lua_State *L) {
+ Pinfo pinfo = checkPinfo(L,1);
+
+ if (!pinfo) return 0;
+
+ if (pinfo->match_string) {
+ lua_pushstring(L,pinfo->match_string);
+ } else {
+ lua_pushnumber(L,(lua_Number)(pinfo->match_port));
+ }
+
+ return 1;
+}
+
+static int Pinfo_columns(lua_State *L) {
+ Pinfo pinfo = checkPinfo(L,1);
+ const gchar* colname = luaL_optstring(L,2,NULL);
+
+ if (!colname) {
+ PUSH_COLUMNS(L,pinfo->cinfo);
+ } else {
+ lua_settop(L,0);
+ PUSH_COLUMNS(L,pinfo->cinfo);
+ lua_pushstring(L,colname);
+ return Columns_index(L);
+ }
+ return 1;
+}
+
+
+typedef enum {
+ PARAM_NONE,
+ PARAM_ADDR_SRC,
+ PARAM_ADDR_DST,
+ PARAM_ADDR_DL_SRC,
+ PARAM_ADDR_DL_DST,
+ PARAM_ADDR_NET_SRC,
+ PARAM_ADDR_NET_DST,
+ PARAM_PORT_SRC,
+ PARAM_PORT_DST,
+ PARAM_CIRCUIT_ID,
+ PARAM_PORT_TYPE,
+} pinfo_param_type_t;
+
+static int pushnil_param(lua_State* L, packet_info* pinfo _U_, pinfo_param_type_t pt _U_ ) {
+ lua_pushnil(L);
+ return 1;
+}
+
+int Pinfo_set_addr(lua_State* L, packet_info* pinfo, pinfo_param_type_t pt) {
+ const address* from = checkAddress(L,1);
+ address* to;
+
+ if (! from ) {
+ luaL_error(L,"Not an OK address");
+ return 0;
+ }
+
+ switch(pt) {
+ case PARAM_ADDR_SRC:
+ to = &(pinfo->src);
+ break;
+ case PARAM_ADDR_DST:
+ to = &(pinfo->dst);
+ break;
+ case PARAM_ADDR_DL_SRC:
+ to = &(pinfo->dl_src);
+ break;
+ case PARAM_ADDR_DL_DST:
+ to = &(pinfo->dl_dst);
+ break;
+ case PARAM_ADDR_NET_SRC:
+ to = &(pinfo->net_src);
+ break;
+ case PARAM_ADDR_NET_DST:
+ to = &(pinfo->net_dst);
+ break;
+ default:
+ g_assert(!"BUG: A bad parameter");
+ }
+
+ COPY_ADDRESS(to,from);
+ return 0;
+}
+
+int Pinfo_set_int(lua_State* L, packet_info* pinfo, pinfo_param_type_t pt) {
+ guint v = luaL_checkint(L,1);
+
+ switch(pt) {
+ case PARAM_PORT_SRC:
+ pinfo->srcport = v;
+ return 0;
+ case PARAM_PORT_DST:
+ pinfo->destport = v;
+ return 0;
+ case PARAM_CIRCUIT_ID:
+ pinfo->circuit_id = v;
+ return 0;
+ default:
+ g_assert(!"BUG: A bad parameter");
+ }
+
+ return 0;
+}
+
+typedef struct _pinfo_method_t {
+ const gchar* name;
+ lua_CFunction get;
+ int (*set)(lua_State*, packet_info*, pinfo_param_type_t);
+ pinfo_param_type_t param;
+} pinfo_method_t;
+
+static int Pinfo_hi(lua_State *L) {
+ Pinfo pinfo = checkPinfo(L,1);
+ Address addr = g_malloc(sizeof(address));
+
+ if (!pinfo) return 0;
+
+ if (CMP_ADDRESS(&(pinfo->src), &(pinfo->dst) ) >= 0) {
+ COPY_ADDRESS(addr, &(pinfo->src));
+ } else {
+ COPY_ADDRESS(addr, &(pinfo->dst));
+ }
+
+ pushAddress(L,addr);
+ return 1;
+}
+
+static int Pinfo_lo(lua_State *L) {
+ Pinfo pinfo = checkPinfo(L,1);
+ Address addr = g_malloc(sizeof(address));
+
+ if (!pinfo) return 0;
+
+ if (CMP_ADDRESS(&(pinfo->src), &(pinfo->dst) ) < 0) {
+ COPY_ADDRESS(addr, &(pinfo->src));
+ } else {
+ COPY_ADDRESS(addr, &(pinfo->dst));
+ }
+
+ pushAddress(L,addr);
+ return 1;
+}
+
+
+static const pinfo_method_t Pinfo_methods[] = {
+
+ /* WSLUA_ATTRIBUTE Pinfo_number RO The number of this packet in the current file */
+ {"number", Pinfo_number, pushnil_param, PARAM_NONE},
+
+ /* WSLUA_ATTRIBUTE Pinfo_len RO The length of the frame */
+ {"len", Pinfo_len, pushnil_param, PARAM_NONE },
+
+ /* WSLUA_ATTRIBUTE Pinfo_caplen RO The captured length of the frame */
+ {"caplen", Pinfo_caplen, pushnil_param, PARAM_NONE },
+
+ /* WSLUA_ATTRIBUTE Pinfo_abs_ts RO When the packet was captured */
+ {"abs_ts",Pinfo_abs_ts, pushnil_param, PARAM_NONE },
+
+ /* WSLUA_ATTRIBUTE Pinfo_rel_ts RO Number of seconds passed since beginning of capture */
+ {"rel_ts",Pinfo_rel_ts, pushnil_param, PARAM_NONE },
+
+ /* WSLUA_ATTRIBUTE Pinfo_delta_ts RO Number of seconds passed since the last packet */
+ {"delta_ts",Pinfo_delta_ts, pushnil_param, PARAM_NONE },
+
+ /* WSLUA_ATTRIBUTE Pinfo_visited RO Whether this packet hass been already visited */
+ {"visited",Pinfo_visited, pushnil_param, PARAM_NONE },
+
+ /* WSLUA_ATTRIBUTE Pinfo_src RW Source Address of this Packet */
+ {"src", Pinfo_src, Pinfo_set_addr, PARAM_ADDR_SRC },
+
+ /* WSLUA_ATTRIBUTE Pinfo_dst RW Destination Address of this Packet */
+ {"dst", Pinfo_dst, Pinfo_set_addr, PARAM_ADDR_DST },
+
+ /* WSLUA_ATTRIBUTE Pinfo_lo RO lower Address of this Packet */
+ {"lo", Pinfo_lo, pushnil_param, PARAM_NONE },
+
+ /* WSLUA_ATTRIBUTE Pinfo_hi RW higher Address of this Packet */
+ {"hi", Pinfo_hi, pushnil_param, PARAM_NONE },
+
+ /* WSLUA_ATTRIBUTE Pinfo_dl_src RW Data Link Source Address of this Packet */
+ {"dl_src", Pinfo_dl_src, Pinfo_set_addr, PARAM_ADDR_DL_SRC },
+
+ /* WSLUA_ATTRIBUTE Pinfo_dl_dst RW Data Link Destination Address of this Packet */
+ {"dl_dst", Pinfo_dl_dst, Pinfo_set_addr, PARAM_ADDR_DL_DST },
+
+ /* WSLUA_ATTRIBUTE Pinfo_net_src RW Network Layer Source Address of this Packet */
+ {"net_src", Pinfo_net_src, Pinfo_set_addr, PARAM_ADDR_NET_SRC },
+
+ /* WSLUA_ATTRIBUTE Pinfo_net_dst RW Network Layer Destination Address of this Packet */
+ {"net_dst", Pinfo_net_dst, Pinfo_set_addr, PARAM_ADDR_NET_DST },
+
+ /* WSLUA_ATTRIBUTE Pinfo_ptype RW Type of Port of .src_port and .dst_port */
+ {"port_type", Pinfo_ptype, pushnil_param, PARAM_NONE },
+
+ /* WSLUA_ATTRIBUTE Pinfo_src_port RW Source Port of this Packet */
+ {"src_port", Pinfo_src_port, Pinfo_set_int, PARAM_PORT_SRC },
+
+ /* WSLUA_ATTRIBUTE Pinfo_dst_port RW Source Address of this Packet */
+ {"dst_port", Pinfo_dst_port, Pinfo_set_int, PARAM_PORT_SRC },
+
+ /* WSLUA_ATTRIBUTE Pinfo_ipproto RO IP Protocol id */
+ {"ipproto", Pinfo_ipproto, pushnil_param, PARAM_NONE },
+
+ /* WSLUA_ATTRIBUTE Pinfo_circuit_id RO For circuit based protocols */
+ {"circuit_id", Pinfo_circuit_id, Pinfo_set_int, PARAM_CIRCUIT_ID },
+
+ /* WSLUA_ATTRIBUTE Pinfo_match RO Port/Data we are matching */
+ {"match", Pinfo_match, pushnil_param, PARAM_NONE },
+
+ /* WSLUA_ATTRIBUTE Pinfo_match RO Which Protocol are we dissecting */
+ {"curr_proto", Pinfo_curr_proto, pushnil_param, PARAM_NONE },
+
+ /* WSLUA_ATTRIBUTE Pinfo_columns RO Accesss to the packet list columns */
+ {"cols", Pinfo_columns, pushnil_param, PARAM_NONE },
+
+ {NULL,NULL,NULL,PARAM_NONE}
+};
+
+
+static int pushnil(lua_State* L) {
+ lua_pushnil(L);
+ return 1;
+}
+
+static int Pinfo_index(lua_State* L) {
+ Pinfo pinfo = checkPinfo(L,1);
+ const gchar* name = luaL_checkstring(L,2);
+ lua_CFunction method = pushnil;
+ const pinfo_method_t* curr;
+
+ if (! (pinfo && name) ) {
+ lua_pushnil(L);
+ return 1;
+ }
+
+ for (curr = Pinfo_methods ; curr->name ; curr++) {
+ if (g_str_equal(curr->name,name)) {
+ method = curr->get;
+ break;
+ }
+ }
+
+ lua_settop(L,1);
+ return method(L);
+}
+
+static int Pinfo_setindex(lua_State* L) {
+ Pinfo pinfo = checkPinfo(L,1);
+ const gchar* name = luaL_checkstring(L,2);
+ int (*method)(lua_State*, packet_info* pinfo, pinfo_param_type_t) = pushnil_param;
+ const pinfo_method_t* curr;
+ pinfo_param_type_t param_type = PARAM_NONE;
+
+ if (! (pinfo && name) ) {
+ return 0;
+ }
+
+ for (curr = Pinfo_methods ; curr->name ; curr++) {
+ if (g_str_equal(curr->name,name)) {
+ method = curr->set;
+ param_type = curr->param;
+ break;
+ }
+ }
+
+ lua_remove(L,1);
+ lua_remove(L,1);
+ return method(L,pinfo,param_type);
+}
+
+static const luaL_reg Pinfo_meta[] = {
+ {"__index", Pinfo_index},
+ {"__newindex",Pinfo_setindex},
+ {"__tostring", Pinfo_tostring},
+ {0, 0}
+};
+
+int Pinfo_register(lua_State* L) {
+ WSLUA_REGISTER_META(Pinfo);
+ outstanding_stuff = g_ptr_array_new();
+ return 1;
+}
+