Skip to content

Commit fd359ac

Browse files
robertfalkenbergcodebot
authored andcommitted
nru: add support for Rel.16 flags/fields in NR-U DL User Data
1 parent 88425e8 commit fd359ac

File tree

3 files changed

+144
-16
lines changed

3 files changed

+144
-16
lines changed

include/srsran/nru/nru_message.h

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,17 @@ struct nru_dl_user_data {
7272
/// This parameter indicates that the node hosting the NR PDCP entity requests the other side to provide the downlink
7373
/// delivery status report.
7474
bool report_polling = false;
75+
/// Request OutOfSeq Report.
76+
/// This parameter indicates that the node hosting the NR PDCP entity requests the corresponding node to report the NR
77+
/// PDCP PDU sequence number successfully delivered out of sequence in downlink delivery status report.
78+
bool request_out_of_seq_report = false;
79+
/// Report Delivered.
80+
/// This parameter indicates the presence of DL report NR PDCP PDU SN.
81+
bool report_delivered = false;
82+
/// User data existence flag.
83+
/// This parameter indicates whether the node hosting the NR PDCP entity has some user data for the concerned data
84+
/// radio bearer.
85+
bool user_data_existence_flag = false;
7586
/// Assistance Information Report Polling Flag.
7687
/// This parameter indicates that the node hosting the NR PDCP entity requests the corresponding node to send an
7788
/// ASSISTANCE INFORMATION DATA PDU.
@@ -89,13 +100,19 @@ struct nru_dl_user_data {
89100
std::optional<uint32_t> dl_discard_pdcp_sn;
90101
/// Container holding the DL discard NR PDCP PDU SN blocks.
91102
std::optional<nru_pdcp_sn_discard_blocks> discard_blocks;
103+
/// DL report NR PDCP PDU SN.
104+
/// This parameter indicates that the node hosting PDCP entity requests providing the down link delivery status report
105+
/// when the NR PDCP PDU with this sequence number has been successfully delivered.
106+
uint32_t dl_report_pdcp_sn = 0;
92107

93108
bool operator==(const nru_dl_user_data& other) const
94109
{
95-
return report_polling == other.report_polling &&
110+
return report_polling == other.report_polling && request_out_of_seq_report == other.request_out_of_seq_report &&
111+
report_delivered == other.report_delivered && user_data_existence_flag == other.user_data_existence_flag &&
96112
assist_info_report_polling_flag == other.assist_info_report_polling_flag &&
97113
retransmission_flag == other.retransmission_flag && nru_sn == other.nru_sn &&
98-
dl_discard_pdcp_sn == other.dl_discard_pdcp_sn && discard_blocks == other.discard_blocks;
114+
dl_discard_pdcp_sn == other.dl_discard_pdcp_sn && discard_blocks == other.discard_blocks &&
115+
dl_report_pdcp_sn == other.dl_report_pdcp_sn;
99116
}
100117
};
101118

lib/nru/nru_packing.cpp

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,23 @@ bool nru_packing::unpack(nru_dl_user_data& dl_user_data, byte_buffer_view contai
7575
// Report polling
7676
VERIFY_READ(decoder.unpack(dl_user_data.report_polling, 1));
7777

78-
// Spare (v15.2.0)
78+
// Spare (v16.1.0)
7979
spare = {};
80-
VERIFY_READ(decoder.unpack(spare, 6));
80+
VERIFY_READ(decoder.unpack(spare, 3));
8181
if (spare != 0) {
8282
logger.error("Failed to unpack DL user data: Spare bits set in second octet. value={:#x}", spare);
8383
return false;
8484
}
8585

86+
// Request OutOfSeq Report
87+
decoder.unpack(dl_user_data.request_out_of_seq_report, 1);
88+
89+
// Report Delivered
90+
decoder.unpack(dl_user_data.report_delivered, 1);
91+
92+
// User data existence flag
93+
decoder.unpack(dl_user_data.user_data_existence_flag, 1);
94+
8695
// Assistance Info Report Polling Flag
8796
decoder.unpack(dl_user_data.assist_info_report_polling_flag, 1);
8897

@@ -121,6 +130,11 @@ bool nru_packing::unpack(nru_dl_user_data& dl_user_data, byte_buffer_view contai
121130
}
122131
}
123132

133+
// DL report NR PDCP PDU SN
134+
if (dl_user_data.report_delivered) {
135+
VERIFY_READ(decoder.unpack(dl_user_data.dl_report_pdcp_sn, 24));
136+
}
137+
124138
return true;
125139
};
126140

@@ -145,8 +159,17 @@ bool nru_packing::pack(byte_buffer& out_buf, const nru_dl_user_data& dl_user_dat
145159
// Report polling
146160
VERIFY_WRITE(encoder.pack(dl_user_data.report_polling, 1));
147161

148-
// Spare (v15.2.0)
149-
VERIFY_WRITE(encoder.pack(0, 6));
162+
// Spare (v16.1.0)
163+
VERIFY_WRITE(encoder.pack(0, 3));
164+
165+
// Request OutOfSeq Report
166+
VERIFY_WRITE(encoder.pack(dl_user_data.request_out_of_seq_report, 1));
167+
168+
// Report Delivered
169+
VERIFY_WRITE(encoder.pack(dl_user_data.report_delivered, 1));
170+
171+
// User data existence flag
172+
VERIFY_WRITE(encoder.pack(dl_user_data.user_data_existence_flag, 1));
150173

151174
// Assistance Info Report Polling Flag
152175
VERIFY_WRITE(encoder.pack(dl_user_data.assist_info_report_polling_flag, 1));
@@ -174,6 +197,11 @@ bool nru_packing::pack(byte_buffer& out_buf, const nru_dl_user_data& dl_user_dat
174197
}
175198
}
176199

200+
// DL report NR PDCP PDU SN
201+
if (dl_user_data.report_delivered) {
202+
VERIFY_WRITE(encoder.pack(dl_user_data.dl_report_pdcp_sn, 24));
203+
}
204+
177205
// Add padding such that length is (n*4-2) octets, where n is a positive integer.
178206
while (((out_buf.length() - start_len) + 2) % 4) {
179207
VERIFY_WRITE(out_buf.append(0x0));

tests/unittests/nru/nru_packing_test.cpp

Lines changed: 93 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ TEST_F(nru_packing_test, unpack_nru_dl_user_data_smallest)
5353
{
5454
const uint8_t packed_vec[] = {
5555
0x00, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
56-
0x00, // 6Spare | Assist Info Rep Poll Flag | Retransmission flag
56+
0x00, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
5757
0x11, // NR-U Sequence Number (upper byte)
5858
0x22, // NR-U Sequence Number (mid byte)
5959
0x33, // NR-U Sequence Number (lower byte)
@@ -78,7 +78,7 @@ TEST_F(nru_packing_test, unpack_nru_dl_user_data_with_dl_flush)
7878
{
7979
const uint8_t packed_vec[] = {
8080
0x02, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
81-
0x00, // 6Spare | Assist Info Rep Poll Flag | Retransmission flag
81+
0x00, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
8282
0x11, // NR-U Sequence Number (upper byte)
8383
0x22, // NR-U Sequence Number (mid byte)
8484
0x33, // NR-U Sequence Number (lower byte)
@@ -108,7 +108,7 @@ TEST_F(nru_packing_test, unpack_nru_dl_user_data_with_report_polling)
108108
{
109109
const uint8_t packed_vec[] = {
110110
0x01, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
111-
0x00, // 6Spare | Assist Info Rep Poll Flag | Retransmission flag
111+
0x00, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
112112
0x11, // NR-U Sequence Number (upper byte)
113113
0x22, // NR-U Sequence Number (mid byte)
114114
0x33, // NR-U Sequence Number (lower byte)
@@ -130,11 +130,94 @@ TEST_F(nru_packing_test, unpack_nru_dl_user_data_with_report_polling)
130130
EXPECT_EQ(out_buf, packed_buf);
131131
}
132132

133+
TEST_F(nru_packing_test, unpack_nru_dl_user_data_with_request_out_of_sequence_report)
134+
{
135+
const uint8_t packed_vec[] = {
136+
0x00, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
137+
0x10, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
138+
0x11, // NR-U Sequence Number (upper byte)
139+
0x22, // NR-U Sequence Number (mid byte)
140+
0x33, // NR-U Sequence Number (lower byte)
141+
// No further fields
142+
0x00, // Padding
143+
};
144+
145+
byte_buffer packed_buf = byte_buffer::create(packed_vec).value();
146+
nru_dl_user_data out_data;
147+
EXPECT_TRUE(packer->unpack(out_data, packed_buf));
148+
nru_dl_user_data exp_data{};
149+
exp_data.nru_sn = 0x112233;
150+
exp_data.request_out_of_seq_report = true;
151+
EXPECT_EQ(out_data, exp_data);
152+
153+
// Test packing
154+
byte_buffer out_buf;
155+
EXPECT_TRUE(packer->pack(out_buf, exp_data));
156+
EXPECT_EQ(out_buf, packed_buf);
157+
}
158+
159+
TEST_F(nru_packing_test, unpack_nru_dl_user_data_with_report_delivered)
160+
{
161+
const uint8_t packed_vec[] = {
162+
0x00, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
163+
0x08, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
164+
0x11, // NR-U Sequence Number (upper byte)
165+
0x22, // NR-U Sequence Number (mid byte)
166+
0x33, // NR-U Sequence Number (lower byte)
167+
0xee, // DL report NR PDCP PDU SN (upper byte)
168+
0xdd, // DL report NR PDCP PDU SN (mid byte)
169+
0xcc, // DL report NR PDCP PDU SN (lower byte)
170+
// No further fields
171+
0x00, // Padding
172+
0x00, // Padding
173+
};
174+
175+
byte_buffer packed_buf = byte_buffer::create(packed_vec).value();
176+
nru_dl_user_data out_data;
177+
EXPECT_TRUE(packer->unpack(out_data, packed_buf));
178+
nru_dl_user_data exp_data{};
179+
exp_data.nru_sn = 0x112233;
180+
exp_data.report_delivered = true;
181+
exp_data.dl_report_pdcp_sn = 0xeeddcc;
182+
EXPECT_EQ(out_data, exp_data);
183+
184+
// Test packing
185+
byte_buffer out_buf;
186+
EXPECT_TRUE(packer->pack(out_buf, exp_data));
187+
EXPECT_EQ(out_buf, packed_buf);
188+
}
189+
190+
TEST_F(nru_packing_test, unpack_nru_dl_user_data_with_user_data_existence_flag)
191+
{
192+
const uint8_t packed_vec[] = {
193+
0x00, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
194+
0x04, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
195+
0x11, // NR-U Sequence Number (upper byte)
196+
0x22, // NR-U Sequence Number (mid byte)
197+
0x33, // NR-U Sequence Number (lower byte)
198+
// No further fields
199+
0x00, // Padding
200+
};
201+
202+
byte_buffer packed_buf = byte_buffer::create(packed_vec).value();
203+
nru_dl_user_data out_data;
204+
EXPECT_TRUE(packer->unpack(out_data, packed_buf));
205+
nru_dl_user_data exp_data{};
206+
exp_data.nru_sn = 0x112233;
207+
exp_data.user_data_existence_flag = true;
208+
EXPECT_EQ(out_data, exp_data);
209+
210+
// Test packing
211+
byte_buffer out_buf;
212+
EXPECT_TRUE(packer->pack(out_buf, exp_data));
213+
EXPECT_EQ(out_buf, packed_buf);
214+
}
215+
133216
TEST_F(nru_packing_test, unpack_nru_dl_user_data_with_assist_info_flag)
134217
{
135218
const uint8_t packed_vec[] = {
136219
0x00, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
137-
0x02, // 6Spare | Assist Info Rep Poll Flag | Retransmission flag
220+
0x02, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
138221
0x11, // NR-U Sequence Number (upper byte)
139222
0x22, // NR-U Sequence Number (mid byte)
140223
0x33, // NR-U Sequence Number (lower byte)
@@ -160,7 +243,7 @@ TEST_F(nru_packing_test, unpack_nru_dl_user_data_with_retransmission_flag)
160243
{
161244
const uint8_t packed_vec[] = {
162245
0x00, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
163-
0x01, // 6Spare | Assist Info Rep Poll Flag | Retransmission flag
246+
0x01, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
164247
0x11, // NR-U Sequence Number (upper byte)
165248
0x22, // NR-U Sequence Number (mid byte)
166249
0x33, // NR-U Sequence Number (lower byte)
@@ -186,7 +269,7 @@ TEST_F(nru_packing_test, unpack_nru_dl_user_data_with_discard_blocks)
186269
{
187270
const uint8_t packed_vec[] = {
188271
0x04, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
189-
0x00, // 6Spare | Assist Info Rep Poll Flag | Retransmission flag
272+
0x00, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
190273
0x11, // NR-U Sequence Number (upper byte)
191274
0x22, // NR-U Sequence Number (mid byte)
192275
0x33, // NR-U Sequence Number (lower byte)
@@ -228,7 +311,7 @@ TEST_F(nru_packing_test, unpack_nru_dl_user_data_invalid_pdu_type)
228311
{
229312
const uint8_t packed_vec[] = {
230313
0xe0, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
231-
0x00, // 6Spare | Assist Info Rep Poll Flag | Retransmission flag
314+
0x00, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
232315
0x11, // NR-U Sequence Number (upper byte)
233316
0x22, // NR-U Sequence Number (mid byte)
234317
0x33, // NR-U Sequence Number (lower byte)
@@ -245,7 +328,7 @@ TEST_F(nru_packing_test, unpack_nru_dl_user_data_missing_padding)
245328
{
246329
const uint8_t packed_vec[] = {
247330
0xe0, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
248-
0x00, // 6Spare | Assist Info Rep Poll Flag | Retransmission flag
331+
0x00, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
249332
0x11, // NR-U Sequence Number (upper byte)
250333
0x22, // NR-U Sequence Number (mid byte)
251334
0x33, // NR-U Sequence Number (lower byte)
@@ -262,7 +345,7 @@ TEST_F(nru_packing_test, unpack_nru_dl_user_data_excessive_padding)
262345
{
263346
const uint8_t packed_vec[] = {
264347
0xe0, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
265-
0x00, // 6Spare | Assist Info Rep Poll Flag | Retransmission flag
348+
0x00, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
266349
0x11, // NR-U Sequence Number (upper byte)
267350
0x22, // NR-U Sequence Number (mid byte)
268351
0x33, // NR-U Sequence Number (lower byte)
@@ -280,7 +363,7 @@ TEST_F(nru_packing_test, unpack_nru_dl_user_data_with_too_large_nof_discard_bloc
280363
{
281364
const uint8_t packed_vec[] = {
282365
0x04, // 4PDU Type | Spare | DL Discard Blocks | DL Flush | Report polling
283-
0x00, // 6Spare | Assist Info Rep Poll Flag | Retransmission flag
366+
0x00, // 3Spare | Req OoS Rep | Rep Deliv | User Data Ex | Assist Info Rep Poll Flag | Retransmission flag
284367
0x11, // NR-U Sequence Number (upper byte)
285368
0x22, // NR-U Sequence Number (mid byte)
286369
0x33, // NR-U Sequence Number (lower byte)

0 commit comments

Comments
 (0)