@@ -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. */
3327enum 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 ;
0 commit comments