@@ -22,6 +22,7 @@ using ppp::threading::Timer;
2222using ppp::threading::Executors;
2323using ppp::net::AddressFamily;
2424using ppp::net::IPEndPoint;
25+ using ppp::net::Ipep;
2526using ppp::net::native::ip_hdr;
2627using ppp::net::native::udp_hdr;
2728using ppp::net::native::icmp_hdr;
@@ -71,7 +72,7 @@ namespace ppp {
7172 boost::asio::ip::udp::endpoint sourceEP = IPEndPoint::ToEndPoint<boost::asio::ip::udp>(frame->Source );
7273 std::shared_ptr<VEthernetDatagramPort> datagram = AllocDatagramPort (sourceEP);
7374 if (NULL != datagram) {
74- const std::shared_ptr<BufferSegment>& messages = packet ->Payload ;
75+ const std::shared_ptr<BufferSegment>& messages = frame ->Payload ;
7576 if (NULL != messages) {
7677 boost::asio::ip::udp::endpoint destinationEP = IPEndPoint::ToEndPoint<boost::asio::ip::udp>(frame->Destination );
7778 return datagram->SendTo (messages->Buffer .get (), messages->Length , destinationEP);
@@ -119,6 +120,7 @@ namespace ppp {
119120
120121 VEthernetNetworkSwitcher::VEthernetDatagramPortPtr VEthernetNetworkSwitcher::AllocDatagramPort (const boost::asio::ip::udp::endpoint& sourceEP) noexcept {
121122 using VEthernetDisposedEventHandler = VEthernetDatagramPort::VEthernetDisposedEventHandler;
123+ using VEthernetMessageEventHandler = VEthernetDatagramPort::VEthernetMessageEventHandler;
122124
123125 SynchronizedObjectScope scope (syncobj_);
124126 if (this ->IsDisposed ()) {
@@ -145,6 +147,25 @@ namespace ppp {
145147 [self, this ](VEthernetDatagramPort* datagram) noexcept {
146148 DeleteDatagramPort (datagram->GetLocalEndPoint ());
147149 });
150+ datagram->MessageEvent = make_shared_object<VEthernetMessageEventHandler>(
151+ [self, this ](VEthernetDatagramPort* datagram, void * packet, int packet_size, const boost::asio::ip::udp::endpoint& destinationEP) noexcept {
152+ boost::asio::ip::udp::endpoint remoteEP = Ipep::V6ToV4 (destinationEP);
153+ boost::asio::ip::address address = remoteEP.address ();
154+ if (address.is_v4 ()) {
155+ std::shared_ptr<BufferSegment> messages = make_shared_object<BufferSegment>();
156+ messages->Buffer = std::shared_ptr<Byte>(reinterpret_cast <Byte*>(packet), [](Byte*) noexcept {});
157+ messages->Length = packet_size;
158+
159+ std::shared_ptr<UdpFrame> frame = make_shared_object<UdpFrame>();
160+ frame->AddressesFamily = AddressFamily::InterNetwork;
161+ frame->Source = IPEndPoint::ToEndPoint (remoteEP);
162+ frame->Destination = IPEndPoint::ToEndPoint (datagram->GetLocalEndPoint ());
163+ frame->Payload = messages;
164+
165+ std::shared_ptr<IPFrame> ip = UdpFrame::ToIp (frame.get ());
166+ Output (ip.get ());
167+ }
168+ });
148169 return datagram;
149170 }
150171
0 commit comments