@@ -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 );
@@ -6375,15 +6376,46 @@ void * pvSocketGetSocketID( const ConstSocket_t xSocket )
63756376 {
63766377 case FREERTOS_SO_IP_MULTICAST_TTL :
63776378
6378- if ( ( pxSocket -> ucProtocol != ( uint8_t ) FREERTOS_IPPROTO_UDP ) || ( uxOptionLength != sizeof ( uint8_t ) ) )
6379+ {
6380+ uint8_t ucValue = * ( ( uint8_t * ) pvOptionValue );
6381+
6382+ if ( ( ( pxSocket -> bits .bIsIPv6 == pdTRUE_UNSIGNED ) || pxSocket -> ucProtocol != ( uint8_t ) FREERTOS_IPPROTO_UDP ) || ( uxOptionLength != sizeof ( ucValue ) ) )
63796383 {
63806384 break ; /* will return -pdFREERTOS_ERRNO_EINVAL */
63816385 }
63826386
63836387 /* Override the default TTL value with this one. */
6384- pxSocket -> u .xUDP .ucMulticastTTL = * ( ( uint8_t * ) pvOptionValue ) ;
6388+ pxSocket -> u .xUDP .xMulticastTTL = ( BaseType_t ) ucValue ;
63856389
63866390 xReturn = 0 ;
6391+ }
6392+ break ;
6393+
6394+ case FREERTOS_SO_IPV6_MULTICAST_HOPS :
6395+ {
6396+ BaseType_t xValue = * ( ( BaseType_t * ) pvOptionValue );
6397+
6398+ if ( ( pxSocket -> bits .bIsIPv6 == pdFALSE_UNSIGNED ) || ( pxSocket -> ucProtocol != ( uint8_t ) FREERTOS_IPPROTO_UDP ) || ( uxOptionLength != sizeof ( BaseType_t ) ) )
6399+ {
6400+ break ; /* will return -pdFREERTOS_ERRNO_EINVAL */
6401+ }
6402+
6403+ if ( ( xValue < -1 ) || ( xValue > 255 ) )
6404+ {
6405+ break ; /* will return -pdFREERTOS_ERRNO_EINVAL */
6406+ }else if ( xValue == -1 )
6407+ {
6408+ /* Set the default TTL value. */
6409+ pxSocket -> u .xUDP .xMulticastTTL = ipconfigUDP_TIME_TO_LIVE ;
6410+ }
6411+ else
6412+ {
6413+ /* Override the default TTL value with this one. */
6414+ pxSocket -> u .xUDP .xMulticastTTL = xValue ;
6415+ }
6416+
6417+ xReturn = 0 ;
6418+ }
63876419 break ;
63886420
63896421 case FREERTOS_SO_IP_ADD_MEMBERSHIP :
0 commit comments