void ks_parse_http_session_request_line(ks_http_session_t *session,packet_info *pinfo,tvbuff_t *tvb, int offset,const guchar *line, const guchar *lineend){ const gchar *token; const guchar *next_token; int tokenlen; ks_http_session_request_t *r; if(session->request == NULL){ init_http_session_request(session); } r = session->request; if(r == NULL||line==NULL){ return; } session->state = HTTP_SESSION_REQUEST_STATE; set_http_session_ids(session->pool,&r->ids,pinfo); r->request_line = mp_pstrndup(session->pool,line,(size_t)(lineend-line)); /* The first token is the method. */ tokenlen = get_token_len(line, lineend, &next_token); if (tokenlen == 0) return; token = tvb_get_ephemeral_string(tvb, offset, tokenlen); r->method = mp_pstrdup(session->pool,token); if ((next_token - line) > 2 && next_token[-1] == ' ' && next_token[-2] == ' ') { /* Two spaces in a now indicates empty URI, so roll back one here */ next_token--; } offset += (int) (next_token - line); line = next_token; /* The next token is the URI. */ tokenlen = get_token_len(line, lineend, &next_token); token = tvb_get_ephemeral_string_enc(tvb, offset, tokenlen,ENC_UTF_8); r->uri = mp_pstrdup(session->pool,token); r->args = get_http_session_query_str(r->uri); offset += (int) (next_token - line); line = next_token; /* Everything to the end of the line is the version. */ tokenlen = (int) (lineend - line); token = tvb_get_ephemeral_string(tvb, offset, tokenlen); r->http_protocol = mp_pstrdup(session->pool,token); }
/*FUNCTION:------------------------------------------------------ * NAME * dissect_zcl_msg_display * DESCRIPTION * This function manages the Display Message payload * PARAMETERS * tvbuff_t *tvb - pointer to buffer containing raw packet. * proto_tree *tree - pointer to data tree Wireshark uses to display packet. * offset - offset * RETURNS * none *--------------------------------------------------------------- */ static void dissect_zcl_msg_display(tvbuff_t *tvb, proto_tree *tree, guint *offset) { proto_tree *sub_tree = NULL; proto_item *ti; guint8 control; guint msg_len; guint8 *msg_data; /* Retrieve "Message ID" field */ proto_tree_add_item(tree, hf_zbee_zcl_msg_message_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN); *offset += 4; /* Retrieve "Message Control" field */ control = tvb_get_guint8(tvb, *offset); ti = proto_tree_add_text(tree, tvb, *offset, 1, "Message Control: 0x%02x", control); sub_tree = proto_item_add_subtree(ti, ett_zbee_zcl_msg_message_control); proto_tree_add_item(sub_tree, hf_zbee_zcl_msg_ctrl_tx, tvb, *offset, 1, ENC_NA); proto_tree_add_item(sub_tree, hf_zbee_zcl_msg_ctrl_importance, tvb, *offset, 1, ENC_NA); proto_tree_add_item(sub_tree, hf_zbee_zcl_msg_ctrl_reserved, tvb, *offset, 1, ENC_NA); proto_tree_add_item(sub_tree, hf_zbee_zcl_msg_ctrl_confirm, tvb, *offset, 1, ENC_NA); *offset += 1; /* Retrieve "Start Time" field */ proto_tree_add_item(tree, hf_zbee_zcl_msg_start_time, tvb, *offset, 4, ENC_LITTLE_ENDIAN); *offset += 4; /* Retrieve "Duration In Minutes" field */ proto_tree_add_item(tree, hf_zbee_zcl_msg_duration, tvb, *offset, 2, ENC_LITTLE_ENDIAN); *offset += 2; /* Retrieve "Message Length" field */ msg_len = tvb_get_guint8(tvb, *offset); /* string length */ proto_tree_add_item(tree, hf_zbee_zcl_msg_message_length, tvb, *offset, 1, ENC_NA); *offset += 1; /* Retrieve "Message" field */ msg_data = tvb_get_ephemeral_string_enc(tvb, *offset, msg_len, ENC_LITTLE_ENDIAN); proto_tree_add_string(tree, hf_zbee_zcl_msg_message, tvb, *offset, msg_len, msg_data); *offset += msg_len; } /*dissect_zcl_msg_display*/
static int dissect_yami_parameter(tvbuff_t *tvb, proto_tree *tree, int offset, proto_item *par_ti) { const int orig_offset = offset; proto_tree *yami_param; proto_item *ti; char *name; int name_offset; guint32 name_len; guint32 type; ti = proto_tree_add_item(tree, hf_yami_param, tvb, offset, 0, ENC_NA); yami_param = proto_item_add_subtree(ti, ett_yami_param); name_offset = offset; name_len = tvb_get_letohl(tvb, offset); offset += 4; name = tvb_get_ephemeral_string_enc(tvb, offset, name_len, ENC_ASCII | ENC_NA); proto_item_append_text(ti, ": %s", name); proto_item_append_text(par_ti, "%s, ", name); offset += (name_len + 3) & ~3; proto_tree_add_string(yami_param, hf_yami_param_name, tvb, name_offset, offset - name_offset, name); type = tvb_get_letohl(tvb, offset); proto_tree_add_item(yami_param, hf_yami_param_type, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; switch (type) { case YAMI_TYPE_BOOLEAN: { guint32 val = tvb_get_letohl(tvb, offset); proto_item_append_text(ti, ", Type: boolean, Value: %s", val ? "True" : "False"); proto_tree_add_item(yami_param, hf_yami_param_value_bool, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; break; } case YAMI_TYPE_INTEGER: { gint32 val = tvb_get_letohl(tvb, offset); proto_item_append_text(ti, ", Type: integer, Value: %d", val); proto_tree_add_item(yami_param, hf_yami_param_value_int, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; break; } case YAMI_TYPE_LONGLONG: { gint64 val = tvb_get_letoh64(tvb, offset); proto_item_append_text(ti, ", Type: long, Value: %" G_GINT64_MODIFIER "d", val); proto_tree_add_item(yami_param, hf_yami_param_value_long, tvb, offset, 8, ENC_LITTLE_ENDIAN); offset += 8; break; } case YAMI_TYPE_DOUBLE: { gdouble val = tvb_get_letohieee_double(tvb, offset); proto_item_append_text(ti, ", Type: double, Value: %g", val); proto_tree_add_item(yami_param, hf_yami_param_value_double, tvb, offset, 8, ENC_LITTLE_ENDIAN); offset += 8; break; } case YAMI_TYPE_STRING: { const int val_offset = offset; guint32 val_len; char *val; val_len = tvb_get_letohl(tvb, offset); offset += 4; val = tvb_get_ephemeral_string_enc(tvb, offset, val_len, ENC_ASCII | ENC_NA); proto_item_append_text(ti, ", Type: string, Value: \"%s\"", val); offset += (val_len + 3) & ~3; proto_tree_add_string(yami_param, hf_yami_param_value_str, tvb, val_offset, offset - val_offset, val); break; } case YAMI_TYPE_BINARY: { const int val_offset = offset; guint32 val_len; const guint8 *val; char *repr; val_len = tvb_get_letohl(tvb, offset); offset += 4; val = tvb_get_ptr(tvb, offset, val_len); repr = bytes_to_str(val, val_len); proto_item_append_text(ti, ", Type: binary, Value: %s", repr); offset += (val_len + 3) & ~3; proto_tree_add_bytes_format_value(yami_param, hf_yami_param_value_bin, tvb, val_offset, offset - val_offset, val, "%s", repr); break; } case YAMI_TYPE_BOOLEAN_ARRAY: { guint32 count; guint i; int j; count = tvb_get_letohl(tvb, offset); proto_tree_add_item(yami_param, hf_yami_items_count, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; proto_item_append_text(ti, ", Type: boolean[], %u items: {", count); for (i = 0; i < count/32; i++) { guint32 val = tvb_get_letohl(tvb, offset); for (j = 0; j < 32; j++) { int r = !!(val & (1 << j)); proto_item_append_text(ti, "%s, ", r ? "T" : "F"); proto_tree_add_boolean(yami_param, hf_yami_param_value_bool, tvb, offset+(j/8), 1, r); } offset += 4; } if (count % 32) { guint32 val = tvb_get_letohl(tvb, offset); int tmp = count % 32; for (j = 0; j < tmp; j++) { int r = !!(val & (1 << j)); proto_item_append_text(ti, "%s, ", r ? "T" : "F"); proto_tree_add_boolean(yami_param, hf_yami_param_value_bool, tvb, offset+(j/8), 1, r); } offset += 4; } proto_item_append_text(ti, "}"); break; } case YAMI_TYPE_INTEGER_ARRAY: { guint32 count; guint i; count = tvb_get_letohl(tvb, offset); proto_tree_add_item(yami_param, hf_yami_items_count, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; proto_item_append_text(ti, ", Type: integer[], %u items: {", count); for (i = 0; i < count; i++) { gint32 val = tvb_get_letohl(tvb, offset); proto_item_append_text(ti, "%d, ", val); proto_tree_add_item(yami_param, hf_yami_param_value_int, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; } proto_item_append_text(ti, "}"); break; } case YAMI_TYPE_LONGLONG_ARRAY: { guint32 count; guint i; count = tvb_get_letohl(tvb, offset); proto_tree_add_item(yami_param, hf_yami_items_count, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; proto_item_append_text(ti, ", Type: long long[], %u items: {", count); for (i = 0; i < count; i++) { gint64 val = tvb_get_letoh64(tvb, offset); proto_item_append_text(ti, "%" G_GINT64_MODIFIER "d, ", val); proto_tree_add_item(yami_param, hf_yami_param_value_long, tvb, offset, 8, ENC_LITTLE_ENDIAN); offset += 8; } proto_item_append_text(ti, "}"); break; } case YAMI_TYPE_DOUBLE_ARRAY: { guint32 count; guint i; count = tvb_get_letohl(tvb, offset); proto_tree_add_item(yami_param, hf_yami_items_count, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; proto_item_append_text(ti, ", Type: double[], %u items: {", count); for (i = 0; i < count; i++) { gdouble val = tvb_get_letohieee_double(tvb, offset); proto_item_append_text(ti, "%g, ", val); proto_tree_add_item(yami_param, hf_yami_param_value_double, tvb, offset, 8, ENC_LITTLE_ENDIAN); offset += 8; } proto_item_append_text(ti, "}"); break; } case YAMI_TYPE_STRING_ARRAY: { guint32 count; guint i; count = tvb_get_letohl(tvb, offset); proto_tree_add_item(yami_param, hf_yami_items_count, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; proto_item_append_text(ti, ", Type: string[], %u items: {", count); for (i = 0; i < count; i++) { const int val_offset = offset; guint32 val_len; char *val; val_len = tvb_get_letohl(tvb, offset); offset += 4; val = tvb_get_ephemeral_string_enc(tvb, offset, val_len, ENC_ASCII | ENC_NA); proto_item_append_text(ti, "\"%s\", ", val); proto_tree_add_string(yami_param, hf_yami_param_value_str, tvb, val_offset, offset - val_offset, val); offset += (val_len + 3) & ~3; } proto_item_append_text(ti, "}"); break; } case YAMI_TYPE_BINARY_ARRAY: { guint32 count; guint i; count = tvb_get_letohl(tvb, offset); proto_tree_add_item(yami_param, hf_yami_items_count, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; proto_item_append_text(ti, ", Type: binary[], %u items: {", count); for (i = 0; i < count; i++) { const int val_offset = offset; guint32 val_len; const guint8 *val; char *repr; val_len = tvb_get_letohl(tvb, offset); offset += 4; val = tvb_get_ptr(tvb, offset, val_len); repr = bytes_to_str(val, val_len); proto_item_append_text(ti, "%s, ", repr); offset += (val_len + 3) & ~3; proto_tree_add_bytes_format_value(yami_param, hf_yami_param_value_bin, tvb, val_offset, offset - val_offset, val, "%s", repr); } proto_item_append_text(ti, "}"); break; } case YAMI_TYPE_NESTED: { guint32 count; guint i; count = tvb_get_letohl(tvb, offset); proto_tree_add_item(yami_param, hf_yami_params_count, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; proto_item_append_text(ti, ", Type: nested, %u parameters: ", count); for (i = 0; i < count; i++) { offset = dissect_yami_parameter(tvb, yami_param, offset, ti); /* smth went wrong */ if (offset == -1) return -1; } break; } default: proto_item_append_text(ti, ", Type: unknown (%d)!", type); return -1; } proto_item_set_len(ti, offset - orig_offset); return offset; }