summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Conntrack-tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'datapath-windows/ovsext/Conntrack-tcp.c')
-rw-r--r--datapath-windows/ovsext/Conntrack-tcp.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/datapath-windows/ovsext/Conntrack-tcp.c b/datapath-windows/ovsext/Conntrack-tcp.c
index a468c3e6b..77370531c 100644
--- a/datapath-windows/ovsext/Conntrack-tcp.c
+++ b/datapath-windows/ovsext/Conntrack-tcp.c
@@ -37,6 +37,8 @@
*/
#include "Conntrack.h"
+#include "NetProto.h"
+#include "PacketParser.h"
#include <stddef.h>
struct tcp_peer {
@@ -577,3 +579,54 @@ done:
NlMsgEndNested(nlBuf, offset);
return status;
}
+
+NDIS_STATUS
+OvsCtHandleTftp(PNET_BUFFER_LIST curNbl, OvsFlowKey *key,
+ OVS_PACKET_HDR_INFO *layers, UINT64 currentTime,
+ POVS_CT_ENTRY entry)
+{
+ UDPHdr udpStorage;
+ const UDPHdr *udp = NULL;
+ struct ct_addr serverIp;
+ struct ct_addr clientIp;
+ NDIS_STATUS status = NDIS_STATUS_SUCCESS;
+
+ udp = OvsGetUdp(curNbl, layers->l4Offset, &udpStorage);
+ if (!udp) {
+ return NDIS_STATUS_INVALID_PACKET;
+ }
+
+ RtlZeroMemory(&serverIp, sizeof(serverIp));
+ RtlZeroMemory(&clientIp, sizeof(clientIp));
+
+ if (OvsCtRelatedLookup(entry->key, currentTime)) {
+ return NDIS_STATUS_SUCCESS;
+ }
+
+ if (layers->isIPv4) {
+ serverIp.ipv4 = key->ipKey.nwDst;
+ clientIp.ipv4 = key->ipKey.nwSrc;
+ status = OvsCtRelatedEntryCreate(key->ipKey.nwProto,
+ key->l2.dlType,
+ serverIp,
+ clientIp,
+ 0,
+ udp->source,
+ currentTime,
+ entry);
+ } else {
+ serverIp.ipv6 = key->ipv6Key.ipv6Dst;
+ clientIp.ipv6 = key->ipv6Key.ipv6Src;
+ status = OvsCtRelatedEntryCreate(key->ipv6Key.nwProto,
+ key->l2.dlType,
+ serverIp,
+ clientIp,
+ 0,
+ udp->source,
+ currentTime,
+ entry);
+ }
+
+ return status;
+}
+