aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2011-02-12 20:08:47 +0000
committerGuy Harris <guy@alum.mit.edu>2011-02-12 20:08:47 +0000
commit38c6d248e89295af11f0e76f0a06cd5253f02312 (patch)
tree7a8de4701f2d1223b322801f41eb72e3dd0b5ec1
parenta595f69ce4ed6114beefc5d9e753c11ff7be1918 (diff)
When generating the Info column, don't assume the direction is either
P2P_DIR_SENT or P2P_DIR_RECV - it might be unknown. Use some #defines for SDP data element IDs, and rename the routine that gets data elements tor reflect what it does. svn path=/trunk/; revision=35934
-rw-r--r--epan/dissectors/packet-btsdp.c61
1 files changed, 47 insertions, 14 deletions
diff --git a/epan/dissectors/packet-btsdp.c b/epan/dissectors/packet-btsdp.c
index d969d5cc09..7bca7ee87f 100644
--- a/epan/dissectors/packet-btsdp.c
+++ b/epan/dissectors/packet-btsdp.c
@@ -80,6 +80,12 @@ static const value_string vs_pduid[] = {
{0, NULL}
};
+#define ATTR_ID_SERVICE_CLASS_ID_LIST 0x0001
+#define ATTR_ID_PROTOCOL_DESCRIPTOR_LIST 0x0004
+#define ATTR_ID_BT_PROFILE_DESCRIPTOR_LIST 0x0009
+#define ATTR_ID_ADDITIONAL_PROTOCOL_DESCRIPTOR_LISTS 0x000d
+#define ATTR_ID_GOEP_L2CAP_PSM_GROUP_ID_IP_SUBNET 0x0200
+
static const value_string vs_general_attribute_id[] = {
{0x0000, "Service Record Handle"},
{0x0001, "Service Class ID List"},
@@ -255,7 +261,7 @@ dissect_sdp_error_response(proto_tree *t, tvbuff_t *tvb, int offset) {
}
static int
-get_sdp_type(tvbuff_t *tvb, int offset, guint16 id, guint8 *type, guint8 **val, guint32 *service, guint32 *service_val)
+get_sdp_data_element(tvbuff_t *tvb, int offset, guint16 id, guint8 *type, guint8 **val, guint32 *service, guint32 *service_val)
{
int size, start_offset, type_size;
guint8 byte0;
@@ -320,7 +326,7 @@ get_sdp_type(tvbuff_t *tvb, int offset, guint16 id, guint8 *type, guint8 **val,
guint32 value = 0;
while(bytes_to_go > 0) {
- size = get_sdp_type(tvb, offset, id, type, val, service, service_val);
+ size = get_sdp_data_element(tvb, offset, id, type, val, service, service_val);
if (size < 1 || *val == NULL) {
break;
}
@@ -547,8 +553,12 @@ dissect_sdp_service_attribute(proto_tree *tree, tvbuff_t *tvb, int offset, packe
service_item=se_tree_lookup32(service_table, token);
if(service_item != NULL) {
- if(id == 4 || (id == 9) || (id == 0xd)) { /* profile/protocol discriptor list/additional protocol list */
- get_sdp_type(tvb, offset+ 3, id, &type, &val, &service, &service_val);
+ switch(id) {
+
+ case ATTR_ID_PROTOCOL_DESCRIPTOR_LIST:
+ case ATTR_ID_BT_PROFILE_DESCRIPTOR_LIST:
+ case ATTR_ID_ADDITIONAL_PROTOCOL_DESCRIPTOR_LISTS:
+ get_sdp_data_element(tvb, offset+ 3, id, &type, &val, &service, &service_val);
if( (service == BTSDP_L2CAP_PROTOCOL_UUID)
|| (service == BTSDP_RFCOMM_PROTOCOL_UUID) ) {
@@ -560,24 +570,30 @@ dissect_sdp_service_attribute(proto_tree *tree, tvbuff_t *tvb, int offset, packe
}
service_item->flags = 0;
- if(id == 0xd) {
+ if(id == ATTR_ID_ADDITIONAL_PROTOCOL_DESCRIPTOR_LISTS) {
service_item->flags = BTSDP_SECONDARY_CHANNEL_FLAG_MASK;
}
- }
- else if( id == 1) { /* service class id list */
- get_sdp_type(tvb, offset+ 3, id, &type, &val, &service, &service_val);
+ break;
+
+ case ATTR_ID_SERVICE_CLASS_ID_LIST:
+ get_sdp_data_element(tvb, offset+ 3, id, &type, &val, &service, &service_val);
service_item->service = service;
- }
- else if(id == 0x200) { /* GOEP L2CAP PSM? */
+ break;
+
+ case ATTR_ID_GOEP_L2CAP_PSM_GROUP_ID_IP_SUBNET:
+ /* GOEP L2CAP PSM? */
+ {
guint8 *psm;
- get_sdp_type(tvb, offset+ 3, id, &type, &psm, &service, &service_val);
+ get_sdp_data_element(tvb, offset+ 3, id, &type, &psm, &service, &service_val);
if( (type == 1) && (*psm & 0x1) ) {
service_item->channel = *psm;
service_item->protocol = BTSDP_L2CAP_PROTOCOL_UUID;
service_item->flags = 0;
}
+ }
+ break;
}
if( service_item->service != 0 && service_item->channel != 0 ) {
@@ -772,7 +788,7 @@ dissect_sdp_service_search_request(proto_tree *t, tvbuff_t *tvb, int offset, pac
service_item->channel = 0;
service_item->service = 0;
- get_sdp_type(tvb, offset, 4, &type, &val, &service, &service_val);
+ get_sdp_data_element(tvb, offset, 4, &type, &val, &service, &service_val);
if( type==3 && val != NULL)
service_item->service = *((guint32 *) val);
@@ -853,9 +869,26 @@ dissect_btsdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
pdu = tvb_get_guint8(tvb, offset);
proto_tree_add_item(st, hf_pduid, tvb, offset, 1, FALSE);
pdu_name = val_to_str(pdu, vs_pduid, "Unknown");
- if (check_col(pinfo->cinfo, COL_INFO)) {
- col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s ",pinfo->p2p_dir==P2P_DIR_SENT?"Sent":"Rcvd", pdu_name);
+ switch (pinfo->p2p_dir) {
+
+ case P2P_DIR_SENT:
+ col_add_str(pinfo->cinfo, COL_INFO, "Sent ");
+ break;
+
+ case P2P_DIR_RECV:
+ col_add_str(pinfo->cinfo, COL_INFO, "Rcvd ");
+ break;
+
+ case P2P_DIR_UNKNOWN:
+ col_clear(pinfo->cinfo, COL_INFO);
+ break;
+
+ default:
+ col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown direction %d ",
+ pinfo->p2p_dir);
+ break;
}
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s ", pdu_name);
proto_item_append_text(ti, ": %s (0x%x)", pdu_name, pdu);
offset++;