Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/nuttx/net/netdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,7 @@ struct net_driver_s
/* Remember the outgoing fragments waiting to be sent */

#ifdef CONFIG_NET_IPFRAG
uint8_t d_ipfrag_reassembled; /* Current packet is reassembled by IPFRAG */
struct iob_queue_s d_fragout;
#endif

Expand Down
12 changes: 9 additions & 3 deletions net/ipforward/ipv6_forward.c
Original file line number Diff line number Diff line change
Expand Up @@ -390,11 +390,17 @@ static int ipv6_dev_forward(FAR struct net_driver_s *dev,
}
else if (ret == PACKET_NOT_FORWARDED)
{
/* Verify that the full packet will fit within the forwarding devices
* MTU. We provide no support for fragmenting forwarded packets.
/* Verify that the full packet will fit within the forwarding device's
* MTU. Normal IPv6 forwarding does not fragment oversized packets,
* but packets reassembled locally for NAT66/IPFILTER may be split
* again by the egress IPFRAG path.
*/

if (NET_LL_HDRLEN(fwddev) + dev->d_len > NETDEV_PKTSIZE(fwddev))
if (NET_LL_HDRLEN(fwddev) + dev->d_len > NETDEV_PKTSIZE(fwddev)
#ifdef CONFIG_NET_IPFRAG
&& !dev->d_ipfrag_reassembled
#endif
)
{
nwarn("WARNING: Packet > MTU... Dropping\n");
ret = -EFBIG;
Expand Down
9 changes: 8 additions & 1 deletion net/ipfrag/ipv6_frag.c
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,8 @@ int32_t ipv6_fragin(FAR struct net_driver_s *dev)
FAR struct ip_fragsnode_s *node = NULL;
FAR struct ip_fraglink_s *fraginfo = NULL;
bool restartwdog;
uint8_t reassembled;
int32_t ret;

if (dev->d_len != dev->d_iob->io_pktlen)
{
Expand Down Expand Up @@ -521,7 +523,12 @@ int32_t ipv6_fragin(FAR struct net_driver_s *dev)

kmm_free(node);

return ipv6_input(dev);
reassembled = dev->d_ipfrag_reassembled;
dev->d_ipfrag_reassembled = true;
ret = ipv6_input(dev);
dev->d_ipfrag_reassembled = reassembled;

return ret;
}

nxmutex_unlock(&g_ipfrag_lock);
Expand Down
4 changes: 4 additions & 0 deletions net/netdev/netdev_register.c
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,10 @@ int netdev_register(FAR struct net_driver_s *dev, enum net_lltype_e lltype)

dev->d_polltype = 0;

#ifdef CONFIG_NET_IPFRAG
dev->d_ipfrag_reassembled = false;
#endif

nxrmutex_init(&dev->d_lock);

/* We need exclusive access for the following operations */
Expand Down
Loading