Bluetooth: Controller: Add target address into common extended header

Add and retain in subsequent updates the target address
in the auxiliary PDUs.

Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
diff --git a/subsys/bluetooth/controller/ll_sw/ull_adv.c b/subsys/bluetooth/controller/ll_sw/ull_adv.c
index 1399dd5..2d412e6 100644
--- a/subsys/bluetooth/controller/ll_sw/ull_adv.c
+++ b/subsys/bluetooth/controller/ll_sw/ull_adv.c
@@ -428,6 +428,10 @@
 			pdu->tx_addr = 0;
 		}
 
+		/* TargetA flag */
+		if (pri_hdr_prev.tgt_addr) {
+			pri_dptr_prev += BDADDR_SIZE;
+		}
 		/* TargetA flag in primary channel PDU only for directed */
 		if (evt_prop & BT_HCI_LE_ADV_PROP_DIRECT) {
 			pri_hdr->tgt_addr = 1;
@@ -441,12 +445,17 @@
 
 		/* ADI flag */
 		if (pri_hdr_prev.adi) {
+			pri_dptr_prev += sizeof(struct pdu_adv_adi);
+
 			pri_hdr->adi = 1;
 			pri_dptr += sizeof(struct pdu_adv_adi);
 		}
 
 #if (CONFIG_BT_CTLR_ADV_AUX_SET > 0)
 		/* AuxPtr flag */
+		if (pri_hdr_prev.aux_ptr) {
+			pri_dptr_prev += sizeof(struct pdu_adv_aux_ptr);
+		}
 		/* Need aux for connectable or scannable extended advertising */
 		if (pri_hdr_prev.aux_ptr ||
 		    ((evt_prop & (BT_HCI_LE_ADV_PROP_CONN |
@@ -459,6 +468,9 @@
 		/* No SyncInfo flag in primary channel PDU */
 
 		/* Tx Power flag */
+		if (pri_hdr_prev.tx_pwr) {
+			pri_dptr_prev++;
+		}
 		/* C1, Tx Power is optional on the LE 1M PHY, and reserved for
 		 * for future use on the LE Coded PHY.
 		 */
@@ -482,6 +494,9 @@
 		/* No ACAD in primary channel PDU */
 
 		/* Tx Power */
+		if (pri_hdr_prev.tx_pwr) {
+			pri_dptr_prev--;
+		}
 		if (pri_hdr->tx_pwr) {
 			uint8_t _tx_pwr;
 
@@ -501,6 +516,9 @@
 
 #if (CONFIG_BT_CTLR_ADV_AUX_SET > 0)
 		/* AuxPtr */
+		if (pri_hdr_prev.aux_ptr) {
+			pri_dptr_prev -= sizeof(struct pdu_adv_aux_ptr);
+		}
 		if (pri_hdr->aux_ptr) {
 			ull_adv_aux_ptr_fill(&pri_dptr, phy_s);
 		}
@@ -508,14 +526,17 @@
 #endif /* (CONFIG_BT_CTLR_ADV_AUX_SET > 0) */
 
 		/* ADI */
+		if (pri_hdr_prev.adi) {
+			pri_dptr_prev -= sizeof(struct pdu_adv_adi);
+		}
 		if (pri_hdr->adi) {
 			struct pdu_adv_adi *adi;
 
 			pri_dptr -= sizeof(struct pdu_adv_adi);
 
-			/* NOTE: memcpy shall handle overlapping buffers */
-			memcpy(pri_dptr, pri_dptr_prev,
-			       sizeof(struct pdu_adv_adi));
+			/* NOTE: memmove shall handle overlapping buffers */
+			memmove(pri_dptr, pri_dptr_prev,
+				sizeof(struct pdu_adv_adi));
 
 			adi = (void *)pri_dptr;
 			adi->sid = sid;
@@ -525,6 +546,9 @@
 		/* No CTEInfo field in primary channel PDU */
 
 		/* TargetA */
+		if (pri_hdr_prev.tgt_addr) {
+			pri_dptr_prev -= BDADDR_SIZE;
+		}
 		if (pri_hdr->tgt_addr) {
 			pri_dptr -= BDADDR_SIZE;
 			/* NOTE: RPA will be updated on enable, if needed */
diff --git a/subsys/bluetooth/controller/ll_sw/ull_adv_aux.c b/subsys/bluetooth/controller/ll_sw/ull_adv_aux.c
index 017e6e9..ef031e2 100644
--- a/subsys/bluetooth/controller/ll_sw/ull_adv_aux.c
+++ b/subsys/bluetooth/controller/ll_sw/ull_adv_aux.c
@@ -583,7 +583,6 @@
 		return BT_HCI_ERR_UNSPECIFIED;
 	}
 	pri_pdu->tx_addr = 0U;
-	pri_pdu->rx_addr = 0U;
 
 	if (pri_hdr_prev.adv_addr) {
 		pri_dptr_prev += BDADDR_SIZE;
@@ -593,7 +592,31 @@
 	}
 	sec_dptr += BDADDR_SIZE;
 
-	/* No TargetA in primary and secondary channel for undirected */
+	/* No TargetA in primary and secondary channel for undirected.
+	 * Move from primary to secondary PDU, if present in primary PDU.
+	 */
+	if (pri_hdr_prev.tgt_addr) {
+		sec_hdr->tgt_addr = 1U;
+		sec_pdu->rx_addr = pri_pdu_prev->rx_addr;
+		sec_dptr += BDADDR_SIZE;
+
+	/* Retain the target address if present in the previous PDU */
+	} else if (!(sec_hdr_add_fields & ULL_ADV_PDU_HDR_FIELD_ADVA) &&
+		   sec_hdr_prev.tgt_addr) {
+		sec_hdr->tgt_addr = 1U;
+		sec_pdu->rx_addr = sec_pdu_prev->rx_addr;
+		sec_dptr += BDADDR_SIZE;
+	}
+	pri_pdu->rx_addr = 0U;
+
+	if (pri_hdr_prev.tgt_addr) {
+		pri_dptr_prev += BDADDR_SIZE;
+	}
+
+	if (sec_hdr_prev.tgt_addr) {
+		sec_dptr_prev += BDADDR_SIZE;
+	}
+
 	/* No CTEInfo flag in primary and secondary channel PDU */
 
 	/* ADI flag */
@@ -815,7 +838,24 @@
 
 	/* No CTEInfo field in primary channel PDU */
 
-	/* No TargetA non-conn non-scan advertising  */
+	/* No TargetA non-conn non-scan advertising, but present in directed
+	 * advertising.
+	 */
+	if (sec_hdr->tgt_addr) {
+		void *bdaddr;
+
+		if (sec_hdr_prev.tgt_addr) {
+			sec_dptr_prev -= BDADDR_SIZE;
+			bdaddr = sec_dptr_prev;
+		} else {
+			pri_dptr_prev -= BDADDR_SIZE;
+			bdaddr = pri_dptr_prev;
+		}
+
+		sec_dptr -= BDADDR_SIZE;
+
+		memcpy(sec_dptr, bdaddr, BDADDR_SIZE);
+	}
 
 	/* No AdvA in primary channel due to AuxPtr being added */