@@ -750,7 +750,7 @@ Socket_t FreeRTOS_socket( BaseType_t xDomain,
750750 #endif /* ipconfigUDP_MAX_RX_PACKETS > 0 */
751751
752752 #if ( ipconfigSUPPORT_IP_MULTICAST != 0 )
753- pxSocket -> u .xUDP .ucMulticastTTL = ipconfigMULTICAST_DEFAULT_TTL ;
753+ pxSocket -> u .xUDP .xMulticastTTL = ipconfigMULTICAST_DEFAULT_TTL ;
754754 vListInitialise ( & pxSocket -> u .xUDP .xMulticastGroupsList );
755755 #endif
756756 }
@@ -1450,7 +1450,7 @@ static int32_t prvSendUDPPacket( const FreeRTOS_Socket_t * pxSocket,
14501450 #if ( ipconfigSUPPORT_IP_MULTICAST != 0 )
14511451 if ( xIsIPv4Multicast ( pxDestinationAddress -> sin_address .ulIP_IPv4 ) )
14521452 {
1453- pxNetworkBuffer -> ucSendTTL = pxSocket -> u .xUDP .ucMulticastTTL ;
1453+ pxNetworkBuffer -> ucSendTTL = ( uint8_t ) pxSocket -> u .xUDP .xMulticastTTL ;
14541454 }
14551455 else
14561456 {
@@ -2969,6 +2969,7 @@ BaseType_t FreeRTOS_setsockopt( Socket_t xSocket,
29692969
29702970 #if ( ipconfigSUPPORT_IP_MULTICAST != 0 )
29712971 case FREERTOS_SO_IP_MULTICAST_TTL :
2972+ case FREERTOS_SO_IPV6_MULTICAST_HOPS :
29722973 case FREERTOS_SO_IP_ADD_MEMBERSHIP :
29732974 case FREERTOS_SO_IP_DROP_MEMBERSHIP :
29742975 xReturn = prvSetMulticastSocketOption ( xSocket , lLevel , lOptionName , pvOptionValue , uxOptionLength );
@@ -6420,15 +6421,46 @@ void * pvSocketGetSocketID( const ConstSocket_t xSocket )
64206421 {
64216422 case FREERTOS_SO_IP_MULTICAST_TTL :
64226423
6423- if ( ( pxSocket -> ucProtocol != ( uint8_t ) FREERTOS_IPPROTO_UDP ) || ( uxOptionLength != sizeof ( uint8_t ) ) )
6424+ {
6425+ uint8_t ucValue = * ( ( uint8_t * ) pvOptionValue );
6426+
6427+ if ( ( ( pxSocket -> bits .bIsIPv6 == pdTRUE_UNSIGNED ) || pxSocket -> ucProtocol != ( uint8_t ) FREERTOS_IPPROTO_UDP ) || ( uxOptionLength != sizeof ( ucValue ) ) )
64246428 {
64256429 break ; /* will return -pdFREERTOS_ERRNO_EINVAL */
64266430 }
64276431
64286432 /* Override the default TTL value with this one. */
6429- pxSocket -> u .xUDP .ucMulticastTTL = * ( ( uint8_t * ) pvOptionValue ) ;
6433+ pxSocket -> u .xUDP .xMulticastTTL = ( BaseType_t ) ucValue ;
64306434
64316435 xReturn = 0 ;
6436+ }
6437+ break ;
6438+
6439+ case FREERTOS_SO_IPV6_MULTICAST_HOPS :
6440+ {
6441+ BaseType_t xValue = * ( ( BaseType_t * ) pvOptionValue );
6442+
6443+ if ( ( pxSocket -> bits .bIsIPv6 == pdFALSE_UNSIGNED ) || ( pxSocket -> ucProtocol != ( uint8_t ) FREERTOS_IPPROTO_UDP ) || ( uxOptionLength != sizeof ( BaseType_t ) ) )
6444+ {
6445+ break ; /* will return -pdFREERTOS_ERRNO_EINVAL */
6446+ }
6447+
6448+ if ( ( xValue < -1 ) || ( xValue > 255 ) )
6449+ {
6450+ break ; /* will return -pdFREERTOS_ERRNO_EINVAL */
6451+ }else if ( xValue == -1 )
6452+ {
6453+ /* Set the default TTL value. */
6454+ pxSocket -> u .xUDP .xMulticastTTL = ipconfigUDP_TIME_TO_LIVE ;
6455+ }
6456+ else
6457+ {
6458+ /* Override the default TTL value with this one. */
6459+ pxSocket -> u .xUDP .xMulticastTTL = xValue ;
6460+ }
6461+
6462+ xReturn = 0 ;
6463+ }
64326464 break ;
64336465
64346466 case FREERTOS_SO_IP_ADD_MEMBERSHIP :
0 commit comments