/*- - ptag = n:eth{src=ethmac, dst=ethmac, type=int, payload=str, ptag=int} type is optional, defaults to IP ptag is optional, defaults to creating a new protocol block */ static int lnet_eth (lua_State *L) { libnet_t** ud = luaL_checkudata(L, 1, L_NET_REGID); luaL_argcheck(L, *ud, 1, "net has been destroyed"); const char* src = v_arg_string(L, 2, "src"); const char* dst = v_arg_string(L, 2, "dst"); int type = v_arg_integer_opt(L, 2, "type", ETHERTYPE_IP); size_t payloadsz = 0; const char* payload = v_arg_lstring(L, 2, "payload", &payloadsz, ""); int ptag = lnet_arg_ptag(L, 2); if(payloadsz == 0) { payload = NULL; } #ifdef NET_DUMP printf("net eth src %s dst %s type %d payloadsz %lu ptag %d\n", src, dst, type, payloadsz, ptag); #endif eth_addr_t src_n = check_eth_pton(L, src, "src"); eth_addr_t dst_n = check_eth_pton(L, dst, "dst"); ptag = libnet_build_ethernet(dst_n.data, src_n.data, type, (uint8_t*)payload, payloadsz, *ud, ptag); check_error(L, *ud, ptag); lua_pushinteger(L, ptag); return 1; }
/*- -- ptag = n:eth{src=ethmac, dst=ethmac, type=int, payload=str, ptag=int} type is optional, defaults to IP ptag is optional, defaults to creating a new protocol block */ static int lnet_eth (lua_State *L) { libnet_t* ud = checkudata(L); const char* src = v_arg_string(L, 2, "src"); const char* dst = v_arg_string(L, 2, "dst"); int type = v_arg_integer_opt(L, 2, "type", ETHERTYPE_IP); uint32_t payloadsz = 0; const uint8_t* payload = checkpayload(L, 2, &payloadsz); int ptag = lnet_arg_ptag(L, ud, 2, LIBNET_PBLOCK_ETH_H); #ifdef NET_DUMP printf("net eth src %s dst %s type %d payloadsz %lu ptag %d\n", src, dst, type, payloadsz, ptag); #endif { eth_addr_t src_n = check_eth_pton(L, src, "src"); eth_addr_t dst_n = check_eth_pton(L, dst, "dst"); ptag = libnet_build_ethernet(dst_n.data, src_n.data, type, payload, payloadsz, ud, ptag); } check_error(L, ud, ptag); lua_pushinteger(L, ptag); return 1; }