static void dissect_ayiya(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { proto_tree *ayiya_tree; int offset = 0; int idlen, siglen, ayiya_len; guint8 next_header, opcode; tvbuff_t *payload; idlen = 1 << tvb_get_bits8(tvb, 0, 4); siglen = tvb_get_bits8(tvb, 8, 4) * 4; opcode = tvb_get_bits8(tvb, 20, 4); next_header = tvb_get_guint8(tvb, 3); ayiya_len = 8+idlen+siglen; col_set_str(pinfo->cinfo, COL_PROTOCOL, "AYIYA"); if (tree) { proto_item *ti; nstime_t tv; ti = proto_tree_add_protocol_format( tree, proto_ayiya, tvb, offset, ayiya_len, "AYIYA" ); ayiya_tree = proto_item_add_subtree(ti, ett_ayiya); proto_tree_add_bits_item(ayiya_tree, hf_id_len, tvb, 0, 4, ENC_BIG_ENDIAN); proto_tree_add_bits_item(ayiya_tree, hf_id_type, tvb, 4, 4, ENC_BIG_ENDIAN); proto_tree_add_bits_item(ayiya_tree, hf_sig_len, tvb, 8, 4, ENC_BIG_ENDIAN); proto_tree_add_bits_item(ayiya_tree, hf_hash_method, tvb, 12, 4, ENC_BIG_ENDIAN); proto_tree_add_bits_item(ayiya_tree, hf_auth_method, tvb, 16, 4, ENC_BIG_ENDIAN); proto_tree_add_bits_item(ayiya_tree, hf_opcode, tvb, 20, 4, ENC_BIG_ENDIAN); proto_tree_add_uint_format(ayiya_tree, hf_next_header, tvb, 3, 1, next_header, "Next header: %s (0x%02x)", ipprotostr(next_header), next_header); tv.secs = tvb_get_ntohl(tvb, 4); tv.nsecs = 0; proto_tree_add_time(ayiya_tree, hf_epoch, tvb, 4, 4, &tv); proto_tree_add_item(ayiya_tree, hf_identity, tvb, 8, idlen, ENC_NA); proto_tree_add_item(ayiya_tree, hf_signature, tvb, 8+idlen, siglen, ENC_NA); } offset = ayiya_len; switch (opcode) { case OPCODE_FORWARD: payload = tvb_new_subset_remaining(tvb, offset); dissector_try_uint(ip_dissector_table, next_header, payload, pinfo, tree); break; } }
const char *ipv6extprotostr(int proto) { if (ipv6_exthdr_check(proto)) return ipprotostr(proto); return NULL; }