Commit a11868fe authored by Vinayak Kariappa Chettimada's avatar Vinayak Kariappa Chettimada Committed by Carles Cufi
Browse files

Bluetooth: controller: Fix conn param req procedure response



Fix Connection Parameter Request Procedure implementation
to respond with sent interval_min and interval_max so that
certain peer devices dont reject the response as Invalid LL
Parameters.

Signed-off-by: default avatarVinayak Kariappa Chettimada <vich@nordicsemi.no>
parent 08d5c5ef
Loading
Loading
Loading
Loading
+28 −19
Original line number Diff line number Diff line
@@ -1938,7 +1938,8 @@ isr_rx_conn_pkt_ctrl_rej_conn_upd(struct radio_pdu_node_rx *node_rx,

		conn->llcp.conn_upd.win_size = 1;
		conn->llcp.conn_upd.win_offset_us = 0;
		conn->llcp.conn_upd.interval = conn->llcp_conn_param.interval;
		conn->llcp.conn_upd.interval =
			conn->llcp_conn_param.interval_max;
		conn->llcp.conn_upd.latency = conn->llcp_conn_param.latency;
		conn->llcp.conn_upd.timeout = conn->llcp_conn_param.timeout;
		/* conn->llcp.conn_upd.instant     = 0; */
@@ -2758,7 +2759,10 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *node_rx, u8_t *rx_enqueue)

				/* save parameters to be used to select offset
				 */
				conn->llcp_conn_param.interval = cpr->interval_min;
				conn->llcp_conn_param.interval_min =
					cpr->interval_min;
				conn->llcp_conn_param.interval_max =
					cpr->interval_max;
				conn->llcp_conn_param.latency =	cpr->latency;
				conn->llcp_conn_param.timeout =	cpr->timeout;
				conn->llcp_conn_param.preferred_periodicity =
@@ -2775,7 +2779,7 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *node_rx, u8_t *rx_enqueue)
				/* enqueue the conn param req, if parameters
				 * changed, else respond.
				 */
				if ((conn->llcp_conn_param.interval !=
				if ((conn->llcp_conn_param.interval_max !=
				     conn->conn_interval) ||
				    (conn->llcp_conn_param.latency !=
				     conn->latency) ||
@@ -2838,7 +2842,8 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *node_rx, u8_t *rx_enqueue)
			/* resp to be generated by app, for now save
			 * parameters
			 */
			conn->llcp_conn_param.interval = cpr->interval_min;
			conn->llcp_conn_param.interval_min = cpr->interval_min;
			conn->llcp_conn_param.interval_max = cpr->interval_max;
			conn->llcp_conn_param.latency =	cpr->latency;
			conn->llcp_conn_param.timeout =	cpr->timeout;
			conn->llcp_conn_param.preferred_periodicity =
@@ -2855,7 +2860,7 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *node_rx, u8_t *rx_enqueue)
			/* enqueue the conn param req, if parameters changed,
			 * else respond
			 */
			if ((conn->llcp_conn_param.interval !=
			if ((conn->llcp_conn_param.interval_max !=
			     conn->conn_interval) ||
			    (conn->llcp_conn_param.latency != conn->latency) ||
			    (RADIO_CONN_EVENTS(conn->llcp_conn_param.timeout *
@@ -2921,7 +2926,8 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *node_rx, u8_t *rx_enqueue)

			/* save parameters to be used to select offset
			 */
			conn->llcp_conn_param.interval = cpr->interval_min;
			conn->llcp_conn_param.interval_min = cpr->interval_min;
			conn->llcp_conn_param.interval_max = cpr->interval_max;
			conn->llcp_conn_param.latency =	cpr->latency;
			conn->llcp_conn_param.timeout =	cpr->timeout;
			conn->llcp_conn_param.preferred_periodicity =
@@ -2997,7 +3003,7 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *node_rx, u8_t *rx_enqueue)
				conn->llcp.conn_upd.win_size = 1;
				conn->llcp.conn_upd.win_offset_us = 0;
				conn->llcp.conn_upd.interval =
					conn->llcp_conn_param.interval;
					conn->llcp_conn_param.interval_max;
				conn->llcp.conn_upd.latency =
					conn->llcp_conn_param.latency;
				conn->llcp.conn_upd.timeout =
@@ -5341,7 +5347,8 @@ static void mayfly_sched_free_win_offset_calc(void *params)
	}

	sched_free_win_offset_calc(conn, 0, ticks_to_offset_next,
				   conn->llcp_conn_param.interval, &offset_max,
				   conn->llcp_conn_param.interval_max,
				   &offset_max,
				   (u8_t *)conn->llcp_conn_param.pdu_win_offset0);
}

@@ -5361,7 +5368,7 @@ static void mayfly_sched_win_offset_select(void *params)
						 1250);

	sched_free_win_offset_calc(conn, 1, &ticks_to_offset,
				   conn->llcp_conn_param.interval,
				   conn->llcp_conn_param.interval_max,
				   &offset_m_max, (u8_t *)&win_offset_m[0]);

	while (offset_index_s < OFFSET_S_MAX) {
@@ -7276,8 +7283,8 @@ static inline void event_conn_param_req(struct connection *conn,
		sizeof(struct pdu_data_llctrl_conn_param_req);
	pdu_ctrl_tx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_CONN_PARAM_REQ;
	p = (void *)&pdu_ctrl_tx->llctrl.conn_param_req;
	p->interval_min = conn->llcp_conn_param.interval;
	p->interval_max = conn->llcp_conn_param.interval;
	p->interval_min = conn->llcp_conn_param.interval_min;
	p->interval_max = conn->llcp_conn_param.interval_max;
	p->latency = conn->llcp_conn_param.latency;
	p->timeout = conn->llcp_conn_param.timeout;
	p->preferred_periodicity = 0;
@@ -7385,13 +7392,13 @@ static inline void event_conn_param_rsp(struct connection *conn)
		conn->llcp.conn_upd.win_offset_us = 0;
		if (conn->llcp_conn_param.preferred_periodicity) {
			conn->llcp.conn_upd.interval =
				((conn->llcp_conn_param.interval /
				((conn->llcp_conn_param.interval_max /
				  conn->llcp_conn_param.preferred_periodicity) +
				 1) *
				conn->llcp_conn_param.preferred_periodicity;
		} else {
			conn->llcp.conn_upd.interval =
				conn->llcp_conn_param.interval;
				conn->llcp_conn_param.interval_max;
		}
		conn->llcp.conn_upd.latency = conn->llcp_conn_param.latency;
		conn->llcp.conn_upd.timeout = conn->llcp_conn_param.timeout;
@@ -7417,8 +7424,8 @@ static inline void event_conn_param_rsp(struct connection *conn)
		sizeof(struct pdu_data_llctrl_conn_param_rsp);
	pdu->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_CONN_PARAM_RSP;
	rsp = (void *)&pdu->llctrl.conn_param_rsp;
	rsp->interval_min = conn->llcp_conn_param.interval;
	rsp->interval_max = conn->llcp_conn_param.interval;
	rsp->interval_min = conn->llcp_conn_param.interval_min;
	rsp->interval_max = conn->llcp_conn_param.interval_max;
	rsp->latency = conn->llcp_conn_param.latency;
	rsp->timeout = conn->llcp_conn_param.timeout;
	rsp->preferred_periodicity =
@@ -7472,8 +7479,8 @@ static inline void event_conn_param_app_req(struct connection *conn)
		sizeof(struct pdu_data_llctrl_conn_param_req);
	pdu->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_CONN_PARAM_REQ;
	p = (void *) &pdu->llctrl.conn_param_req;
	p->interval_min = conn->llcp_conn_param.interval;
	p->interval_max = conn->llcp_conn_param.interval;
	p->interval_min = conn->llcp_conn_param.interval_min;
	p->interval_max = conn->llcp_conn_param.interval_max;
	p->latency = conn->llcp_conn_param.latency;
	p->timeout = conn->llcp_conn_param.timeout;

@@ -9232,7 +9239,8 @@ static u32_t conn_update_req(struct connection *conn)
		     BIT(BT_LE_FEAT_BIT_CONN_PARAM_REQ)))) {
		/** Perform slave intiated conn param req */
		conn->llcp_conn_param.status = 0;
		conn->llcp_conn_param.interval = conn->conn_interval;
		conn->llcp_conn_param.interval_min = conn->conn_interval;
		conn->llcp_conn_param.interval_max = conn->conn_interval;
		conn->llcp_conn_param.latency = conn->latency;
		conn->llcp_conn_param.timeout = conn->conn_interval *
						conn->supervision_reload *
@@ -10742,7 +10750,8 @@ u32_t ll_conn_update(u16_t handle, u8_t cmd, u8_t status, u16_t interval,
			}

			conn->llcp_conn_param.status = 0;
			conn->llcp_conn_param.interval = interval;
			conn->llcp_conn_param.interval_min = interval;
			conn->llcp_conn_param.interval_max = interval;
			conn->llcp_conn_param.latency = latency;
			conn->llcp_conn_param.timeout = timeout;
			conn->llcp_conn_param.state = cmd;
+2 −1
Original line number Diff line number Diff line
@@ -210,7 +210,8 @@ struct connection {
		u8_t  cmd:1;
		u8_t  disabled:1;
		u8_t  status;
		u16_t interval;
		u16_t interval_min;
		u16_t interval_max;
		u16_t latency;
		u16_t timeout;
		u8_t  preferred_periodicity;