diff options
author | Sairam Venugopal <vsairam@vmware.com> | 2016-11-09 16:34:22 -0800 |
---|---|---|
committer | Gurucharan Shetty <guru@ovn.org> | 2016-11-11 13:53:07 -0800 |
commit | 6e83dfd9c77d83c873f9a51455a90d273e3ee157 (patch) | |
tree | efb999fe360395e8164a1a9a4db6546c8f933d6f /datapath-windows/ovsext/Conntrack-icmp.c | |
parent | a4dabb3df5d000e689915ff9f1df1d21ece0d496 (diff) | |
download | openvswitch-6e83dfd9c77d83c873f9a51455a90d273e3ee157.tar.gz |
datapath-windows: Enable support for tracking ICMP code and type
Add support for tracking ICMP code and Type in the Hyper-V Conntrack
module. This code is similar to the userspace connection tracker.
Signed-off-by: Sairam Venugopal <vsairam@vmware.com>
Acked-by: Anand Kumar <kumaranand@vmware.com>
Signed-off-by: Gurucharan Shetty <guru@ovn.org>
Diffstat (limited to 'datapath-windows/ovsext/Conntrack-icmp.c')
-rw-r--r-- | datapath-windows/ovsext/Conntrack-icmp.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/datapath-windows/ovsext/Conntrack-icmp.c b/datapath-windows/ovsext/Conntrack-icmp.c new file mode 100644 index 000000000..7db8e7d0e --- /dev/null +++ b/datapath-windows/ovsext/Conntrack-icmp.c @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2016 VMware, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "NetProto.h" +#include "Conntrack.h" +#include <stddef.h> + +enum icmp_state { + ICMPS_FIRST, + ICMPS_REPLY, +}; + +struct conn_icmp { + struct OVS_CT_ENTRY up; + enum icmp_state state; +}; + +static const enum ct_timeout icmp_timeouts[] = { + [ICMPS_FIRST] = 60 * CT_INTERVAL_SEC, + [ICMPS_REPLY] = 30 * CT_INTERVAL_SEC, +}; + +static __inline struct conn_icmp * +OvsCastConntrackEntryToIcmpEntry(OVS_CT_ENTRY* conn) +{ + return CONTAINER_OF(conn, struct conn_icmp, up); +} + +enum CT_UPDATE_RES +OvsConntrackUpdateIcmpEntry(OVS_CT_ENTRY* conn_, + BOOLEAN reply, + UINT64 now) +{ + struct conn_icmp *conn = OvsCastConntrackEntryToIcmpEntry(conn_); + + if (reply && conn->state != ICMPS_REPLY) { + conn->state = ICMPS_REPLY; + } + + OvsConntrackUpdateExpiration(&conn->up, now, + icmp_timeouts[conn->state]); + + return CT_UPDATE_VALID; +} + +BOOLEAN +OvsConntrackValidateIcmpPacket(const ICMPHdr *icmp) +{ + return icmp->type == ICMP4_ECHO_REQUEST + || icmp->type == ICMP4_INFO_REQUEST + || icmp->type == ICMP4_TIMESTAMP_REQUEST; +} + +OVS_CT_ENTRY * +OvsConntrackCreateIcmpEntry(UINT64 now) +{ + struct conn_icmp *conn; + + conn = OvsAllocateMemoryWithTag(sizeof(struct conn_icmp), + OVS_CT_POOL_TAG); + if (!conn) { + return NULL; + } + + conn->state = ICMPS_FIRST; + + OvsConntrackUpdateExpiration(&conn->up, now, + icmp_timeouts[conn->state]); + + return &conn->up; +} |