Skip to content

Commit 7c8eb25

Browse files
committed
app: Socket <op> to <family>
Change <op> parameter to <family> in #XSOCKET and #XSSOCKET. which must be used with RAW socket (<type>=3). Jira: SM-213 Signed-off-by: Tommi Rantanen <tommi.rantanen@nordicsemi.no>
1 parent 5d97c20 commit 7c8eb25

4 files changed

Lines changed: 168 additions & 119 deletions

File tree

app/src/sm_at_socket.c

Lines changed: 108 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,6 @@ LOG_MODULE_REGISTER(sm_sock, CONFIG_SM_LOG_LEVEL);
2323
#define SM_FDS_COUNT CONFIG_POSIX_OPEN_MAX
2424
#define SM_MAX_SOCKET_COUNT (SM_FDS_COUNT - 1)
2525

26-
/**@brief Socket operations. */
27-
enum sm_socket_operation {
28-
AT_SOCKET_OPEN = 0x1,
29-
AT_SOCKET_OPEN6
30-
};
31-
3226
/**@brief Socketopt operations. */
3327
enum sm_socketopt_operation {
3428
AT_SOCKETOPT_GET,
@@ -495,18 +489,33 @@ static int do_socket_open(struct sm_socket *sock)
495489
int ret = 0;
496490
int proto = IPPROTO_TCP;
497491

492+
if (sock->family != NRF_AF_INET && sock->family != NRF_AF_INET6 &&
493+
sock->family != NRF_AF_PACKET) {
494+
LOG_ERR("Socket family %d not supported", sock->family);
495+
return -ENOTSUP;
496+
}
497+
498+
if (sock->type == NRF_SOCK_RAW || sock->family == NRF_AF_PACKET) {
499+
if (sock->type != NRF_SOCK_RAW || sock->family != NRF_AF_PACKET) {
500+
LOG_ERR("Raw socket: Family and type must match");
501+
return -EINVAL;
502+
}
503+
}
504+
498505
if (sock->type == NRF_SOCK_STREAM) {
499506
ret = nrf_socket(sock->family, NRF_SOCK_STREAM, NRF_IPPROTO_TCP);
500507
} else if (sock->type == NRF_SOCK_DGRAM) {
501508
ret = nrf_socket(sock->family, NRF_SOCK_DGRAM, NRF_IPPROTO_UDP);
502509
proto = NRF_IPPROTO_UDP;
503510
} else if (sock->type == NRF_SOCK_RAW) {
504-
sock->family = NRF_SOCK_RAW;
505-
sock->role = NRF_SO_SEC_ROLE_CLIENT;
511+
if (sock->role != NRF_SO_SEC_ROLE_CLIENT) {
512+
LOG_ERR("Raw socket: Role must be client");
513+
return -EINVAL;
514+
}
506515
ret = nrf_socket(sock->family, NRF_SOCK_RAW, NRF_IPPROTO_RAW);
507516
proto = NRF_IPPROTO_IP;
508517
} else {
509-
LOG_ERR("socket type %d not supported", sock->type);
518+
LOG_ERR("Socket type %d not supported", sock->type);
510519
return -ENOTSUP;
511520
}
512521
if (ret < 0) {
@@ -552,8 +561,13 @@ static int do_secure_socket_open(struct sm_socket *sock, int peer_verify)
552561
int ret = 0;
553562
int proto = sock->type == NRF_SOCK_STREAM ? NRF_SPROTO_TLS1v2 : NRF_SPROTO_DTLS1v2;
554563

564+
if (sock->family != NRF_AF_INET && sock->family != NRF_AF_INET6) {
565+
LOG_ERR("Socket family %d not supported", sock->family);
566+
return -ENOTSUP;
567+
}
568+
555569
if (sock->type != NRF_SOCK_STREAM && sock->type != NRF_SOCK_DGRAM) {
556-
LOG_ERR("socket type %d not supported", sock->type);
570+
LOG_ERR("Socket type %d not supported", sock->type);
557571
return -ENOTSUP;
558572
}
559573

@@ -1233,50 +1247,46 @@ STATIC int handle_at_socket(enum at_parser_cmd_type cmd_type, struct at_parser *
12331247
uint32_t param_count)
12341248
{
12351249
int err = -EINVAL;
1236-
uint16_t op;
12371250
struct sm_socket *sock = NULL;
12381251

12391252
switch (cmd_type) {
12401253
case AT_PARSER_CMD_TYPE_SET:
1241-
err = at_parser_num_get(parser, 1, &op);
1254+
sock = find_avail_socket();
1255+
if (sock == NULL) {
1256+
LOG_ERR("Max socket count reached");
1257+
err = -EINVAL;
1258+
goto error;
1259+
}
1260+
init_socket(sock);
1261+
1262+
err = at_parser_num_get(parser, 1, &sock->family);
12421263
if (err) {
1243-
return err;
1264+
goto error;
12441265
}
1245-
if (op == AT_SOCKET_OPEN || op == AT_SOCKET_OPEN6) {
1246-
sock = find_avail_socket();
1247-
if (sock == NULL) {
1248-
LOG_ERR("Max socket count reached");
1249-
err = -EINVAL;
1250-
goto error;
1251-
}
1252-
init_socket(sock);
1253-
err = at_parser_num_get(parser, 2, &sock->type);
1254-
if (err) {
1255-
goto error;
1256-
}
1257-
err = at_parser_num_get(parser, 3, &sock->role);
1266+
err = at_parser_num_get(parser, 2, &sock->type);
1267+
if (err) {
1268+
goto error;
1269+
}
1270+
err = at_parser_num_get(parser, 3, &sock->role);
1271+
if (err) {
1272+
goto error;
1273+
}
1274+
if (param_count > 4) {
1275+
err = at_parser_num_get(parser, 4, &sock->cid);
12581276
if (err) {
12591277
goto error;
12601278
}
1261-
sock->family = (op == AT_SOCKET_OPEN) ? NRF_AF_INET : NRF_AF_INET6;
1262-
if (param_count > 4) {
1263-
err = at_parser_num_get(parser, 4, &sock->cid);
1264-
if (err) {
1265-
goto error;
1266-
}
1267-
if (sock->cid > 10) {
1268-
err = -EINVAL;
1269-
goto error;
1270-
}
1271-
}
1272-
err = do_socket_open(sock);
1273-
if (err) {
1274-
LOG_ERR("do_socket_open() failed: %d", err);
1279+
if (sock->cid > 10) {
1280+
err = -EINVAL;
12751281
goto error;
12761282
}
1277-
} else {
1278-
err = -EINVAL;
1279-
} break;
1283+
}
1284+
err = do_socket_open(sock);
1285+
if (err) {
1286+
LOG_ERR("do_socket_open() failed: %d", err);
1287+
goto error;
1288+
}
1289+
break;
12801290

12811291
case AT_PARSER_CMD_TYPE_READ:
12821292
for (int i = 0; i < SM_MAX_SOCKET_COUNT; i++) {
@@ -1291,8 +1301,8 @@ STATIC int handle_at_socket(enum at_parser_cmd_type cmd_type, struct at_parser *
12911301
break;
12921302

12931303
case AT_PARSER_CMD_TYPE_TEST:
1294-
rsp_send("\r\n#XSOCKET: <handle>,(%d,%d),(%d,%d,%d),(%d,%d),<cid>\r\n",
1295-
AT_SOCKET_OPEN, AT_SOCKET_OPEN6,
1304+
rsp_send("\r\n#XSOCKET: <handle>,(%d,%d,%d),(%d,%d,%d),(%d,%d),<cid>\r\n",
1305+
AF_INET, AF_INET6, AF_PACKET,
12961306
SOCK_STREAM, SOCK_DGRAM, SOCK_RAW,
12971307
AT_SOCKET_ROLE_CLIENT, AT_SOCKET_ROLE_SERVER);
12981308
err = 0;
@@ -1315,78 +1325,74 @@ STATIC int handle_at_secure_socket(enum at_parser_cmd_type cmd_type,
13151325
struct at_parser *parser, uint32_t param_count)
13161326
{
13171327
int err = -EINVAL;
1318-
uint16_t op;
13191328
struct sm_socket *sock = NULL;
13201329

13211330
switch (cmd_type) {
13221331
case AT_PARSER_CMD_TYPE_SET:
1323-
err = at_parser_num_get(parser, 1, &op);
1332+
sock = find_avail_socket();
1333+
if (sock == NULL) {
1334+
LOG_ERR("Max socket count reached");
1335+
err = -EINVAL;
1336+
goto error;
1337+
}
1338+
init_socket(sock);
1339+
1340+
err = at_parser_num_get(parser, 1, &sock->family);
13241341
if (err) {
1325-
return err;
1342+
goto error;
13261343
}
1327-
if (op == AT_SOCKET_OPEN || op == AT_SOCKET_OPEN6) {
1328-
/** Peer verification level for TLS connection.
1329-
* - 0 - none
1330-
* - 1 - optional
1331-
* - 2 - required
1332-
* If not set, socket will use defaults (none for servers,
1333-
* required for clients)
1334-
*/
1335-
uint16_t peer_verify;
1344+
/** Peer verification level for TLS connection.
1345+
* - 0 - none
1346+
* - 1 - optional
1347+
* - 2 - required
1348+
* If not set, socket will use defaults (none for servers,
1349+
* required for clients)
1350+
*/
1351+
uint16_t peer_verify;
13361352

1337-
sock = find_avail_socket();
1338-
if (sock == NULL) {
1339-
LOG_ERR("Max socket count reached");
1340-
err = -EINVAL;
1341-
goto error;
1342-
}
1343-
init_socket(sock);
1344-
err = at_parser_num_get(parser, 2, &sock->type);
1353+
err = at_parser_num_get(parser, 2, &sock->type);
1354+
if (err) {
1355+
goto error;
1356+
}
1357+
err = at_parser_num_get(parser, 3, &sock->role);
1358+
if (err) {
1359+
goto error;
1360+
}
1361+
if (sock->role == AT_SOCKET_ROLE_SERVER) {
1362+
peer_verify = TLS_PEER_VERIFY_NONE;
1363+
} else if (sock->role == AT_SOCKET_ROLE_CLIENT) {
1364+
peer_verify = TLS_PEER_VERIFY_REQUIRED;
1365+
} else {
1366+
err = -EINVAL;
1367+
goto error;
1368+
}
1369+
sock->sec_tag = SEC_TAG_TLS_INVALID;
1370+
err = at_parser_num_get(parser, 4, &sock->sec_tag);
1371+
if (err) {
1372+
goto error;
1373+
}
1374+
if (param_count > 5) {
1375+
err = at_parser_num_get(parser, 5, &peer_verify);
13451376
if (err) {
13461377
goto error;
13471378
}
1348-
err = at_parser_num_get(parser, 3, &sock->role);
1379+
}
1380+
if (param_count > 6) {
1381+
err = at_parser_num_get(parser, 6, &sock->cid);
13491382
if (err) {
13501383
goto error;
13511384
}
1352-
if (sock->role == AT_SOCKET_ROLE_SERVER) {
1353-
peer_verify = TLS_PEER_VERIFY_NONE;
1354-
} else if (sock->role == AT_SOCKET_ROLE_CLIENT) {
1355-
peer_verify = TLS_PEER_VERIFY_REQUIRED;
1356-
} else {
1385+
if (sock->cid > 10) {
13571386
err = -EINVAL;
13581387
goto error;
13591388
}
1360-
sock->sec_tag = SEC_TAG_TLS_INVALID;
1361-
err = at_parser_num_get(parser, 4, &sock->sec_tag);
1362-
if (err) {
1363-
goto error;
1364-
}
1365-
if (param_count > 5) {
1366-
err = at_parser_num_get(parser, 5, &peer_verify);
1367-
if (err) {
1368-
goto error;
1369-
}
1370-
}
1371-
sock->family = (op == AT_SOCKET_OPEN) ? AF_INET : AF_INET6;
1372-
if (param_count > 6) {
1373-
err = at_parser_num_get(parser, 6, &sock->cid);
1374-
if (err) {
1375-
goto error;
1376-
}
1377-
if (sock->cid > 10) {
1378-
err = -EINVAL;
1379-
goto error;
1380-
}
1381-
}
1382-
err = do_secure_socket_open(sock, peer_verify);
1383-
if (err) {
1384-
LOG_ERR("do_secure_socket_open() failed: %d", err);
1385-
goto error;
1386-
}
1387-
} else {
1388-
err = -EINVAL;
1389-
} break;
1389+
}
1390+
err = do_secure_socket_open(sock, peer_verify);
1391+
if (err) {
1392+
LOG_ERR("do_secure_socket_open() failed: %d", err);
1393+
goto error;
1394+
}
1395+
break;
13901396

13911397
case AT_PARSER_CMD_TYPE_READ:
13921398
for (int i = 0; i < SM_MAX_SOCKET_COUNT; i++) {
@@ -1403,7 +1409,7 @@ STATIC int handle_at_secure_socket(enum at_parser_cmd_type cmd_type,
14031409
case AT_PARSER_CMD_TYPE_TEST:
14041410
rsp_send("\r\n#XSSOCKET: <handle>,(%d,%d),(%d,%d),(%d,%d),"
14051411
"<sec_tag>,<peer_verify>,<cid>\r\n",
1406-
AT_SOCKET_OPEN, AT_SOCKET_OPEN6,
1412+
AF_INET, AF_INET6,
14071413
SOCK_STREAM, SOCK_DGRAM,
14081414
AT_SOCKET_ROLE_CLIENT, AT_SOCKET_ROLE_SERVER);
14091415
err = 0;

app/tests/at_socket/src/test_at_socket.c

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ void test_xsocket_ipv6_tcp(void)
302302

303303
/*
304304
* Test: Create RAW socket via AT command
305-
* - Command: AT#XSOCKET=1,3,0\r\n
305+
* - Command: AT#XSOCKET=3,3,0\r\n
306306
* - Tests: RAW socket type
307307
*/
308308
void test_xsocket_raw(void)
@@ -317,7 +317,7 @@ void test_xsocket_raw(void)
317317
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0);
318318

319319
/* Send AT command: family=1(IPv4), type=3(RAW), role=0(client) */
320-
send_at_command("AT#XSOCKET=1,3,0\r\n");
320+
send_at_command("AT#XSOCKET=3,3,0\r\n");
321321

322322
/* Verify response contains socket handle and correct type/protocol */
323323
response = get_captured_response();
@@ -331,6 +331,48 @@ void test_xsocket_raw(void)
331331
send_at_command("AT#XCLOSE=0\r\n");
332332
}
333333

334+
/*
335+
* Test: Attempt to create packet/raw socket with invalid family or type
336+
* - Command: AT#XSOCKET=1,3,0\r\n
337+
* - Command: AT#XSOCKET=3,1,0\r\n
338+
* - Tests: Invalid socket family/type rejection
339+
*/
340+
void test_xsocket_raw_invalid_family_type(void)
341+
{
342+
const char *response;
343+
344+
/* Send AT command with packet family but not raw type */
345+
send_at_command("AT#XSOCKET=3,1,0\r\n");
346+
347+
/* Verify error response */
348+
response = get_captured_response();
349+
TEST_ASSERT_TRUE(strstr(response, "ERROR") != NULL);
350+
351+
/* Send AT command with raw type but not packet family */
352+
send_at_command("AT#XSOCKET=1,3,0\r\n");
353+
354+
/* Verify error response */
355+
response = get_captured_response();
356+
TEST_ASSERT_TRUE(strstr(response, "ERROR") != NULL);
357+
}
358+
359+
/*
360+
* Test: Attempt to create socket with invalid family
361+
* - Command: AT#XSOCKET=0,1,0\r\n
362+
* - Tests: Invalid socket family rejection
363+
*/
364+
void test_xsocket_invalid_family(void)
365+
{
366+
const char *response;
367+
368+
/* Send AT command with invalid socket family 0 */
369+
send_at_command("AT#XSOCKET=0,1,0\r\n");
370+
371+
/* Verify error response */
372+
response = get_captured_response();
373+
TEST_ASSERT_TRUE(strstr(response, "ERROR") != NULL);
374+
}
375+
334376
/*
335377
* Test: Attempt to create socket with invalid type
336378
* - Command: AT#XSOCKET=1,99,0\r\n

0 commit comments

Comments
 (0)