Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Preparing library to use loopback device #1020

Merged
merged 32 commits into from
Oct 6, 2023

Conversation

htibosch
Copy link
Contributor

@htibosch htibosch commented Sep 6, 2023

This PR prepares the IP-stack to use loopback addresses 127.0.0.0 and ::1.

The issue was raised on the FreeRTOS forum here by ozanagma.

Description

● Routing.c :

It now recognises a new IP type for loopback: "eIPv6_Loopback"

Removed a minor bug in FreeRTOS_AddNetworkInterface(), and also FreeRTOS_AddEndPoint().

When adding the following interfaces:

    FreeRTOS_AddNetworkInterface( &iface_a );
    FreeRTOS_AddNetworkInterface( &iface_b );
    FreeRTOS_AddNetworkInterface( &iface_a );
    FreeRTOS_AddNetworkInterface( &iface_c );

In the above example, "iface_b" will become an orphan because of this piece of code:

    if( pxInterface != NULL )
    {
        pxInterface->pxNext = NULL;
        pxInterface->pxEndPoint = NULL;

● FreeRTOS_IPv6.h :

Added xBadIPv6Loopback()
Added xIsIPv6Loopback()

● FreeRTOS_IPv4.h :

Added xIsIPv4Loopback()
Added xBadIPv4Loopback()

Communication with a loopback device always takes place within a system, and from a loopback IP address to another loopback IP.

Here is how I implemented the XOR operation:

    BaseType_t xReturn = pdFALSE;
    if( pxEndPoint != NULL )
    {
        BaseType_t x1 = ( xIsIPv4Loopback( pxIPHeader->ulDestinationIPAddress ) != 0 ) ? pdTRUE : pdFALSE;
        BaseType_t x2 = ( xIsIPv4Loopback( pxIPHeader->ulSourceIPAddress ) != 0 ) ? pdTRUE : pdFALSE;

        if( x1 != x2 )
        {
            /* Either the source or the destination address is a loopback address. */
            xReturn = pdTRUE;
        }
    }

● FreeRTOS_ND.c :

The function FreeRTOS_CreateIPv6Address() will allow prefix address length of 128 bits, which is necessary to allow IPv6 loopback addresses.

● FreeRTOS_IP.c :

and the most important change:

-    else if( ( pxUDPPacket->xEthernetHeader.usFrameType == ipIPv4_FRAME_TYPE ) &&
-             ( ipFIRST_LOOPBACK_IPv4 <= ( FreeRTOS_ntohl( pxUDPPacket->xIPHeader.ulDestinationIPAddress ) ) ) &&
-             ( ( FreeRTOS_ntohl( pxUDPPacket->xIPHeader.ulDestinationIPAddress ) ) < ipLAST_LOOPBACK_IPv4 ) )
+    else if( ( pxUDPPacket->xEthernetHeader.usFrameType == ipIPv4_FRAME_TYPE ) &&
+             ( xBadIPv4Loopback( &( pxUDPPacket->xIPHeader ) ) != pdFALSE ) )
+    {
+        /* The local loopback addresses must never appear outside a host. See RFC 1122
+         * section 3.2.1.3. */
+        eReturn = eReleaseBuffer;
+    }

● FreeRTOS_IPv6.c :

a similar changes as in FreeRTOS_IP.c here above.

Test Steps

In my next PR I will present the loopback network interface.

Also I developed a module that starts 4 tasks to do TCPv4, TCPv6, UDPv4, and UDPv6. Each task will create to sockets that will exchange data through the loopback device.

Checklist:

  • I have tested my changes. No regression in existing tests.
  • I have modified and/or added unit-tests to cover the code changes in this Pull Request.

Related Issue

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

@htibosch
Copy link
Contributor Author

htibosch commented Sep 7, 2023

/bot run formatting

@htibosch
Copy link
Contributor Author

htibosch commented Sep 8, 2023

/bot run formatting

@htibosch
Copy link
Contributor Author

htibosch commented Sep 8, 2023

/bot run formatting

@htibosch htibosch mentioned this pull request Sep 10, 2023
2 tasks
@htibosch htibosch marked this pull request as ready for review September 10, 2023 08:45
@htibosch htibosch requested a review from a team as a code owner September 10, 2023 08:45
@@ -241,10 +241,6 @@ struct xIPv6_Couple
{
NetworkEndPoint_t * pxIterator = NULL;

/* This end point will go to the end of the list, so there is no pxNext
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah i think this needs to be removed in the case the endpoint is already present on the list.

/* This end point will go to the end of the list, so there is no pxNext
* yet. */
pxEndPoint->pxNext = NULL;

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But i think we should also add pxEndPoint->pxNext = NULL; in line 262 in case there is no endpoint in the list

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also can we move commit as a separate PR?

Copy link
Contributor Author

@htibosch htibosch Sep 12, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But i think we should also add pxEndPoint->pxNext = NULL; in line 262 in case there is no endpoint in the list

That is 10 points for you, Monika, thanks! Although we assume that endpoints have been cleared, we can not count on it.

moninom1
moninom1 previously approved these changes Sep 13, 2023
source/FreeRTOS_IP.c Show resolved Hide resolved
source/FreeRTOS_IP.c Outdated Show resolved Hide resolved
if( pxEndPoint != NULL )
{
BaseType_t x1 = ( xIsIPv4Loopback( pxIPHeader->ulDestinationIPAddress ) != 0 ) ? pdTRUE : pdFALSE;
BaseType_t x2 = ( xIsIPv4Loopback( pxIPHeader->ulSourceIPAddress ) != 0 ) ? pdTRUE : pdFALSE;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This logic is not very clear.Isn't it enough to check only for destination address.
In my understanding, We should only process packets for which the destination address is loopback. Source address can only be loopback if there is a bridging/routing supported in the device and as of now our stack does not support bridging/routing. And from an external device only the destination address can be loopback. Please suggest if I am missing anything here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@shubnil wrote:

+    if( pxEndPoint != NULL )
+    {
+        BaseType_t x1 = ( xIsIPv4Loopback( pxIPHeader->ulDestinationIPAddress ) != 0 ) ? pdTRUE : pdFALSE;
+        BaseType_t x2 = ( xIsIPv4Loopback( pxIPHeader->ulSourceIPAddress ) != 0 ) ? pdTRUE : pdFALSE;

This logic is not very clear. Isn't it enough to check only for destination address?

The check is done in xBadIPv4Loopback(), which is called from prvProcessUDPPacket(), which will be called for any incoming UDP packet.

It will return pdTRUE in case either the source or the destination address is a loopback address.

As described in RFC1122, Section 3.2.1.3, addresses within the entire 127.0.0.0/8 block do not legitimately appear on any network anywhere.

Before we had a loopback interface, loopback addresses had to be dropped:

    else if( ( pxUDPPacket->xEthernetHeader.usFrameType == ipIPv4_FRAME_TYPE ) &&
             ( ipFIRST_LOOPBACK_IPv4 <= ( FreeRTOS_ntohl( pxUDPPacket->xIPHeader.ulDestinationIPAddress ) ) ) &&
             ( ( FreeRTOS_ntohl( pxUDPPacket->xIPHeader.ulDestinationIPAddress ) ) < ipLAST_LOOPBACK_IPv4 ) )
    {
        eReturn = eReleaseBuffer;
    }

which would be the same as :

    else if( ( pxUDPPacket->xEthernetHeader.usFrameType == ipIPv4_FRAME_TYPE ) &&
               xIsIPv4Loopback( pxUDPPacket->xIPHeader.ulDestinationIPAddress ) )
    {
        /* Drop all packets travelling from or to a loopback address. */
        eReturn = eReleaseBuffer;
    }

I think that we should have tested for both ulDestinationIPAddress and ulSourceIPAddress because 127.x.x.x was not yet implemented.

Now we have added a loopback device, and so 127.x.x.x addresses must be allowed, with the exception of a packet leaving or entering the host. Loopback packets may only travel internally. So that is why:

    if( x1 != x2 )
    {
        /* Either the source or the destination address is an IPv4 loopback address. */
        xReturn = pdTRUE;
    }

when either the destination or the source address is a loopback address, the packet must be dropped.
All other packets may be processed.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like understand a little more on Packets will loopback as Source address. What will be the use case for this? Is this for the packets originated from the loopback interface? In that case the packet should not go out of the system. Please suggest if this understanding is correct.

@@ -62,7 +62,7 @@ const struct xIPv6_Address FreeRTOS_in6addr_any = { 0 };
/**
* This variable is initialized by the system to contain the loopback IPv6 address.
*/
const struct xIPv6_Address FreeRTOS_in6addr_loopback = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } };
const struct xIPv6_Address FreeRTOS_in6addr_loopback = { { 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U } };
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Line no 65 and 243 both have a constant IPv6 address, however one is just const and other is static const. We should ideally have same for both.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Line no 65 and 243 both have a constant IPv6 address, however one is just const and other is static const. We should ideally have same for both.

Good point. xIPv6UnspecifiedAddress[] is quite new and it is put halfway the file among the functions. The unspecified address is the same as the ANY address FreeRTOS_in6addr_any[], which already exists for a long time, and which is global. Let's use that in stead.

     const struct xIPv6_Address FreeRTOS_in6addr_any = { 0 };
     const struct xIPv6_Address FreeRTOS_in6addr_loopback = { { 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U } };
-    static const struct xIPv6_Address xIPv6UnspecifiedAddress = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };

BaseType_t x1 = ( xIsIPv6Loopback( &( pxIPv6Header->xDestinationAddress ) ) != 0 ) ? pdTRUE : pdFALSE;
BaseType_t x2 = ( xIsIPv6Loopback( &( pxIPv6Header->xSourceAddress ) ) != 0 ) ? pdTRUE : pdFALSE;

if( x1 != x2 )
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This logic is not very clear.Isn't it enough to check only for destination address.
In my understanding, We should only process packets for which the destination address is loopback. Source address can only be loopback if there is a bridging/routing supported in the device and as of now our stack does not support bridging/routing. And from an external device only the destination address can be loopback. Please suggest if I am missing anything here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I already answered to this question here above.

@@ -476,10 +494,9 @@ eFrameProcessingResult_t prvAllowIPPacketIPv6( const IPHeader_IPv6_t * const pxI
eReturn = eProcessBuffer;
}
/* Is it the legal multicast address? */
else if( ( xHasUnspecifiedAddress == pdFALSE ) &&
else if( ( ( xHasUnspecifiedAddress == pdFALSE ) &&
( xBadIPv6Loopback( pxIPv6Header ) == pdFALSE ) ) &&
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Codewise it makes more sense to have xBadIPv6Loopback and xBadIPv4Loopback checks at the same level. Here, xBadIPv4Loopback check is happening at FreeRTOS_IP.c but xBadIPv6Loopback check is in IPv6 specfic file. Can we re-arrange the code.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I answered this and rearranged the code like this:

prvAllowIPPacketIPv4() calls xBadIPv4Loopback()
prvAllowIPPacketIPv6() calls xBadIPv6Loopback()

source/FreeRTOS_IP.c Show resolved Hide resolved
@shubnil
Copy link
Member

shubnil commented Sep 13, 2023

Overall, I see 2 main concerns:

  1. The V4 and V6 loopback check arrangement is not uniform. V4 loopback check is in 'FreeRTOS_IP.c while V6 loopback check is inside FreeRTOS_IPv6.c. Both should be at same level, otherwise the code readability and protocol separation gets disturbed.
  2. Inside the loopback checks isn't it enough to have loopback check only for destination address. Do we really need to check for source addresses as well to be loopback. If yes, Please give an example of such a used case.

Copy link
Contributor Author

@htibosch htibosch left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your review, it makes sense. I will do one more integration test after applying the mentioned changed.

@@ -62,7 +62,7 @@ const struct xIPv6_Address FreeRTOS_in6addr_any = { 0 };
/**
* This variable is initialized by the system to contain the loopback IPv6 address.
*/
const struct xIPv6_Address FreeRTOS_in6addr_loopback = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } };
const struct xIPv6_Address FreeRTOS_in6addr_loopback = { { 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U } };
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Line no 65 and 243 both have a constant IPv6 address, however one is just const and other is static const. We should ideally have same for both.

Good point. xIPv6UnspecifiedAddress[] is quite new and it is put halfway the file among the functions. The unspecified address is the same as the ANY address FreeRTOS_in6addr_any[], which already exists for a long time, and which is global. Let's use that in stead.

     const struct xIPv6_Address FreeRTOS_in6addr_any = { 0 };
     const struct xIPv6_Address FreeRTOS_in6addr_loopback = { { 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U } };
-    static const struct xIPv6_Address xIPv6UnspecifiedAddress = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };

source/FreeRTOS_IP.c Show resolved Hide resolved
source/FreeRTOS_IP.c Outdated Show resolved Hide resolved
source/FreeRTOS_IP.c Show resolved Hide resolved
BaseType_t x1 = ( xIsIPv6Loopback( &( pxIPv6Header->xDestinationAddress ) ) != 0 ) ? pdTRUE : pdFALSE;
BaseType_t x2 = ( xIsIPv6Loopback( &( pxIPv6Header->xSourceAddress ) ) != 0 ) ? pdTRUE : pdFALSE;

if( x1 != x2 )
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I already answered to this question here above.

@@ -476,10 +494,9 @@ eFrameProcessingResult_t prvAllowIPPacketIPv6( const IPHeader_IPv6_t * const pxI
eReturn = eProcessBuffer;
}
/* Is it the legal multicast address? */
else if( ( xHasUnspecifiedAddress == pdFALSE ) &&
else if( ( ( xHasUnspecifiedAddress == pdFALSE ) &&
( xBadIPv6Loopback( pxIPv6Header ) == pdFALSE ) ) &&
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I answered this and rearranged the code like this:

prvAllowIPPacketIPv4() calls xBadIPv4Loopback()
prvAllowIPPacketIPv6() calls xBadIPv6Loopback()

@htibosch
Copy link
Contributor Author

/bot run formatting

@htibosch
Copy link
Contributor Author

/bot run formatting

shubnil
shubnil previously approved these changes Sep 27, 2023
Copy link
Member

@shubnil shubnil left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Hein. I am fine with the changes.

moninom1
moninom1 previously approved these changes Sep 27, 2023
Copy link
Member

@ActoryOu ActoryOu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left 2 minor comments.

…S_IPv6_ConfigDriverCheckChecksum_stubs.c

Co-authored-by: ActoryOu <[email protected]>
@htibosch htibosch dismissed stale reviews from moninom1 and shubnil via d695740 September 27, 2023 07:41
ActoryOu
ActoryOu previously approved these changes Sep 27, 2023
@@ -260,6 +312,13 @@ enum eFrameProcessingResult prvAllowIPPacketIPv4( const struct xIP_PACKET * cons
/* Can not handle, unknown or invalid header version. */
eReturn = eReleaseBuffer;
}
else if( ( pxIPPacket->xEthernetHeader.usFrameType == ipIPv4_FRAME_TYPE ) &&
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pxIPPacket->xEthernetHeader.usFrameType == ipIPv4_FRAME_TYPE

This checks seems to be redundant. prvAllowIPPacketIPv4 is only called when pxIPPacket->xEthernetHeader.usFrameType is ipIPv4_FRAME_TYPE from the prvProcessIPPacket().

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 for this, usFrameType can be removed. It is validated in prvProcessIPPacket and called from no where else.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes good idea, it was tested already. I also adapted the test in FreeRTOS_IPv4_utest.c.

moninom1
moninom1 previously approved these changes Sep 28, 2023
@htibosch
Copy link
Contributor Author

Hm, the last change affects more ut's than I expected. I will first solve that locally.

@htibosch
Copy link
Contributor Author

/bot run formatting

@moninom1 moninom1 merged commit 16a74c3 into FreeRTOS:main Oct 6, 2023
10 checks passed
HTRamsey pushed a commit to HTRamsey/FreeRTOS-Plus-TCP that referenced this pull request Dec 3, 2023
commit 9abe2d1
Author: Emil Popov <[email protected]>
Date:   Sun Nov 5 22:52:32 2023 -0500

    Changes the ND cache full behavior when the Neighbor Discovery cache fills up. (FreeRTOS#1040)

    * Changes the ND cache full behavior: If the Neighbor Discovery cache ever gets full, trying to store a new entry will overwrite the oldest existing entry.

    * Adds casting to avoid warnings

    ---------

    Co-authored-by: Emil Popov <[email protected]>
    Co-authored-by: Tony Josi <[email protected]>

commit c8d9b70
Author: Tony Josi <[email protected]>
Date:   Fri Nov 3 14:47:16 2023 +0530

    Update release script to add cleanup step (FreeRTOS#1038)

    * Add cleanup step in release script

    * update comment

    ---------

    Co-authored-by: Monika Singh <[email protected]>

commit 7c129b6
Author: Emil Popov <[email protected]>
Date:   Fri Nov 3 04:14:32 2023 -0400

    Fixes the allocation size when sending a neighbor solicitation packet to avoid having to always reallocate the buffer. (FreeRTOS#1039)

    Co-authored-by: Emil Popov <[email protected]>

commit be2555b
Author: Holden <[email protected]>
Date:   Wed Nov 1 03:03:52 2023 -0400

    Improve Default Macros (FreeRTOS#782)

    * Delete duplicate default defines

    * Remove errno definitions that exist in projdefs.h

    * Clean & Organize FreeRTOSIPConfigDefaults.h

    * Move deprecated definitions to their own file

    * Definitions Documentation Improvements

    * Tracing default definitions improvements

    * Organize and add to deprecated definitions

    * Remove FreeRTOS_errno_TCP.h

    * Fixes for definitions updates

    * Address review comments

    * Start enforcing macro value limits and make some doc more succinct

    * enforce ipconfig macro bounds

    * repair config default and reduce unnecessary changes

    * Add more descriptions of ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM (FreeRTOS#947)

    * Fixes mDNS over IPv6. (FreeRTOS#949)

    Co-authored-by: Emil Popov <[email protected]>
    Co-authored-by: ActoryOu <[email protected]>
    Co-authored-by: Monika Singh <[email protected]>

    * remove enabled checks

    * Remove enable checks from trace macros

    * Update cmake sources

    * add missing defines

    * revert unnecessary changes

    * formatting

    * fix lexicon

    * fix build issue and remove deprecated macro usage from tests

    * fix build issues and formatting

    * disable pdFREERTOS_ERRNO_EAFNOSUPPORT check

    * update kernel submodule for tests

    * macro definition fixes

    * fix some test build issues

    * Temporary passing state

    * Fix unittest

    * Fix CBMC

    * Update CBMC proof

    * Update Macro comments

    * revert changes

    * Fix MISRA 4.4

    * Fix MISRA 20.7 violation

    * Fix spell checker

    * Update Hein's comment

    ---------

    Co-authored-by: Holden <holden-zenithaerotech.com>
    Co-authored-by: ActoryOu <[email protected]>
    Co-authored-by: Emil Popov <[email protected]>
    Co-authored-by: Emil Popov <[email protected]>
    Co-authored-by: Monika Singh <[email protected]>
    Co-authored-by: ActoryOu <[email protected]>

commit 1474378
Author: Hein Tibosch <[email protected]>
Date:   Wed Oct 25 12:02:25 2023 +0800

    Give header files a uniform indentation (FreeRTOS#1034)

    * Give header files a uniform indentation

    * Uncrustify: triggered by comment.

    * A few more removals of /* ifndef ...*/

    * After applying formattingChanges.patch

    * Undo indent to avoid huge white space changes

    * Undo more indent to avoid huge white space changes

    * Undo two more indent to avoid huge white space changes

    * Undo 15 more indent to avoid huge white space changes

    * Undo 3 more indent to avoid huge white space changes

    * Undo 4 more indent to avoid huge white space changes

    * Undo 3 more indent to avoid huge white space changes

    * It seems that core_cm55.h was not yet formatted

    * More files in MPS3_AN552 were not yet formatted.

    * And the last one

    * Uncrustify: triggered by comment.

    * Just a push to restart CI-checks

    * Placed some extern "c" comments again

    * Formatting fixes

    ---------

    Co-authored-by: GitHub Action <[email protected]>
    Co-authored-by: Soren Ptak <[email protected]>
    Co-authored-by: ActoryOu <[email protected]>
    Co-authored-by: Monika Singh <[email protected]>

commit 8761f51
Author: Emil Popov <[email protected]>
Date:   Tue Oct 24 23:04:54 2023 -0400

    SAME70 driver xTXDescriptorSemaphore issue (FreeRTOS#1033)

    * Fixes and issue with the SAME70 port where and error in gmac_dev_write() causes the counting  xTXDescriptorSemaphore to not be returned and eventually exhausting it.

    * fix formatting

    * Allows release of the network buffer if gmac_dev_write() fails and the ero-copy driver is being used.
    Thanks @htibosch

    * Fix typo

    ---------

    Co-authored-by: Emil Popov <[email protected]>
    Co-authored-by: tony-josi-aws <[email protected]>
    Co-authored-by: ActoryOu <[email protected]>

commit 2131f01
Author: Hein Tibosch <[email protected]>
Date:   Wed Oct 25 10:22:22 2023 +0800

    STM32H7xx driver check result of HAL_ETH_Init v3 (FreeRTOS#1035)

    * STM32H7xx driver check result of HAL_ETH_Init v3

    * One more change to networkInterface.c

    * Updating FreeRTOS kernel submodule

    * Once again commit kernel

    ---------

    Co-authored-by: ActoryOu <[email protected]>

commit eac0d0c
Author: ActoryOu <[email protected]>
Date:   Wed Oct 25 10:03:27 2023 +0800

    Fix build combination test caused by kernel change (FreeRTOS#1036)

    * Fix build combination test caused by kernel change

commit 56b3374
Author: Tony Josi <[email protected]>
Date:   Thu Oct 12 14:15:43 2023 +0530

    Update STM32Hxx port to use HW MAC hashtable filter (FreeRTOS#970)

    * fix

    * MAC filter updated for DAD and IPv6 all nodes multicast

    * add more comments

    * fix formatting

    * fix comments

    * fix review comments

    * fix formatting

    * update review comments

    * enable multicast packets in MAC

    * use multi cast MAC filter

    * fix formatting

    * update naming and comments

    * update comments and formatting

    * rename function

    * fix formatting

    * fix spell check

    * Uncrustify: triggered by comment

    ---------

    Co-authored-by: GitHub Action <[email protected]>

commit c0f5ba0
Author: Błażej Sowa <[email protected]>
Date:   Tue Oct 10 12:52:22 2023 +0200

    Fix network down up process (FreeRTOS#1030)

    * Disable DHCP timer when network goes down

    * Don't stop checking the Network Timer

    * Fix network down when using RA

    * Revert "Don't stop checking the Network Timer"

    This reverts commit f5d8d98.

    * Add vSetNotAllNetworksUp function

    * Fix unit tests

    * Update comments

    * Store DHCPv4 socket locally for all endpoints

    * Add vDHCPStop and vDHCPv6Stop functions

    * Fix IP Utils tests

    * Fix most of DHCP unit tests

    * Fix formatting

    * Change vSetNotAllNetworksUp into a more generic vSetAllNetworksUp

    * Fix almost all of DHCP unit tests

    * Fix formatting

    * Add tests for vDHCPStop and vDHCPv6Stop functions

    * Fix formatting

    * Remove redundant MISRA comment

    * Set all fields of xAddress when binding DHCP socket

    * Fix unit test coverage of prvCreateDHCPSocket

    * Fix DHCP CBMC memory proof

    ---------

    Co-authored-by: Soren Ptak <[email protected]>
    Co-authored-by: Tony Josi <[email protected]>

commit 3d5ee0e
Author: Devaraj Ranganna <[email protected]>
Date:   Mon Oct 9 05:46:25 2023 +0100

    Add Ethernet driver for Corstone-300 FVP (MPS3_AN552) (FreeRTOS#1009)

    * networkinterface: Add Ethernet driver for Corstone-300 FVP (MPS3_AN552)

    The Corstone-300 FVP models SMSC 91C111 Ethernet controller. Add a
    network interface based on CMSIS ethernet driver for SMSC 91C111.

    Signed-off-by: Devaraj Ranganna <[email protected]>

    * ci: Update spell-check dictionary

    Signed-off-by: Devaraj Ranganna <[email protected]>

    * networkinterface: Fix formatting issues

    Signed-off-by: Devaraj Ranganna <[email protected]>

    ---------

    Signed-off-by: Devaraj Ranganna <[email protected]>

commit 160fa29
Author: Hein Tibosch <[email protected]>
Date:   Fri Oct 6 19:06:10 2023 +0800

    Check minimum size of ICMPv6 packets (FreeRTOS#994)

    * Not all ICMPv6 packets have the same minimum length

    * More precise length checking

    * Repaired unit tests / coverage

    * Running uncrustify

    ---------

    Co-authored-by: Tony Josi <[email protected]>
    Co-authored-by: ActoryOu <[email protected]>
    Co-authored-by: kar-rahul-aws <[email protected]>
    Co-authored-by: Monika Singh <[email protected]>

commit 16a74c3
Author: Hein Tibosch <[email protected]>
Date:   Fri Oct 6 18:57:45 2023 +0800

    Preparing library to use loopback device (FreeRTOS#1020)

    * Preparing library to use loopback device

    * Repaired FreeRTOS_AddEndPoint() as well

    * Minor changes for Doxygen

    * Uncrustify: triggered by comment.

    * Added IPv6.h and removed call to xIsIPv6Loopback

    * Conditional compilation of xIPv6_GetIPType()

    * Do not call xBadIPv4Loopback() when IPv4 is not enabled

    * Repaired unit tests

    * In FreeRTOS_AddEndPoint(), set next to NULL

    * One more change in FreeRTOS_AddNetworkInterface()

    * FreeRTOS_FillEndPoint: save pxNext before clearing entire endpoint struct

    * Uncrustify: triggered by comment.

    * Changes after review by Shub

    * Changes after review by Shub, part 2

    * Uncrustify: triggered by comment.

    * Replace pxUDPPacket with pxIPacket in function prvAllowIPPacketIPv4()

    * utest: replace xIPv6UnspecifiedAddress with FreeRTOS_in6addr_any

    * Checked unit-tests and coverage

    * ut: Repaired GetIPType loopback test

    * Update test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_stubs.c

    Co-authored-by: ActoryOu <[email protected]>

    * Update test/unit-test/FreeRTOS_IPv6/ut.cmake

    Co-authored-by: ActoryOu <[email protected]>

    * Remove test for 'ipIPv4_FRAME_TYPE'

    * Repairing tu again

    ---------

    Co-authored-by: GitHub Action <[email protected]>
    Co-authored-by: Monika Singh <[email protected]>
    Co-authored-by: Tony Josi <[email protected]>
    Co-authored-by: ActoryOu <[email protected]>

commit 3cc5d1c
Author: Tony Josi <[email protected]>
Date:   Fri Oct 6 15:40:42 2023 +0530

    Update sockets header to include ntop/pton IPv4/v6 API declarations (FreeRTOS#1031)

    * update sockets header to include ntop / pton IPv4/v6 API declarations

    * Uncrustify: triggered by comment

    ---------

    Co-authored-by: GitHub Action <[email protected]>

commit 243de78
Author: Soren Ptak <[email protected]>
Date:   Thu Oct 5 09:39:43 2023 -0700

    Apply formatting bot fix (FreeRTOS#1029)

    Co-authored-by: Tony Josi <[email protected]>

commit 382ddb0
Author: Hein Tibosch <[email protected]>
Date:   Thu Oct 5 13:56:32 2023 +0800

    Make use of FreeRTOS_inet_addr_quick() when applicable (FreeRTOS#1032)

commit d3ce35f
Author: Hein Tibosch <[email protected]>
Date:   Wed Oct 4 14:49:57 2023 +0800

    New helper function: FreeRTOS_get_tx_base (FreeRTOS#544)

    * IPv4/single: new function: FreeRTOS_get_tx_base

    * Changed some code comments and repaired a typo.

    * Attempt to repair utest

    * Changes after CI checks

    * utest: Added tests for get_tx_base

    * Do not use const socket type in FreeRTOS_get_tx_base()

    * Removed comments from cmake  file ut

    * Repaired UT

    * Removed a nested if/endif couple

    ---------

    Co-authored-by: Hein Tibosch <[email protected]>

commit ce11071
Author: Archit Gupta <[email protected]>
Date:   Mon Sep 25 22:45:16 2023 -0700

    Fix uninitialized variable in TM4C NetworkInterface.c (FreeRTOS#1028)

    * Fix uninitialized variable in TM4C NetworkInterface.c

    * Uncrustify: triggered by comment.

    * Update macro

    ---------

    Co-authored-by: GitHub Action <[email protected]>
    Co-authored-by: Monika Singh <[email protected]>

commit c9e63fc
Author: Emil Popov <[email protected]>
Date:   Wed Sep 20 06:11:02 2023 -0400

    Fixes the TCP zero-copy functionality... (FreeRTOS#1018)

    * Fixes the TCP zero-copy functionality... looks like this somehow just got overlooked.

    * Update unit tests

    ---------

    Co-authored-by: Emil Popov <[email protected]>
    Co-authored-by: tony-josi-aws <[email protected]>

commit 222a36d
Author: Hein Tibosch <[email protected]>
Date:   Tue Sep 19 15:02:59 2023 +0800

    The new loopback network interface (FreeRTOS#1022)

    Co-authored-by: Tony Josi <[email protected]>

commit ce7b689
Author: Jonathan Reichelt Gjertsen <[email protected]>
Date:   Mon Sep 18 21:46:47 2023 +0200

    Use GCC-compatible alignment specifier in TM4C NetworkInterface.c (FreeRTOS#1027)

    * Use GCC-compatible alignment specifier in TM4C NetworkInterface.c

    Replace the CCS-only pragma with GCC attribute. Fixing this along with FreeRTOS#1206 will make this file build without warnings on the ARM GNU toolchain.

    The CCS compiler does support this attribute, see section 5.17.2 in: https://www.ti.com/lit/ug/spnu151w/spnu151w.pdf?ts=1695011722091

    * Uncrustify: triggered by comment.

    ---------

    Co-authored-by: GitHub Action <[email protected]>

commit 5e55153
Author: Tony Josi <[email protected]>
Date:   Wed Sep 13 15:07:17 2023 +0530

    Update FreeRTOS_get_tx_head to create TX stream if not created already (FreeRTOS#1023)

    * TCP zero copy update FreeRTOS_get_tx_head()

    * fix unit tests

    * Uncrustify: triggered by comment

    * updating with review feedback

    ---------

    Co-authored-by: GitHub Action <[email protected]>

commit b3289a7
Merge: a91c311 0ebf0c2
Author: rawalexe <[email protected]>
Date:   Fri Sep 8 18:12:49 2023 -0700

    Remove obsolete config structs

    This PR removes the xNetworkAddressing and xDefaultAddressing structs as they appear to be obsolete.

commit 0ebf0c2
Merge: 9f33e6e a91c311
Author: Tony Josi <[email protected]>
Date:   Thu Sep 7 11:08:01 2023 +0530

    Merge branch 'main' into NetParamsCleanup_PR

commit a91c311
Author: Peter R Herrmann <[email protected]>
Date:   Wed Sep 6 21:08:37 2023 -0700

    DriverSAM/NetworkInterface.c warning cleanup - purely refactoring (FreeRTOS#1016)

    * warning cleanup - purely refactoring

    * Incorporated PR feedback
    - Made vCheckBuffersAndQueue() static
    - Added uxLowestSemCount back into prvEMACHandlerTask, now modifying global instead of shadowing

    * Uncrustify: triggered by comment.

    * Fix formatting

    * Uncrustify: triggered by comment.

    * Un-doing uncrustify commit that breaks formatting rules

    * formatting fix

    * formatting fix

    ---------

    Co-authored-by: Soren Ptak <[email protected]>
    Co-authored-by: GitHub Action <[email protected]>
    Co-authored-by: Rahul Kar <[email protected]>

commit 9f33e6e
Author: Emil Popov <[email protected]>
Date:   Wed Sep 6 13:59:07 2023 -0400

    removes the xNetworkAddressing and  xDefaultAddressing structs as they appear to be obsolete.

commit f590724
Author: Tony Josi <[email protected]>
Date:   Wed Sep 6 16:52:00 2023 +0530

    Add integer overflow checks to buffer allocation APIs (FreeRTOS#1017)

    * Add checks to verify integer overflows doesnt occur during buffer allocations

    * Uncrustify: triggered by comment

    * updating review feedback

    ---------

    Co-authored-by: Soren Ptak <[email protected]>
    Co-authored-by: GitHub Action <[email protected]>

commit eed294c
Author: Soren Ptak <[email protected]>
Date:   Tue Sep 5 17:31:24 2023 -0400

    CI-CD Updates (FreeRTOS#1014)

    * Use new version of CI-CD Actions,  checkout@v3 instead of checkout@v2 on all jobs
    * Use cSpell spell check, and use ubuntu-20.04 for formatting check
    * Add in bot formatting action

commit a3413d2
Author: kar-rahul-aws <[email protected]>
Date:   Sat Sep 2 02:57:20 2023 +0530

    Fix FreeRTOS+TCP unit tests for latest Kernel V10.6.1 (FreeRTOS#1015)

    * Fix unit tests for latest FreeRTOS-Kernel V10.6.1
    * Update the FreeRTOS-Kernel submodule to V10.6.1
    * Update the Coverage-Cop action to use new parameter name

    ---------

    Co-authored-by: Monika Singh <[email protected]>
    Co-authored-by: Soren Ptak <[email protected]>

commit 34148c3
Author: Błażej Sowa <[email protected]>
Date:   Wed Aug 23 18:10:42 2023 +0200

    Add LIBSLIRP to Network Interface selection in CMakeLists

commit 0c59e71
Author: microcris <[email protected]>
Date:   Tue Aug 22 10:54:01 2023 +0100

    Fix assertion failure when disconnecting the Ethernet cable (NXP1060 -  NetworkInterface.c) (FreeRTOS#1002)

    * Update NetworkInterface.c

    The changes that I'm proposing are to make the driver to work in case of cable disconnection.

    In prvEMACHandlerTask, when xSendEventStructToIPTask, we have to pass network interface or it will fail the assertion in xSendEventStructToIPTask "configASSERT( pxInterface != NULL )".

    In pxNXP1064_NetworkInterfaceInitialise, if xWaitPHY fails (for instance, the cable is not connected), the switch case will break without doing nothing and the prvEMACHandlerTask will be blocked waiting for the notification. We have to unblock it to try again in case of failure in xEMAC_WaitPHY.

    * Update NetworkInterface.c

    uncrustify code

    * Update NetworkInterface.c

    Correct indentation

    * Update NetworkInterface.c

    Correct indentation

    * Update NetworkInterface.c

    fix indentation... again

    * Update source/portable/NetworkInterface/NXP1060/NetworkInterface.c

    Co-authored-by: ActoryOu <[email protected]>

    * Update source/portable/NetworkInterface/NXP1060/NetworkInterface.c

    Co-authored-by: ActoryOu <[email protected]>

    ---------

    Co-authored-by: ActoryOu <[email protected]>

commit 20d30d9
Author: Hein Tibosch <[email protected]>
Date:   Tue Aug 22 09:46:31 2023 +0800

    DriverSAM: let gmac_dev_read() return the proper length (version 2) (FreeRTOS#1000)

    * Atmel SAM driver: let gmac_dev_read() return the proper length (version 2)

    * Running uncrustify

    * A minor format change

    * Added a comment about a min() test

commit 169ae78
Author: Monika Singh <[email protected]>
Date:   Fri Aug 11 15:11:45 2023 +0530

    Update minor fixes in Readme (FreeRTOS#1005)

    * Update Readme

    * Update line

    * Remove dead link

    * Update README.md

    * Update README.md

commit 44765e4
Author: Tony Josi <[email protected]>
Date:   Thu Aug 10 18:06:21 2023 +0530

    Fix coverity issues in ARP (FreeRTOS#1003)

    Co-authored-by: ActoryOu <[email protected]>

commit f5ecc5f
Author: ActoryOu <[email protected]>
Date:   Thu Aug 10 20:09:17 2023 +0800

    Fix MISRA violations Rule 1.1 for forward declaration (FreeRTOS#1004)

    * Fix MISRA things for forward declaration

    * Formatting

    * Fix return structure of prvAllowIPPacketIPv4 and comments.

commit 4c6c8ab
Author: shubnil <[email protected]>
Date:   Wed Aug 9 23:03:12 2023 +0530

    Update the History.txt section for V4.0.0 Release (FreeRTOS#997)

    * Update History.txt

    Update the history section for V4.0.0 release.
    This captures the various changes  and documentation updates and felicitations to the various contributors.

    * Update History.txt

    * Update History.txt

    * Update History.txt

    * Pentest Update in History.txt

    Pentest Update in History.txt

    * Update History.txt

    * Update History.txt

    * Update History.txt for CBMC link

    * Update History.txt

    * Update History.txt

    * Update History.txt

    * Update History.txt

    ---------

    Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
    Co-authored-by: Monika Singh <[email protected]>

commit 7805363
Author: Monika Singh <[email protected]>
Date:   Wed Aug 9 22:26:06 2023 +0530

    Update readme (FreeRTOS#996)

    Co-authored-by: shubnil <[email protected]>

commit 7681bb1
Author: Monika Singh <[email protected]>
Date:   Wed Aug 9 21:41:58 2023 +0530

    Update Getting Started Guide Doc (FreeRTOS#995)

    * Update getting started

    * Rename getting started

    * Remove rc reference

    ---------

    Co-authored-by: shubnil <[email protected]>

commit f1aa0a0
Author: Monika Singh <[email protected]>
Date:   Wed Aug 9 21:12:01 2023 +0530

    Update Version number in doxygen and manifest for GA (FreeRTOS#993)

    * Update release version

    * Update kernel version

    ---------

    Co-authored-by: Tony Josi <[email protected]>

commit 5757e07
Author: Gaurav-Aggarwal-AWS <[email protected]>
Date:   Wed Aug 9 20:31:01 2023 +0530

    Fix use of uninitialized variable warning (FreeRTOS#998)

    Signed-off-by: Gaurav Aggarwal <[email protected]>

commit bb65463
Author: Monika Singh <[email protected]>
Date:   Wed Aug 9 11:38:30 2023 +0530

    Add README for ports (FreeRTOS#992)

    * Add readme for ports which are not ested

    * Update name

    * Add readme for pic32mzef

commit 8b90477
Author: Tony Josi <[email protected]>
Date:   Tue Aug 8 17:08:26 2023 +0530

    IAR warning fixes  (FreeRTOS#991)

    * remove forward declarations

    * Revert "remove forward declarations"

    This reverts commit a20213d.

    * supress IAR warnings

commit 40c16fe
Author: ActoryOu <[email protected]>
Date:   Tue Aug 8 09:23:39 2023 +0800

    Update function names in libslirp interface. (FreeRTOS#990)

commit 67b9e1c
Author: Monika Singh <[email protected]>
Date:   Mon Aug 7 14:32:28 2023 +0530

    Update File names (FreeRTOS#989)

    * Update File names

commit 941cad7
Author: Tony Josi <[email protected]>
Date:   Fri Aug 4 16:43:35 2023 +0530

    Gratuituous ARP fixes  (FreeRTOS#988)

    * adding more checks for GARP

    * adding more checks for GARP

    * adding more checks for GARP

    * more debug logs

    * more debug logs

    * more testing

    * verify subnet

    * fix formatting, cleaning up

    * fix formatting, cleaning up

    * adding unit tests

    * updating review comments

commit ae3cd02
Author: ActoryOu <[email protected]>
Date:   Fri Aug 4 17:14:53 2023 +0800

    Create IPv6 socket for DHCPv6 flow (FreeRTOS#987)

commit 62f5d3a
Author: Tony Josi <[email protected]>
Date:   Fri Aug 4 11:24:49 2023 +0530

    DNS callback to use new xDNSDoCallback API (FreeRTOS#985)

    * fix issue with DNS callback

    * update test cli code

    * fix formatting

    * fix build warnings

    * fix formatting

    * clang build fix

commit df5aed9
Author: ActoryOu <[email protected]>
Date:   Mon Jul 31 12:10:29 2023 +0800

    Check user related headers can be included independently. (FreeRTOS#982)

    * Header fix part 1

    * IP_Private

    * TEST_HEADER_INC_ONLY_IPv4

    * NetworkBufferManagement and NetworkInterface

    * Add CI flow to check user related headers can be included independently

    * Revert some redundant change

    * Add CI flow and fix formatting

    * Use -include compile option to test header self contain.

    ---------

    Co-authored-by: Monika Singh <[email protected]>

commit 9b903bd
Author: Tony Josi <[email protected]>
Date:   Fri Jul 28 11:21:14 2023 +0530

    Update Renesas RX network interface port (FreeRTOS#983)

    * wip basic compilation fix

    * add BSP_MCU_RX72N to checks

    * wip

    * build fix

    * testing with buffer allocation 1 of +TCP

    * clean up code

    * use macro instead of magic numbers

    * fix formatting

    * update review comments

commit 1c7623d
Author: Emil Popov <[email protected]>
Date:   Fri Jul 28 01:25:34 2023 -0400

    Improves the calculation of the offset at which we store the IP version value (FreeRTOS#979)

    * Defines ipUDP_PAYLOAD_IP_TYPE_OFFSET as an offset dependent on the IPv6 and UDP headers.
    Calculates ipIP_TYPE_OFFSET automatically based on the sizes it depends on instead of using a hardcoded number.
    Removes the definitions of ipIP_TYPE_OFFSET and ipUDP_PAYLOAD_IP_TYPE_OFFSET from FreeRTOS_IPv6_Private.h because they are already defined in FreeRTOS_IPv4_Private.h
    Makes ipIP_TYPE_OFFSET define signed so asserts can properly check for negative values.
    Adds an assert to ensure that storing of the IP-Type for IPv4 frames does not result in overwriting the ethernet header which would be the case if ipIP_TYPE_OFFSET somehow became negative or zero.
    Adds a comment to the code storing of the IP-Type byte for IPv6 frames emphasizing that it is not required and only used for debugging.

    * Uncrustify: triggered by comment.

    * Correct the comment of ipUDP_PAYLOAD_IP_TYPE_OFFSET.

    ---------

    Co-authored-by: Emil Popov <[email protected]>
    Co-authored-by: GitHub Action <[email protected]>
    Co-authored-by: ActoryOu <[email protected]>
    Co-authored-by: Tony Josi <[email protected]>

commit 574b646
Author: Monika Singh <[email protected]>
Date:   Fri Jul 28 10:25:24 2023 +0530

    Fix Clang warnings (FreeRTOS#984)

    * CMAKe update

    * Fix Wdocumentation errors

    * Fix Wconditional-uninitialized

    * Fix [-Wformat-pedantic

    * Fix Wcompound-token-split-by-space and Wgnu-statement-expression

    * Add suppression

    * Uncrustify: triggered by comment.

    * Fix coverity

    ---------

    Co-authored-by: GitHub Action <[email protected]>

commit b23fa86
Author: Monika Singh <[email protected]>
Date:   Thu Jul 27 15:56:36 2023 +0530

    Add and fix -Wconversion errors (FreeRTOS#980)

    * Fix Wconverstion

    * Enable Wconversion warning

    * Add fix

    * Fix MISRA

    * Fix coverity

    * Add comments

commit 14b3e24
Author: Monika Singh <[email protected]>
Date:   Wed Jul 26 13:59:06 2023 +0530

    Fix use of extern C block (FreeRTOS#981)

    * Fix use of extern C block

    * Uncrustify: triggered by comment.

    ---------

    Co-authored-by: GitHub Action <[email protected]>

commit 5e1c991
Author: ActoryOu <[email protected]>
Date:   Tue Jul 25 18:39:58 2023 +0800

    Remove duplicate configurations (FreeRTOS#978)

    * Remove duplicate configurations

    * Move LLMNR/NBNS back before USE_DNS

commit b863f68
Author: Tony Josi <[email protected]>
Date:   Mon Jul 24 15:10:25 2023 +0530

    [PR#482] - Update ARP cache from gratuitous ARP packets v2 (FreeRTOS#974)

    * Let the TCP timer becomes expired in stead of active

    * Renamed parameter of function vIPSetTCPTimerExpiredState

    * Adapt unit tests to use the new name and field

    * Change bActive to bExpired

    * Empty commit

    * Fix spell check

    * When a gratuitous ARP is received, use it to update the ARP cache entry

    * wip

    * adding comments on matching endpoint for Gratuitous ARP

    * adding unit tests for Gratuitous ARP processing, fix formatting

    * fix build

    * fix formatting

    * fix formatting

    * fic CBMC

    * adding review changes

    ---------

    Co-authored-by: Hein Tibosch <[email protected]>
    Co-authored-by: Hein Tibosch <[email protected]>
    Co-authored-by: Aniruddha Kanhere <[email protected]>

commit 6a0ce66
Author: Monika Singh <[email protected]>
Date:   Mon Jul 24 00:02:54 2023 +0530

    Fixes mDNS over IPv6  (FreeRTOS#977)

    * Add more descriptions of ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM (FreeRTOS#947)

    * Fixes mDNS over IPv6. (FreeRTOS#949)

    Co-authored-by: Emil Popov <[email protected]>
    Co-authored-by: ActoryOu <[email protected]>
    Co-authored-by: Monika Singh <[email protected]>

    ---------

    Co-authored-by: ActoryOu <[email protected]>
    Co-authored-by: Emil Popov <[email protected]>
    Co-authored-by: Emil Popov <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants