fix(SF-60): Еще багфиксы
This commit is contained in:
parent
87ccf2c5cc
commit
59faba1f3a
@ -247,10 +247,10 @@ bool free_rtos::EthTxFlow::send(TxFlowHandlerArgs& handlerArgs, uint32_t numScat
|
|||||||
for(size_t scatter_segment = 0; scatter_segment < numScatterSegments; scatter_segment++)
|
for(size_t scatter_segment = 0; scatter_segment < numScatterSegments; scatter_segment++)
|
||||||
{
|
{
|
||||||
handlerArgs.buffer = txPktInfo->sgList.list[scatter_segment].bufPtr;
|
handlerArgs.buffer = txPktInfo->sgList.list[scatter_segment].bufPtr;
|
||||||
txPktInfo->sgList.list[scatter_segment].segmentFilledLen = handlerArgs.stack_handler->Sender(handlerArgs, 0);
|
txPktInfo->sgList.list[scatter_segment].segmentFilledLen = handlerArgs.stack_handler->Sender(handlerArgs, scatter_segment);
|
||||||
}
|
}
|
||||||
|
|
||||||
txPktInfo->sgList.numScatterSegments = 1;
|
txPktInfo->sgList.numScatterSegments = numScatterSegments;
|
||||||
txPktInfo->chkSumInfo = 0U;
|
txPktInfo->chkSumInfo = 0U;
|
||||||
txPktInfo->appPriv = nullptr;
|
txPktInfo->appPriv = nullptr;
|
||||||
txPktInfo->tsInfo.txPktSeqId = 0;
|
txPktInfo->tsInfo.txPktSeqId = 0;
|
||||||
|
|||||||
@ -129,16 +129,11 @@ bool free_rtos::EthIp::send(IpHandlerArgs& handlerArgs)
|
|||||||
inline uint16_t free_rtos::EthIp::fillEthFrameHeader(IpHandlerArgs& ipHandlerArgs)
|
inline uint16_t free_rtos::EthIp::fillEthFrameHeader(IpHandlerArgs& ipHandlerArgs)
|
||||||
{
|
{
|
||||||
TEthFrameHeader * p_eth_hdr = (TEthFrameHeader *)ipHandlerArgs.buffer;
|
TEthFrameHeader * p_eth_hdr = (TEthFrameHeader *)ipHandlerArgs.buffer;
|
||||||
uint64_t mac_dst;
|
|
||||||
|
|
||||||
if (!arp_.getMacAddr(ipHandlerArgs.dest_ip, mac_dst)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
p_eth_hdr->prot_id = ETH_PROT_IP_BE;
|
p_eth_hdr->prot_id = ETH_PROT_IP_BE;
|
||||||
|
|
||||||
memcpy(p_eth_hdr->mac_src, &self_mac_, ETH_FRAME_MAC_ADDR_LEN_BYTES);
|
memcpy(p_eth_hdr->mac_src, &self_mac_, ETH_FRAME_MAC_ADDR_LEN_BYTES);
|
||||||
memcpy(p_eth_hdr->mac_dest, &mac_dst, ETH_FRAME_MAC_ADDR_LEN_BYTES);
|
memcpy(p_eth_hdr->mac_dest, &ipHandlerArgs.dest_mac, ETH_FRAME_MAC_ADDR_LEN_BYTES);
|
||||||
|
|
||||||
return sizeof(TEthFrameHeader);
|
return sizeof(TEthFrameHeader);
|
||||||
}
|
}
|
||||||
@ -147,10 +142,7 @@ uint16_t free_rtos::EthIp::Sender(HandlerArgs& handlerArgs, size_t scatter_segme
|
|||||||
{
|
{
|
||||||
IpHandlerArgs& ipHandlerArgs = static_cast<IpHandlerArgs&>(handlerArgs); // downcasting back to derived type
|
IpHandlerArgs& ipHandlerArgs = static_cast<IpHandlerArgs&>(handlerArgs); // downcasting back to derived type
|
||||||
|
|
||||||
if(fillEthFrameHeader(ipHandlerArgs) == 0) {
|
fillEthFrameHeader(ipHandlerArgs);
|
||||||
//EnetAppUtils_print("Cannot find destination mac\r\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
TIpHeader * ip_header = (TIpHeader *)(ipHandlerArgs.buffer + sizeof(TEthFrameHeader));
|
TIpHeader * ip_header = (TIpHeader *)(ipHandlerArgs.buffer + sizeof(TEthFrameHeader));
|
||||||
*ip_header = ipHandlerArgs.ip_header;
|
*ip_header = ipHandlerArgs.ip_header;
|
||||||
|
|
||||||
|
|||||||
@ -18,6 +18,7 @@ struct IpHandlerArgs : public EthStackHandlerArgs {
|
|||||||
uint16_t ip_header_len;
|
uint16_t ip_header_len;
|
||||||
uint16_t ip_data_len;
|
uint16_t ip_data_len;
|
||||||
uint32_t dest_ip;
|
uint32_t dest_ip;
|
||||||
|
uint64_t dest_mac;
|
||||||
uint8_t ip_prot_id;
|
uint8_t ip_prot_id;
|
||||||
Handler* ip_handler;
|
Handler* ip_handler;
|
||||||
TIpHeader ip_header;
|
TIpHeader ip_header;
|
||||||
|
|||||||
@ -16,7 +16,7 @@ free_rtos::EthStack::EthStack(EthTxFlowIface& tx_flow) :
|
|||||||
tx_flow_{tx_flow},
|
tx_flow_{tx_flow},
|
||||||
arp_{*this},
|
arp_{*this},
|
||||||
ip_{*this, arp_},
|
ip_{*this, arp_},
|
||||||
udp_{ip_}
|
udp_{ip_, arp_}
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,13 +14,14 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
|
||||||
free_rtos::EthUpdClient::EthUpdClient(EthIpIface& ip_iface, TEthMacPorts port_id,
|
free_rtos::EthUpdClient::EthUpdClient(EthIpIface& ip_iface, EthArpIface& arp,
|
||||||
uint16_t port_dst_be, uint16_t port_src_be,
|
TEthMacPorts port_id, uint16_t port_dst_be, uint16_t port_src_be,
|
||||||
bool use_chksum) :
|
bool use_chksum) :
|
||||||
port_dst_be_{port_dst_be},
|
port_dst_be_{port_dst_be},
|
||||||
port_src_be_{port_src_be},
|
port_src_be_{port_src_be},
|
||||||
use_checksum_{use_chksum},
|
use_checksum_{use_chksum},
|
||||||
ip_iface_{ip_iface},
|
ip_iface_{ip_iface},
|
||||||
|
arp_{arp},
|
||||||
port_id_{port_id}
|
port_id_{port_id}
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
@ -211,9 +212,15 @@ uint16_t free_rtos::EthUpdClient::fill_udp_header(UDPHandlerArgs& udpHandlerArgs
|
|||||||
bool free_rtos::EthUpdClient::write(uint32_t ip_dst_be, uint8_t * p_data, uint32_t len)
|
bool free_rtos::EthUpdClient::write(uint32_t ip_dst_be, uint8_t * p_data, uint32_t len)
|
||||||
{
|
{
|
||||||
UDPHandlerArgs udpHandlerArgs;
|
UDPHandlerArgs udpHandlerArgs;
|
||||||
|
uint64_t mac_dst{0x0000000000000000};
|
||||||
|
|
||||||
if (ip_dst_be == 0) {
|
if (ip_dst_be == 0) {
|
||||||
ip_dst_be = src_ip_;
|
ip_dst_be = src_ip_;
|
||||||
|
mac_dst = src_mac_;
|
||||||
|
} else {
|
||||||
|
if (arp_.getMacAddr(ip_dst_be, mac_dst) == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//udpHandlerArgs.buffer = nullptr;
|
//udpHandlerArgs.buffer = nullptr;
|
||||||
@ -222,6 +229,7 @@ bool free_rtos::EthUpdClient::write(uint32_t ip_dst_be, uint8_t * p_data, uint32
|
|||||||
udpHandlerArgs.ip_header_len = sizeof(TUdpHeader);
|
udpHandlerArgs.ip_header_len = sizeof(TUdpHeader);
|
||||||
udpHandlerArgs.ip_data_len = len;
|
udpHandlerArgs.ip_data_len = len;
|
||||||
udpHandlerArgs.dest_ip = ip_dst_be;
|
udpHandlerArgs.dest_ip = ip_dst_be;
|
||||||
|
udpHandlerArgs.dest_mac = mac_dst;
|
||||||
udpHandlerArgs.ip_prot_id = IP_PROT_UDP;
|
udpHandlerArgs.ip_prot_id = IP_PROT_UDP;
|
||||||
udpHandlerArgs.ip_handler = this;
|
udpHandlerArgs.ip_handler = this;
|
||||||
udpHandlerArgs.p_data = p_data;
|
udpHandlerArgs.p_data = p_data;
|
||||||
|
|||||||
@ -19,6 +19,7 @@
|
|||||||
#include "free_rtos/semaphore/semaphore.hpp"
|
#include "free_rtos/semaphore/semaphore.hpp"
|
||||||
#include "free_rtos/mutex/mutex.hpp"
|
#include "free_rtos/mutex/mutex.hpp"
|
||||||
#include "free_rtos/ethernet/eth_frame.h"
|
#include "free_rtos/ethernet/eth_frame.h"
|
||||||
|
#include "free_rtos/ethernet_ip/eth_arp_iface.hpp"
|
||||||
#include "free_rtos/ethernet_ip/eth_ip_iface.hpp"
|
#include "free_rtos/ethernet_ip/eth_ip_iface.hpp"
|
||||||
#include "free_rtos/ethernet/eth_types.h"
|
#include "free_rtos/ethernet/eth_types.h"
|
||||||
#include "free_rtos/ethernet_ip/eth_udp_types.h"
|
#include "free_rtos/ethernet_ip/eth_udp_types.h"
|
||||||
@ -42,8 +43,8 @@ class EthUpdClient : public Handler {
|
|||||||
friend class EthUdpServer;
|
friend class EthUdpServer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EthUpdClient(EthIpIface& ip_iface, TEthMacPorts port_id,
|
EthUpdClient(EthIpIface& ip_iface, EthArpIface& arp,
|
||||||
uint16_t port_dst_be, uint16_t port_src_be,
|
TEthMacPorts port_id, uint16_t port_dst_be, uint16_t port_src_be,
|
||||||
bool use_chksum);
|
bool use_chksum);
|
||||||
|
|
||||||
virtual int32_t Process(uint8_t * p_data, uint32_t len) override;
|
virtual int32_t Process(uint8_t * p_data, uint32_t len) override;
|
||||||
@ -91,12 +92,14 @@ private:
|
|||||||
const bool use_checksum_;
|
const bool use_checksum_;
|
||||||
|
|
||||||
EthIpIface& ip_iface_;
|
EthIpIface& ip_iface_;
|
||||||
|
EthArpIface& arp_;
|
||||||
|
|
||||||
const TEthMacPorts port_id_;
|
const TEthMacPorts port_id_;
|
||||||
|
|
||||||
//TEthPkt eth_pkt_;
|
//TEthPkt eth_pkt_;
|
||||||
|
|
||||||
uint32_t src_ip_;
|
uint32_t src_ip_{0x00000000};
|
||||||
|
uint64_t src_mac_{0x0000000000000000};
|
||||||
|
|
||||||
std::array<std::vector<uint8_t>, UDP_BUF_NUM> buff_;
|
std::array<std::vector<uint8_t>, UDP_BUF_NUM> buff_;
|
||||||
std::atomic<UDPToggle> in_toggle_{UDPToggle::UDP_BUF_1};
|
std::atomic<UDPToggle> in_toggle_{UDPToggle::UDP_BUF_1};
|
||||||
@ -127,8 +130,9 @@ private:
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_src_ip(uint32_t src_ip) {
|
void set_src_ip(uint32_t src_ip, uint64_t src_mac) {
|
||||||
src_ip_ = src_ip;
|
src_ip_ = src_ip;
|
||||||
|
src_mac_ = src_mac;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline uint16_t fill_udp_header(UDPHandlerArgs& udpHandlerArgs);
|
inline uint16_t fill_udp_header(UDPHandlerArgs& udpHandlerArgs);
|
||||||
|
|||||||
@ -10,8 +10,9 @@
|
|||||||
#include "free_rtos/base/swap.h"
|
#include "free_rtos/base/swap.h"
|
||||||
|
|
||||||
|
|
||||||
free_rtos::EthUdpServer::EthUdpServer(EthIpIface& ip_iface) :
|
free_rtos::EthUdpServer::EthUdpServer(EthIpIface& ip_iface, EthArpIface& arp)
|
||||||
ip_iface_{ip_iface}
|
: ip_iface_{ip_iface}
|
||||||
|
, arp_{arp}
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -28,7 +29,7 @@ std::shared_ptr<free_rtos::EthUpdClient> free_rtos::EthUdpServer::createClient(u
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<EthUpdClient> p_client = std::make_shared<EthUpdClient>(ip_iface_, port_id_,
|
std::shared_ptr<EthUpdClient> p_client = std::make_shared<EthUpdClient>(ip_iface_, arp_, port_id_,
|
||||||
port_dst, port_src, use_chksum);
|
port_dst, port_src, use_chksum);
|
||||||
|
|
||||||
if (p_client == nullptr) {
|
if (p_client == nullptr) {
|
||||||
@ -61,13 +62,15 @@ int32_t free_rtos::EthUdpServer::Process(uint8_t * p_data, uint32_t len)
|
|||||||
|
|
||||||
auto& client = item->second;
|
auto& client = item->second;
|
||||||
|
|
||||||
|
TEthFrameHeader * p_eth_hdr = (TEthFrameHeader *)(p_data - sizeof(TEthFrameHeader) - sizeof(TIpHeader));
|
||||||
TIpHeader * p_ip_hdr = (TIpHeader*)(p_data - sizeof(TIpHeader));
|
TIpHeader * p_ip_hdr = (TIpHeader*)(p_data - sizeof(TIpHeader));
|
||||||
|
uint64_t src_mac;
|
||||||
uint32_t src_ip;
|
uint32_t src_ip;
|
||||||
|
|
||||||
|
memcpy(&src_mac, p_eth_hdr->mac_src, ETH_FRAME_MAC_ADDR_LEN_BYTES);
|
||||||
memcpy(&src_ip, p_ip_hdr->ip_src, ETH_IP_ADDR_LEN);
|
memcpy(&src_ip, p_ip_hdr->ip_src, ETH_IP_ADDR_LEN);
|
||||||
|
|
||||||
client->set_src_ip(src_ip);
|
client->set_src_ip(src_ip, src_mac);
|
||||||
client->put_data(p_data + sizeof(TUdpHeader), BASE_SWAP16(hdr->Length) - sizeof(TUdpHeader));
|
client->put_data(p_data + sizeof(TUdpHeader), BASE_SWAP16(hdr->Length) - sizeof(TUdpHeader));
|
||||||
|
|
||||||
rx_sem_.post();
|
rx_sem_.post();
|
||||||
|
|||||||
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include "free_rtos/handler_store/handler_store.hpp"
|
#include "free_rtos/handler_store/handler_store.hpp"
|
||||||
#include "free_rtos/ethernet_ip/eth_udp_server_iface.hpp"
|
#include "free_rtos/ethernet_ip/eth_udp_server_iface.hpp"
|
||||||
|
#include "free_rtos/ethernet_ip/eth_arp_iface.hpp"
|
||||||
#include "free_rtos/ethernet_ip/eth_ip_iface.hpp"
|
#include "free_rtos/ethernet_ip/eth_ip_iface.hpp"
|
||||||
#include "free_rtos/ethernet/eth_types.h"
|
#include "free_rtos/ethernet/eth_types.h"
|
||||||
|
|
||||||
@ -21,7 +22,7 @@ namespace free_rtos {
|
|||||||
|
|
||||||
class EthUdpServer : public Handler, public EthUdpServerIface {
|
class EthUdpServer : public Handler, public EthUdpServerIface {
|
||||||
public:
|
public:
|
||||||
EthUdpServer(EthIpIface& ip_iface);
|
EthUdpServer(EthIpIface& ip_iface, EthArpIface& arp);
|
||||||
|
|
||||||
void setPortId(TEthMacPorts port_id) { port_id_ = port_id;};
|
void setPortId(TEthMacPorts port_id) { port_id_ = port_id;};
|
||||||
|
|
||||||
@ -45,6 +46,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
EthIpIface& ip_iface_;
|
EthIpIface& ip_iface_;
|
||||||
|
EthArpIface& arp_;
|
||||||
|
|
||||||
TEthMacPorts port_id_;
|
TEthMacPorts port_id_;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user