/* Enqueue a shared copy of the packet to the IP6 child if the packet is acceptable to it. Here the data of the packet is shared, but the net buffer isn't. */
EFI_STATUS Ip6InstanceEnquePacket(IN IP6_PROTOCOL *IpInstance, IN EFI_IP6_HEADER *Head, IN NET_BUF *Packet)
/* Enqueue a shared copy of the packet to the IP6 child if the packet is acceptable to it. Here the data of the packet is shared, but the net buffer isn't. */
EFI_STATUS Ip6InstanceEnquePacket(IN IP6_PROTOCOL *IpInstance, IN EFI_IP6_HEADER *Head, IN NET_BUF *Packet)
{
  IP6_CLIP_INFO  *Info;
  NET_BUF        *Clone;
  if (IpInstance->State != IP6_STATE_CONFIGED) {
    return EFI_NOT_STARTED;
  }
  if (!Ip6InstanceFrameAcceptable (IpInstance, Head, Packet)) {
    return EFI_INVALID_PARAMETER;
  }
  Clone = NetbufClone (Packet);
  if (Clone == NULL) {
    return EFI_OUT_OF_RESOURCES;
  }
  Info       = IP6_GET_CLIP_INFO (Clone);
  Info->Life = IP6_US_TO_SEC (IpInstance->ConfigData.ReceiveTimeout);
  InsertTailList (&IpInstance->Received, &Clone->List);
  return EFI_SUCCESS;
}