From 2d112adc3baeae6795c5f150468f95dd637d7f35 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 10 Jun 2009 05:42:52 +0800 Subject: re-add wireshark and linux-kernel patches --- wireshark/rsl-ipaccess.patch | 481 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 481 insertions(+) create mode 100644 wireshark/rsl-ipaccess.patch (limited to 'wireshark/rsl-ipaccess.patch') diff --git a/wireshark/rsl-ipaccess.patch b/wireshark/rsl-ipaccess.patch new file mode 100644 index 000000000..030f07eef --- /dev/null +++ b/wireshark/rsl-ipaccess.patch @@ -0,0 +1,481 @@ +Index: wireshark/epan/dissectors/packet-rsl.c +=================================================================== +--- wireshark.orig/epan/dissectors/packet-rsl.c 2009-02-22 15:39:34.000000000 +0100 ++++ wireshark/epan/dissectors/packet-rsl.c 2009-02-22 17:27:51.000000000 +0100 +@@ -2,6 +2,7 @@ + * Routines for Radio Signalling Link (RSL) dissection. + * + * Copyright 2007, Anders Broman ++ * Copyright 2009, Harald Welte + * + * $Id: packet-rsl.c 27065 2008-12-20 00:09:02Z wmeier $ + * +@@ -116,6 +117,14 @@ + static int hf_rsl_rtd = -1; + static int hf_rsl_delay_ind = -1; + static int hf_rsl_tfo = -1; ++static int hf_rsl_f4 = -1; ++static int hf_rsl_f6 = -1; ++static int hf_rsl_f8 = -1; ++static int hf_rsl_fc = -1; ++static int hf_rsl_local_port = -1; ++static int hf_rsl_remote_port = -1; ++static int hf_rsl_local_ip = -1; ++static int hf_rsl_remote_ip = -1; + + /* Initialize the subtree pointers */ + static int ett_rsl = -1; +@@ -173,6 +182,15 @@ + static int ett_ie_meas_res_no = -1; + static int ett_ie_message_id = -1; + static int ett_ie_sys_info_type = -1; ++static int ett_ie_f4 = -1; ++static int ett_ie_f6 = -1; ++static int ett_ie_f8 = -1; ++static int ett_ie_remote_ip = -1; ++static int ett_ie_remote_port = -1; ++static int ett_ie_local_port = -1; ++static int ett_ie_local_ip = -1; ++static int ett_ie_fc = -1; ++ + + proto_tree *top_tree; + dissector_handle_t gsm_a_ccch_handle; +@@ -208,8 +226,11 @@ + { 0x06, "Common Channel Management messages" }, + { 0x08, "TRX Management messages" }, + { 0x16, "Location Services messages" }, ++ { 0x3f, "ip.access Vendor Specific messages" }, + { 0, NULL } + }; ++#define RSL_MSGDISC_IPACCESS 0x3f ++ + /* + * 9.2 MESSAGE TYPE + */ +@@ -338,6 +359,14 @@ + { 0x3f, "TFO MODification REQuest" }, /* 8.4.31 */ + /* 0 1 - - - - - - Location Services messages: */ + { 0x41, "Location Information" }, /* 8.7.1 */ ++ /* ip.access */ ++ { 0x70, "ip.access BIND" }, ++ { 0x71, "ip.access BIND ACK" }, ++ { 0x72, "ip.access BIND NACK" }, ++ { 0x73, "ip.access CONNECT" }, ++ { 0x74, "ip.access CONNECT ACK" }, ++ { 0x75, "ip.access CONNECT NACK" }, ++ { 0x76, "ip.access DISCONNECT INDication" }, + { 0, NULL } + }; + +@@ -477,6 +506,10 @@ + Not used + + */ ++ { 0xf0, "Remote IP Address" }, ++ { 0xf1, "Remote RTP Port" }, ++ { 0xf3, "Local RTP Port" }, ++ { 0xf5, "Local IP Address" }, + { 0, NULL } + }; + +@@ -2043,7 +2076,6 @@ + proto_item_set_len(ti, length+2); + + proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE); +- offset++; + + /* Received Message */ + offset = dissct_rsl_msg(tvb, pinfo, ie_tree, offset); +@@ -2907,13 +2939,320 @@ + return ie_offset + length; + } + ++/* Vendor-Specific messages of ip.access nanoBTS. There is no public documentation ++ * about those extensions, all information in this dissector is based on lawful ++ * protocol reverse enginering by Harald Welte */ ++#define RSL_MSG_TYPE_IPAC_BIND 0x70 ++#define RSL_MSG_TYPE_IPAC_BIND_ACK 0x71 ++#define RSL_MSG_TYPE_IPAC_BIND_NACK 0x72 ++#define RSL_MSG_TYPE_IPAC_CONNECT 0x73 ++#define RSL_MSG_TYPE_IPAC_CONNECT_ACK 0x74 ++#define RSL_MSG_TYPE_IPAC_CONNECT_NACK 0x75 ++#define RSL_MSG_TYPE_IPAC_DISC_IND 0x76 ++#define RSL_IE_IPAC_REMOTE_IP 0xf0 ++#define RSL_IE_IPAC_REMOTE_PORT 0xf1 ++#define RSL_IE_IPAC_LOCAL_PORT 0xf3 ++#define RSL_IE_IPAC_LOCAL_IP 0xf5 ++ ++static int ++dissect_rsl_ipac_ie_f8(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory) ++{ ++ proto_item *ti; ++ proto_tree *ie_tree; ++ guint8 ie_id; ++ ++ if (is_mandatory == FALSE) { ++ ie_id = tvb_get_guint8(tvb, offset); ++ if (ie_id != 0xf8) ++ return offset; ++ } ++ ++ ti = proto_tree_add_text(tree, tvb, offset, 0, "Unknown 0xf8 IE"); ++ ie_tree = proto_item_add_subtree(ti, ett_ie_f8); ++ ++ /* Element identifier */ ++ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE); ++ offset++; ++ /* Fixed Length */ ++ proto_item_set_len(ti, 3); ++ ++ proto_tree_add_item(ie_tree, hf_rsl_f8, tvb, offset, 2, FALSE); ++ offset += 2; ++ ++ return offset; ++} ++ ++static int ++dissect_rsl_ipac_ie_local_port(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory) ++{ ++ proto_item *ti; ++ proto_tree *ie_tree; ++ guint8 ie_id; ++ ++ if (is_mandatory == FALSE) { ++ ie_id = tvb_get_guint8(tvb, offset); ++ if (ie_id != RSL_IE_IPAC_LOCAL_PORT) ++ return offset; ++ } ++ ++ ti = proto_tree_add_text(tree, tvb, offset, 0, "Local RTP Port IE"); ++ ie_tree = proto_item_add_subtree(ti, ett_ie_local_port); ++ ++ /* Element identifier */ ++ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE); ++ offset++; ++ /* Fixed Length */ ++ proto_item_set_len(ti, 3); ++ ++ proto_tree_add_item(ie_tree, hf_rsl_local_port, tvb, offset, 2, FALSE); ++ offset += 2; ++ ++ return offset; ++} ++ ++static int ++dissect_rsl_ipac_ie_remote_port(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory) ++{ ++ proto_item *ti; ++ proto_tree *ie_tree; ++ guint8 ie_id; ++ ++ if (is_mandatory == FALSE) { ++ ie_id = tvb_get_guint8(tvb, offset); ++ if (ie_id != RSL_IE_IPAC_REMOTE_PORT) ++ return offset; ++ } ++ ++ ti = proto_tree_add_text(tree, tvb, offset, 0, "Remote RTP Port IE"); ++ ie_tree = proto_item_add_subtree(ti, ett_ie_remote_port); ++ ++ /* Element identifier */ ++ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE); ++ offset++; ++ /* Fixed Length */ ++ proto_item_set_len(ti, 3); ++ ++ proto_tree_add_uint(ie_tree, hf_rsl_remote_port, tvb, offset, 2, FALSE); ++ offset += 2; ++ ++ return offset; ++} ++ ++static int ++dissect_rsl_ipac_ie_local_ip(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory) ++{ ++ proto_item *ti; ++ proto_tree *ie_tree; ++ guint8 ie_id; ++ guint32 ip; ++ ++ if (is_mandatory == FALSE) { ++ ie_id = tvb_get_guint8(tvb, offset); ++ if (ie_id != RSL_IE_IPAC_LOCAL_IP) ++ return offset; ++ } ++ ++ ti = proto_tree_add_text(tree, tvb, offset, 0, "Local IP Address IE"); ++ ie_tree = proto_item_add_subtree(ti, ett_ie_local_ip); ++ ++ /* Element identifier */ ++ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE); ++ offset++; ++ /* Fixed Length */ ++ proto_item_set_len(ti, 5); ++ ++ ip = tvb_get_ipv4(tvb, offset); ++ proto_tree_add_ipv4(ie_tree, hf_rsl_local_ip, tvb, offset, 4, ip); ++ offset += 4; ++ ++ return offset; ++} ++ ++static int ++dissect_rsl_ipac_ie_remote_ip(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory) ++{ ++ proto_item *ti; ++ proto_tree *ie_tree; ++ guint8 ie_id; ++ guint32 ip; ++ ++ if (is_mandatory == FALSE) { ++ ie_id = tvb_get_guint8(tvb, offset); ++ if (ie_id != RSL_IE_IPAC_REMOTE_IP) ++ return offset; ++ } ++ ++ ti = proto_tree_add_text(tree, tvb, offset, 0, "Remote IP Address IE"); ++ ie_tree = proto_item_add_subtree(ti, ett_ie_remote_ip); ++ ++ /* Element identifier */ ++ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE); ++ offset++; ++ /* Fixed Length */ ++ proto_item_set_len(ti, 5); ++ ++ ip = tvb_get_ipv4(tvb, offset); ++ proto_tree_add_ipv4(ie_tree, hf_rsl_remote_ip, tvb, offset, 4, ip); ++ offset += 4; ++ ++ return offset; ++} ++ ++static int ++dissect_rsl_ipac_ie_f6(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory) ++{ ++ proto_item *ti; ++ proto_tree *ie_tree; ++ guint8 length; ++ guint8 ie_id; ++ ++ if (is_mandatory == FALSE) { ++ ie_id = tvb_get_guint8(tvb, offset); ++ if (ie_id != 0xf6) ++ return offset; ++ } ++ ++ ti = proto_tree_add_text(tree, tvb, offset, 0, "Unknown 0xf6 IE"); ++ ie_tree = proto_item_add_subtree(ti, ett_ie_f6); ++ ++ /* Element identifier */ ++ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE); ++ offset++; ++ ++ /* Length */ ++ length = tvb_get_guint8(tvb, offset); ++ offset++; ++ proto_item_set_len(ti, length+2); ++ ++ proto_tree_add_bytes(ie_tree, hf_rsl_f6, tvb, offset, length, ++ tvb_get_ptr(tvb, offset, length)); ++ offset += length; ++ ++ return offset; ++} ++ ++static int ++dissect_rsl_ipac_ie_f4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory) ++{ ++ proto_item *ti; ++ proto_tree *ie_tree; ++ guint8 ie_id; ++ ++ if (is_mandatory == FALSE) { ++ ie_id = tvb_get_guint8(tvb, offset); ++ if (ie_id != 0xf4) ++ return offset; ++ } ++ ++ ti = proto_tree_add_text(tree, tvb, offset, 0, "Unknown 0xf4 IE"); ++ ie_tree = proto_item_add_subtree(ti, ett_ie_f4); ++ ++ /* Element identifier */ ++ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE); ++ offset++; ++ /* Fixed Length */ ++ proto_item_set_len(ti, 2); ++ proto_tree_add_item(ie_tree, hf_rsl_f4, tvb, offset, 1, FALSE); ++ offset++; ++ ++ return offset; ++} ++ ++static int ++dissect_rsl_ipac_ie_fc(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory) ++{ ++ proto_item *ti; ++ proto_tree *ie_tree; ++ guint8 ie_id; ++ ++ if (is_mandatory == FALSE) { ++ ie_id = tvb_get_guint8(tvb, offset); ++ if (ie_id != 0xfc) ++ return offset; ++ } ++ ++ ti = proto_tree_add_text(tree, tvb, offset, 0, "Unknown 0xfc IE"); ++ ie_tree = proto_item_add_subtree(ti, ett_ie_fc); ++ ++ /* Element identifier */ ++ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE); ++ offset++; ++ /* Fixed Length */ ++ proto_item_set_len(ti, 2); ++ proto_tree_add_item(ie_tree, hf_rsl_fc, tvb, offset, 1, FALSE); ++ offset++; ++ ++ return offset; ++} ++ ++static int ++dissct_rsl_ipaccess_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) ++{ ++ guint8 msg_type; ++ ++ msg_type = tvb_get_guint8(tvb, offset)&0x7f; ++ offset++; ++ ++ switch (msg_type) { ++ case RSL_MSG_TYPE_IPAC_BIND: ++ /* Channel number 9.3.1 M TV 2 */ ++ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE); ++ break; ++ case RSL_MSG_TYPE_IPAC_BIND_ACK: ++ /* Channel number 9.3.1 M TV 2 */ ++ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE); ++ offset = dissect_rsl_ipac_ie_f8(tvb, pinfo, tree, offset, TRUE); ++ offset = dissect_rsl_ipac_ie_local_port(tvb, pinfo, tree, offset, TRUE); ++ offset = dissect_rsl_ipac_ie_local_ip(tvb, pinfo, tree, offset, TRUE); ++ offset = dissect_rsl_ipac_ie_fc(tvb, pinfo, tree, offset, TRUE); ++ break; ++ case RSL_MSG_TYPE_IPAC_BIND_NACK: ++ /* Channel number 9.3.1 M TV 2 */ ++ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE); ++ break; ++ case RSL_MSG_TYPE_IPAC_CONNECT: ++ /* Channel number 9.3.1 M TV 2 */ ++ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE); ++ offset = dissect_rsl_ipac_ie_remote_ip(tvb, pinfo, tree, offset, TRUE); ++ offset = dissect_rsl_ipac_ie_remote_port(tvb, pinfo, tree, offset, TRUE); ++ offset = dissect_rsl_ipac_ie_f4(tvb, pinfo, tree, offset, TRUE); ++ offset = dissect_rsl_ipac_ie_fc(tvb, pinfo, tree, offset, TRUE); ++ break; ++ case RSL_MSG_TYPE_IPAC_CONNECT_ACK: ++ /* Channel number 9.3.1 M TV 2 */ ++ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE); ++ offset = dissect_rsl_ipac_ie_f8(tvb, pinfo, tree, offset, TRUE); ++ break; ++ case RSL_MSG_TYPE_IPAC_CONNECT_NACK: ++ /* Channel number 9.3.1 M TV 2 */ ++ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE); ++ break; ++ case RSL_MSG_TYPE_IPAC_DISC_IND: ++ /* Channel number 9.3.1 M TV 2 */ ++ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE); ++ offset = dissect_rsl_ipac_ie_f8(tvb, pinfo, tree, offset, TRUE); ++ offset = dissect_rsl_ipac_ie_f6(tvb, pinfo, tree, offset, TRUE); ++ /* Cause 9.3.26 M TLV >=3 */ ++ offset = dissect_rsl_ie_cause(tvb, pinfo, tree, offset, TRUE); ++ break; ++ } ++ ++ return offset; ++} ++ + static int + dissct_rsl_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) + { +- guint8 msg_type; ++ guint8 msg_disc, msg_type; + ++ msg_disc = tvb_get_guint8(tvb, offset++) >> 1; + msg_type = tvb_get_guint8(tvb,offset)&0x7f; + proto_tree_add_item(tree, hf_rsl_msg_type, tvb, offset, 1, FALSE); ++ ++ if (msg_disc == RSL_MSGDISC_IPACCESS) { ++ offset = dissct_rsl_ipaccess_msg(tvb, pinfo, tree, offset); ++ return offset; ++ } + offset++; + + switch (msg_type){ +@@ -3517,7 +3856,6 @@ + /* 9.1 Message discriminator */ + proto_tree_add_item(rsl_tree, hf_rsl_msg_dsc, tvb, offset, 1, FALSE); + proto_tree_add_item(rsl_tree, hf_rsl_T_bit, tvb, offset, 1, FALSE); +- offset++; + + offset = dissct_rsl_msg(tvb, pinfo, rsl_tree, offset); + +@@ -3883,6 +4221,46 @@ + FT_UINT8, BASE_DEC, VALS(rsl_emlpp_prio_vals), 0x03, + "eMLPP Priority", HFILL } + }, ++ { &hf_rsl_f4, ++ { "unknown F4 IE", "rsl.ipacc.f4", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "unknown F4 IE", HFILL } ++ }, ++ { &hf_rsl_f6, ++ { "unknown F6 IE", "rsl.ipacc.f6", ++ FT_BYTES, BASE_HEX, NULL, 0x0, ++ "unknown F6 IE", HFILL } ++ }, ++ { &hf_rsl_f8, ++ { "unknown F8 IE", "rsl.ipacc.f8", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "unknown F8 IE", HFILL } ++ }, ++ { &hf_rsl_fc, ++ { "unknown FC IE", "rsl.ipacc.fc", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "unknown FC IE", HFILL } ++ }, ++ { &hf_rsl_local_port, ++ { "ip.access Local RTP Port", "rsl.ipacc.local_port", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "ip.access Local RTP Port", HFILL }, ++ }, ++ { &hf_rsl_remote_port, ++ { "ip.access Remote RTP Port", "rsl.ipacc.remote_port", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "ip.access Remote RTP Port", HFILL }, ++ }, ++ { &hf_rsl_local_ip, ++ { "ip.access Local IP Address", "rsl.ipacc.local_ip", ++ FT_IPv4, BASE_NONE, NULL, 0x0, ++ "ip.access Local IP Address", HFILL }, ++ }, ++ { &hf_rsl_remote_ip, ++ { "ip.access Remote IP Address", "rsl.ipacc.remote_ip", ++ FT_IPv4, BASE_NONE, NULL, 0x0, ++ "ip.access Remote IP Address", HFILL }, ++ }, + }; + static gint *ett[] = { + &ett_rsl, +@@ -3941,6 +4319,14 @@ + &ett_ie_meas_res_no, + &ett_ie_message_id, + &ett_ie_sys_info_type, ++ &ett_ie_f4, ++ &ett_ie_f6, ++ &ett_ie_f8, ++ &ett_ie_remote_ip, ++ &ett_ie_remote_port, ++ &ett_ie_local_port, ++ &ett_ie_local_ip, ++ &ett_ie_fc, + }; + + /* Register the protocol name and description */ -- cgit v1.2.3