Upgrade bluez5_37 :Merge the code from private
[platform/upstream/bluez.git] / monitor / ll.c
index e9d0cf6..6212f79 100644 (file)
@@ -245,7 +245,7 @@ static void advertising_packet(const void *data, uint8_t size)
        }
 }
 
-static void data_packet(const void *data, uint8_t size)
+static void data_packet(const void *data, uint8_t size, bool padded)
 {
        const uint8_t *ptr = data;
        uint8_t llid, length;
@@ -290,7 +290,7 @@ static void data_packet(const void *data, uint8_t size)
 
        switch (llid) {
        case 0x03:
-               llcp_packet(data + 2, size - 2);
+               llcp_packet(data + 2, size - 2, padded);
                break;
 
        default:
@@ -299,7 +299,7 @@ static void data_packet(const void *data, uint8_t size)
        }
 }
 
-void ll_packet(uint16_t frequency, const void *data, uint8_t size)
+void ll_packet(uint16_t frequency, const void *data, uint8_t size, bool padded)
 {
        const struct bt_ll_hdr *hdr = data;
        uint8_t channel = (frequency - 2402) / 2;
@@ -368,7 +368,7 @@ void ll_packet(uint16_t frequency, const void *data, uint8_t size)
        if (access_addr == 0x8e89bed6)
                advertising_packet(pdu_data, pdu_len);
        else
-               data_packet(pdu_data, pdu_len);
+               data_packet(pdu_data, pdu_len, padded);
 }
 
 static void null_pdu(const void *data, uint8_t size)
@@ -460,6 +460,21 @@ static void reject_ind(const void *data, uint8_t size)
        packet_print_error("Error code", pdu->error);
 }
 
+static void slave_feature_req(const void *data, uint8_t size)
+{
+       const struct bt_ll_slave_feature_req *pdu = data;
+
+       packet_print_features_ll(pdu->features);
+}
+
+static void reject_ind_ext(const void *data, uint8_t size)
+{
+       const struct bt_ll_reject_ind_ext *pdu = data;
+
+       print_field("Reject opcode: %u (0x%2.2x)", pdu->opcode, pdu->opcode);
+       packet_print_error("Error code", pdu->error);
+}
+
 struct llcp_data {
        uint8_t opcode;
        const char *str;
@@ -469,22 +484,28 @@ struct llcp_data {
 };
 
 static const struct llcp_data llcp_table[] = {
-       { 0x00, "LL_CONNECTION_UPDATE_REQ", conn_update_req, 11, true },
-       { 0x01, "LL_CHANNEL_MAP_REQ",       channel_map_req,  7, true },
-       { 0x02, "LL_TERMINATE_IND",         terminate_ind,    1, true },
-       { 0x03, "LL_ENC_REQ",               enc_req,         22, true },
-       { 0x04, "LL_ENC_RSP",               enc_rsp,         12, true },
-       { 0x05, "LL_START_ENC_REQ",         null_pdu,         0, true },
-       { 0x06, "LL_START_ENC_RSP",         null_pdu,         0, true },
-       { 0x07, "LL_UNKNOWN_RSP",           unknown_rsp,      1, true },
-       { 0x08, "LL_FEATURE_REQ",           feature_req,      8, true },
-       { 0x09, "LL_FEATURE_RSP",           feature_rsp,      8, true },
-       { 0x0a, "LL_PAUSE_ENC_REQ",         null_pdu,         0, true },
-       { 0x0b, "LL_PAUSE_ENC_RSP",         null_pdu,         0, true },
-       { 0x0c, "LL_VERSION_IND",           version_ind,      5, true },
-       { 0x0d, "LL_REJECT_IND",            reject_ind,       1, true },
-       { 0x12, "LL_PING_REQ",              null_pdu,         0, true },
-       { 0x13, "LL_PING_RSP",              null_pdu,         0, true },
+       { 0x00, "LL_CONNECTION_UPDATE_REQ", conn_update_req,   11, true },
+       { 0x01, "LL_CHANNEL_MAP_REQ",       channel_map_req,    7, true },
+       { 0x02, "LL_TERMINATE_IND",         terminate_ind,      1, true },
+       { 0x03, "LL_ENC_REQ",               enc_req,           22, true },
+       { 0x04, "LL_ENC_RSP",               enc_rsp,           12, true },
+       { 0x05, "LL_START_ENC_REQ",         null_pdu,           0, true },
+       { 0x06, "LL_START_ENC_RSP",         null_pdu,           0, true },
+       { 0x07, "LL_UNKNOWN_RSP",           unknown_rsp,        1, true },
+       { 0x08, "LL_FEATURE_REQ",           feature_req,        8, true },
+       { 0x09, "LL_FEATURE_RSP",           feature_rsp,        8, true },
+       { 0x0a, "LL_PAUSE_ENC_REQ",         null_pdu,           0, true },
+       { 0x0b, "LL_PAUSE_ENC_RSP",         null_pdu,           0, true },
+       { 0x0c, "LL_VERSION_IND",           version_ind,        5, true },
+       { 0x0d, "LL_REJECT_IND",            reject_ind,         1, true },
+       { 0x0e, "LL_SLAVE_FEATURE_REQ",     slave_feature_req,  8, true },
+       { 0x0f, "LL_CONNECTION_PARAM_REQ",  NULL,              23, true },
+       { 0x10, "LL_CONNECTION_PARAM_RSP",  NULL,              23, true },
+       { 0x11, "LL_REJECT_IND_EXT",        reject_ind_ext,     2, true },
+       { 0x12, "LL_PING_REQ",              null_pdu,           0, true },
+       { 0x13, "LL_PING_RSP",              null_pdu,           0, true },
+       { 0x14, "LL_LENGTH_REQ",            NULL,               8, true },
+       { 0x15, "LL_LENGTH_RSP",            NULL,               8, true },
        { }
 };
 
@@ -500,7 +521,7 @@ static const char *opcode_to_string(uint8_t opcode)
        return "Unknown";
 }
 
-void llcp_packet(const void *data, uint8_t size)
+void llcp_packet(const void *data, uint8_t size, bool padded)
 {
        uint8_t opcode = ((const uint8_t *) data)[0];
        const struct llcp_data *llcp_data = NULL;
@@ -533,7 +554,7 @@ void llcp_packet(const void *data, uint8_t size)
                return;
        }
 
-       if (llcp_data->fixed) {
+       if (llcp_data->fixed && !padded) {
                if (size - 1 != llcp_data->size) {
                        print_text(COLOR_ERROR, "invalid packet size");
                        packet_hexdump(data + 1, size - 1);