diff --git a/src/dupkt_filter/dupkt_filter.cpp b/src/dupkt_filter/dupkt_filter.cpp index ec34405..c7e667a 100644 --- a/src/dupkt_filter/dupkt_filter.cpp +++ b/src/dupkt_filter/dupkt_filter.cpp @@ -17,8 +17,8 @@ struct dupkt_filter_key // IPv4 uint16_t ip_id; - struct in_addr src_addr; /* network order */ - struct in_addr dst_addr; /* network order */ + uint32_t src_addr; /* host order */ + uint32_t dst_addr; /* host order */ } __attribute__((__packed__)); struct dupkt_filter @@ -53,9 +53,9 @@ static inline int packet_get_dupkt_filter_key(const struct packet *packet, struc memset(key, 0, sizeof(struct dupkt_filter_key)); const struct ip *iphdr = (const struct ip *)ipv4_layer->hdr_ptr; - key->ip_id = ipv4_hdr_get_id(iphdr); - key->src_addr = ipv4_hdr_get_net_order_saddr(iphdr); - key->dst_addr = ipv4_hdr_get_net_order_daddr(iphdr); + key->ip_id = ipv4_hdr_get_ipid(iphdr); + key->src_addr = ipv4_hdr_get_src_addr(iphdr); + key->dst_addr = ipv4_hdr_get_dst_addr(iphdr); const struct tcphdr *tcphdr = (const struct tcphdr *)tcp_layer->hdr_ptr; key->seq = tcp_hdr_get_seq(tcphdr); diff --git a/src/packet/ipv4_helpers.h b/src/packet/ipv4_helpers.h deleted file mode 100644 index e8e5671..0000000 --- a/src/packet/ipv4_helpers.h +++ /dev/null @@ -1,146 +0,0 @@ -#ifndef _IPV4_HELPERS_H -#define _IPV4_HELPERS_H - -#ifdef __cpluscplus -extern "C" -{ -#endif - -#include -#include - -/* - * Internet Header Format - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * |Version| IHL |Type of Service| Total Length | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Identification |Flags| Fragment Offset | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Time to Live | Protocol | Header Checksum | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Source Address | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Destination Address | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Options | Padding | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ - -static inline uint8_t ipv4_hdr_get_version(const struct ip *hdr) -{ - return hdr->ip_v; -} - -static inline uint8_t ipv4_hdr_get_hl(const struct ip *hdr) -{ - return hdr->ip_hl << 2; -} - -static inline uint8_t ipv4_hdr_get_tos(const struct ip *hdr) -{ - return hdr->ip_tos; -} - -static inline uint16_t ipv4_hdr_get_len(const struct ip *hdr) -{ - return ntohs(hdr->ip_len); -} - -static inline uint16_t ipv4_hdr_get_ipid(const struct ip *hdr) -{ - return ntohs(hdr->ip_id); -} - -static inline uint8_t ipv4_hdr_get_flags(const struct ip *hdr) -{ - return (ntohs(hdr->ip_off) & (~IP_OFFMASK)) >> 13; -} - -static inline bool ipv4_hdr_has_flag_rf(const struct ip *hdr) -{ - return (ntohs(hdr->ip_off) & IP_RF) != 0; -} - -static inline bool ipv4_hdr_has_flag_df(const struct ip *hdr) -{ - return (ntohs(hdr->ip_off) & IP_DF) != 0; -} - -static inline bool ipv4_hdr_has_flag_mf(const struct ip *hdr) -{ - return (ntohs(hdr->ip_off) & IP_MF) != 0; -} - -static inline uint16_t ipv4_hdr_get_frag_offset(const struct ip *hdr) -{ - return (ntohs(hdr->ip_off) & IP_OFFMASK) << 3; -} - -static inline uint8_t ipv4_hdr_get_ttl(const struct ip *hdr) -{ - return hdr->ip_ttl; -} - -static inline uint8_t ipv4_hdr_get_protocol(const struct ip *hdr) -{ - return hdr->ip_p; -} - -static inline uint16_t ipv4_hdr_get_checksum(const struct ip *hdr) -{ - return ntohs(hdr->ip_sum); -} - -static inline uint32_t ipv4_hdr_get_host_order_saddr(const struct ip *hdr) -{ - return ntohl(hdr->ip_src.s_addr); -} - -static inline uint32_t ipv4_hdr_get_host_order_daddr(const struct ip *hdr) -{ - return ntohl(hdr->ip_dst.s_addr); -} - -static inline struct in_addr ipv4_hdr_get_net_order_saddr(const struct ip *hdr) -{ - return hdr->ip_src; -} - -static inline struct in_addr ipv4_hdr_get_net_order_daddr(const struct ip *hdr) -{ - return hdr->ip_dst; -} - -static inline uint8_t ipv4_hdr_get_opt_len(const struct ip *hdr) -{ - return ipv4_hdr_get_hl(hdr) - sizeof(struct ip); -} - -static inline const uint8_t *ipv4_hdr_get_opt_ptr(const struct ip *hdr) -{ - return (const uint8_t *)hdr + sizeof(struct ip); -} - -static inline void ipv4_hdr_set_ipid(struct ip *hdr, uint16_t ipid) -{ - hdr->ip_id = htons(ipid); -} - -static inline void ipv4_hdr_set_host_order_saddr(struct ip *hdr, uint32_t saddr) -{ - hdr->ip_src.s_addr = htonl(saddr); -} - -static inline void ipv4_hdr_set_host_order_daddr(struct ip *hdr, uint32_t daddr) -{ - hdr->ip_dst.s_addr = htonl(daddr); -} - -#ifdef __cpluscplus -} -#endif - -#endif diff --git a/src/packet/ipv4_utils.h b/src/packet/ipv4_utils.h new file mode 100644 index 0000000..761f222 --- /dev/null +++ b/src/packet/ipv4_utils.h @@ -0,0 +1,237 @@ +#ifndef _IPV4_UTILS_H +#define _IPV4_UTILS_H + +#ifdef __cpluscplus +extern "C" +{ +#endif + +#include +#include +#include + +/* + * Internet Header Format + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |Version| IHL |Type of Service| Total Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Identification |Flags| Fragment Offset | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Time to Live | Protocol | Header Checksum | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Source Address | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Destination Address | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Options | Padding | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + +/****************************************************************************** + * get + ******************************************************************************/ + +static inline uint8_t ipv4_hdr_get_version(const struct ip *hdr) +{ + return hdr->ip_v; +} + +static inline uint8_t ipv4_hdr_get_hdr_len(const struct ip *hdr) +{ + return hdr->ip_hl << 2; +} + +static inline uint8_t ipv4_hdr_get_tos(const struct ip *hdr) +{ + return hdr->ip_tos; +} + +static inline uint16_t ipv4_hdr_get_total_len(const struct ip *hdr) +{ + return ntohs(hdr->ip_len); +} + +static inline uint16_t ipv4_hdr_get_ipid(const struct ip *hdr) +{ + return ntohs(hdr->ip_id); +} + +static inline uint8_t ipv4_hdr_get_flags(const struct ip *hdr) +{ + return (ntohs(hdr->ip_off) & (~IP_OFFMASK)) >> 13; +} + +static inline bool ipv4_hdr_get_rf_flag(const struct ip *hdr) +{ + return (ntohs(hdr->ip_off) & IP_RF) != 0; +} + +static inline bool ipv4_hdr_get_df_flag(const struct ip *hdr) +{ + return (ntohs(hdr->ip_off) & IP_DF) != 0; +} + +static inline bool ipv4_hdr_get_mf_flag(const struct ip *hdr) +{ + return (ntohs(hdr->ip_off) & IP_MF) != 0; +} + +static inline uint16_t ipv4_hdr_get_frag_offset(const struct ip *hdr) +{ + return (ntohs(hdr->ip_off) & IP_OFFMASK) << 3; +} + +static inline uint8_t ipv4_hdr_get_ttl(const struct ip *hdr) +{ + return hdr->ip_ttl; +} + +static inline uint8_t ipv4_hdr_get_proto(const struct ip *hdr) +{ + return hdr->ip_p; +} + +static inline uint16_t ipv4_hdr_get_checksum(const struct ip *hdr) +{ + return ntohs(hdr->ip_sum); +} + +static inline uint32_t ipv4_hdr_get_src_addr(const struct ip *hdr) +{ + return ntohl(hdr->ip_src.s_addr); +} + +static inline uint32_t ipv4_hdr_get_dst_addr(const struct ip *hdr) +{ + return ntohl(hdr->ip_dst.s_addr); +} + +static inline uint8_t ipv4_hdr_get_opt_len(const struct ip *hdr) +{ + return ipv4_hdr_get_hdr_len(hdr) - sizeof(struct ip); +} + +static inline const char *ipv4_hdr_get_opt_data(const struct ip *hdr) +{ + return (const char *)hdr + sizeof(struct ip); +} + +/****************************************************************************** + * set + ******************************************************************************/ + +static inline void ipv4_hdr_set_version(struct ip *hdr, uint8_t version) +{ + hdr->ip_v = version; +} + +static inline void ipv4_hdr_set_hdr_len(struct ip *hdr, uint8_t hdr_len) +{ + hdr->ip_hl = hdr_len >> 2; +} + +static inline void ipv4_hdr_set_tos(struct ip *hdr, uint8_t tos) +{ + hdr->ip_tos = tos; +} + +static inline void ipv4_hdr_set_total_len(struct ip *hdr, uint16_t total_len) +{ + hdr->ip_len = htons(total_len); +} + +static inline void ipv4_hdr_set_ipid(struct ip *hdr, uint16_t ipid) +{ + hdr->ip_id = htons(ipid); +} + +static inline void ipv4_hdr_set_flags(struct ip *hdr, uint8_t flags) +{ + hdr->ip_off = htons((flags << 13) | (ntohs(hdr->ip_off) & IP_OFFMASK)); +} + +static inline void ipv4_hdr_set_rf_flag(struct ip *hdr, bool flag) +{ + if (flag) + { + hdr->ip_off = htons(ntohs(hdr->ip_off) | IP_RF); + } + else + { + hdr->ip_off = htons(ntohs(hdr->ip_off) & ~IP_RF); + } +} + +static inline void ipv4_hdr_set_df_flag(struct ip *hdr, bool flag) +{ + if (flag) + { + hdr->ip_off = htons(ntohs(hdr->ip_off) | IP_DF); + } + else + { + hdr->ip_off = htons(ntohs(hdr->ip_off) & ~IP_DF); + } +} + +static inline void ipv4_hdr_set_mf_flag(struct ip *hdr, bool flag) +{ + if (flag) + { + hdr->ip_off = htons(ntohs(hdr->ip_off) | IP_MF); + } + else + { + hdr->ip_off = htons(ntohs(hdr->ip_off) & ~IP_MF); + } +} + +static inline void ipv4_hdr_set_frag_offset(struct ip *hdr, uint16_t frag_offset) +{ + hdr->ip_off = htons((frag_offset >> 3) | (ntohs(hdr->ip_off) & ~IP_OFFMASK)); +} + +static inline void ipv4_hdr_set_ttl(struct ip *hdr, uint8_t ttl) +{ + hdr->ip_ttl = ttl; +} + +static inline void ipv4_hdr_set_protocol(struct ip *hdr, uint8_t protocol) +{ + hdr->ip_p = protocol; +} + +static inline void ipv4_hdr_set_checksum(struct ip *hdr, uint16_t checksum) +{ + hdr->ip_sum = htons(checksum); +} + +static inline void ipv4_hdr_set_src_addr(struct ip *hdr, uint32_t saddr) +{ + hdr->ip_src.s_addr = htonl(saddr); +} + +static inline void ipv4_hdr_set_dst_addr(struct ip *hdr, uint32_t daddr) +{ + hdr->ip_dst.s_addr = htonl(daddr); +} + +static inline void ipv4_hdr_set_opt_len(struct ip *hdr, uint8_t opt_len) +{ + ipv4_hdr_set_hdr_len(hdr, opt_len + sizeof(struct ip)); +} + +// must be called after ipv4_hdr_set_opt_len +static inline void ipv4_hdr_set_opt_data(struct ip *hdr, const char *opt_data) +{ + memcpy((char *)hdr + sizeof(struct ip), opt_data, ipv4_hdr_get_opt_len(hdr)); +} + +#ifdef __cpluscplus +} +#endif + +#endif diff --git a/src/packet/packet.cpp b/src/packet/packet.cpp index 756f321..472d1e2 100644 --- a/src/packet/packet.cpp +++ b/src/packet/packet.cpp @@ -12,6 +12,7 @@ #include "packet.h" #include "udp_utils.h" #include "tcp_utils.h" +#include "ipv4_utils.h" #define likely(expr) __builtin_expect((expr), 1) #define unlikely(expr) __builtin_expect((expr), 0) @@ -859,8 +860,8 @@ static inline const char *parse_ipv4(struct packet *handler, const char *data, u return data; } struct ip *hdr = (struct ip *)data; - uint8_t next_proto = hdr->ip_p; - uint16_t hdr_len = (hdr->ip_hl & 0xf) * 4u; + uint8_t next_proto = ipv4_get_proto(hdr); + uint16_t hdr_len = ipv4_hdr_get_hdr_len(hdr); SET_LAYER(handler, layer, LAYER_TYPE_IPV4, hdr_len, data, len); // ip fragmented diff --git a/src/packet/test/CMakeLists.txt b/src/packet/test/CMakeLists.txt index 4bb05b6..8b130fc 100644 --- a/src/packet/test/CMakeLists.txt +++ b/src/packet/test/CMakeLists.txt @@ -11,8 +11,8 @@ target_link_libraries(gtest_udp_utils packet gtest) add_executable(gtest_tcp_utils gtest_tcp_utils.cpp) target_link_libraries(gtest_tcp_utils packet gtest) -add_executable(gtest_ipv4_helpers gtest_ipv4_helpers.cpp) -target_link_libraries(gtest_ipv4_helpers packet gtest) +add_executable(gtest_ipv4_utils gtest_ipv4_utils.cpp) +target_link_libraries(gtest_ipv4_utils packet gtest) add_executable(gtest_ipv6_helpers gtest_ipv6_helpers.cpp) target_link_libraries(gtest_ipv6_helpers packet gtest) @@ -24,6 +24,6 @@ include(GoogleTest) gtest_discover_tests(gtest_packet) gtest_discover_tests(gtest_udp_utils) gtest_discover_tests(gtest_tcp_utils) -gtest_discover_tests(gtest_ipv4_helpers) +gtest_discover_tests(gtest_ipv4_utils) gtest_discover_tests(gtest_ipv6_helpers) gtest_discover_tests(gtest_packet_helpers) \ No newline at end of file diff --git a/src/packet/test/gtest_ipv4_helpers.cpp b/src/packet/test/gtest_ipv4_helpers.cpp deleted file mode 100644 index d4dfc56..0000000 --- a/src/packet/test/gtest_ipv4_helpers.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include - -#include "ipv4_helpers.h" - -/* - * Internet Protocol Version 4, Src: 192.168.36.103, Dst: 192.168.40.137 - * 0100 .... = Version: 4 - * .... 0101 = Header Length: 20 bytes (5) - * Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT) - * 0000 00.. = Differentiated Services Codepoint: Default (0) - * .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0) - * Total Length: 44 - * Identification: 0xffff (65535) - * 001. .... = Flags: 0x1, More fragments - * 0... .... = Reserved bit: Not set - * .0.. .... = Don't fragment: Not set - * ..1. .... = More fragments: Set - * ...0 0000 0000 0000 = Fragment Offset: 0 - * Time to Live: 127 - * Protocol: TCP (6) - * Header Checksum: 0x4d8b [correct] - * [Header checksum status: Good] - * [Calculated Checksum: 0x4d8b] - * Source Address: 192.168.36.103 - * Destination Address: 192.168.40.137 - * [Reassembled IPv4 in frame: 5] - * Data (24 bytes) - */ - -unsigned char data[] = {0x45, 0x00, 0x00, 0x2c, 0xff, 0xff, 0x20, 0x00, 0x7f, 0x06, 0x4d, 0x8b, 0xc0, 0xa8, 0x24, 0x67, 0xc0, 0xa8, 0x28, 0x89}; - -TEST(IPV4_HELPERS, TEST) -{ - const struct ip *hdr = (struct ip *)data; - EXPECT_TRUE(ipv4_hdr_get_version(hdr) == 4); - EXPECT_TRUE(ipv4_hdr_get_hl(hdr) == 20); - EXPECT_TRUE(ipv4_hdr_get_tos(hdr) == 0); - EXPECT_TRUE(ipv4_hdr_get_len(hdr) == 44); - EXPECT_TRUE(ipv4_hdr_get_ipid(hdr) == 65535); - EXPECT_TRUE(ipv4_hdr_get_flags(hdr) == 1); - EXPECT_TRUE(ipv4_hdr_has_flag_rf(hdr) == false); - EXPECT_TRUE(ipv4_hdr_has_flag_df(hdr) == false); - EXPECT_TRUE(ipv4_hdr_has_flag_mf(hdr) == true); - EXPECT_TRUE(ipv4_hdr_get_frag_offset(hdr) == 0); - EXPECT_TRUE(ipv4_hdr_get_ttl(hdr) == 127); - EXPECT_TRUE(ipv4_hdr_get_protocol(hdr) == 6); - EXPECT_TRUE(ipv4_hdr_get_checksum(hdr) == 0x4d8b); - EXPECT_TRUE(ipv4_hdr_get_host_order_saddr(hdr) == 0xc0a82467); - EXPECT_TRUE(ipv4_hdr_get_host_order_daddr(hdr) == 0xc0a82889); - EXPECT_TRUE(ipv4_hdr_get_opt_len(hdr) == 0); - EXPECT_TRUE(ipv4_hdr_get_opt_ptr(hdr) == data + 20); -} - -int main(int argc, char **argv) -{ - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/src/packet/test/gtest_ipv4_utils.cpp b/src/packet/test/gtest_ipv4_utils.cpp new file mode 100644 index 0000000..bd39f88 --- /dev/null +++ b/src/packet/test/gtest_ipv4_utils.cpp @@ -0,0 +1,274 @@ +#include + +#include "ipv4_utils.h" + +/****************************************************************************** + * more fragment + ******************************************************************************/ + +/* + * Internet Protocol Version 4, Src: 192.168.36.103, Dst: 192.168.40.137 + * 0100 .... = Version: 4 + * .... 0101 = Header Length: 20 bytes (5) + * Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT) + * 0000 00.. = Differentiated Services Codepoint: Default (0) + * .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0) + * Total Length: 44 + * Identification: 0xffff (65535) + * 001. .... = Flags: 0x1, More fragments + * 0... .... = Reserved bit: Not set + * .0.. .... = Don't fragment: Not set + * ..1. .... = More fragments: Set + * ...0 0000 0000 0000 = Fragment Offset: 0 + * Time to Live: 127 + * Protocol: TCP (6) + * Header Checksum: 0x4d8b [correct] + * [Header checksum status: Good] + * [Calculated Checksum: 0x4d8b] + * Source Address: 192.168.36.103 + * Destination Address: 192.168.40.137 + * [Reassembled IPv4 in frame: 5] + * Data (24 bytes) + */ + +unsigned char data1[] = {0x45, 0x00, 0x00, 0x2c, 0xff, 0xff, 0x20, 0x00, 0x7f, 0x06, 0x4d, 0x8b, 0xc0, 0xa8, 0x24, 0x67, 0xc0, 0xa8, 0x28, 0x89}; + +TEST(IPV4_UTILS, GET1) +{ + const struct ip *hdr = (struct ip *)data1; + EXPECT_TRUE(ipv4_hdr_get_version(hdr) == 4); + EXPECT_TRUE(ipv4_hdr_get_hdr_len(hdr) == 20); + EXPECT_TRUE(ipv4_hdr_get_tos(hdr) == 0); + EXPECT_TRUE(ipv4_hdr_get_total_len(hdr) == 44); + EXPECT_TRUE(ipv4_hdr_get_ipid(hdr) == 65535); + EXPECT_TRUE(ipv4_hdr_get_flags(hdr) == 1); + EXPECT_TRUE(ipv4_hdr_get_rf_flag(hdr) == false); + EXPECT_TRUE(ipv4_hdr_get_df_flag(hdr) == false); + EXPECT_TRUE(ipv4_hdr_get_mf_flag(hdr) == true); + EXPECT_TRUE(ipv4_hdr_get_frag_offset(hdr) == 0); + EXPECT_TRUE(ipv4_hdr_get_ttl(hdr) == 127); + EXPECT_TRUE(ipv4_hdr_get_proto(hdr) == 6); + EXPECT_TRUE(ipv4_hdr_get_checksum(hdr) == 0x4d8b); + EXPECT_TRUE(ipv4_hdr_get_src_addr(hdr) == 0xc0a82467); + EXPECT_TRUE(ipv4_hdr_get_dst_addr(hdr) == 0xc0a82889); + EXPECT_TRUE(ipv4_hdr_get_opt_len(hdr) == 0); + EXPECT_TRUE(ipv4_hdr_get_opt_data(hdr) == data + 20); +} + +TEST(IPV4_UTILS, SET1) +{ + char buff[20] = {0}; + + struct ip *hdr = (struct ip *)buff; + ipv4_hdr_set_version(hdr, 4); + ipv4_hdr_set_hdr_len(hdr, 20); + ipv4_hdr_set_tos(hdr, 0); + ipv4_hdr_set_total_len(hdr, 44); + ipv4_hdr_set_ipid(hdr, 65535); + ipv4_hdr_set_frag_offset(hdr, 0); + ipv4_hdr_set_ttl(hdr, 127); + ipv4_hdr_set_protocol(hdr, 6); + ipv4_hdr_set_checksum(hdr, 0x4d8b); + ipv4_hdr_set_src_addr(hdr, 0xc0a82467); + ipv4_hdr_set_dst_addr(hdr, 0xc0a82889); + ipv4_hdr_set_opt_len(hdr, 0); + ipv4_hdr_set_opt_data(hdr, NULL); + + ipv4_hdr_set_flags(hdr, 1); + EXPECT_TRUE(memcmp(buff, data1, 20) == 0); + + ipv4_hdr_set_rf_flag(hdr, false); + ipv4_hdr_set_df_flag(hdr, false); + ipv4_hdr_set_mf_flag(hdr, true); + EXPECT_TRUE(memcmp(buff, data1, 20) == 0); +} + +/****************************************************************************** + * fragment offset + ******************************************************************************/ + +/* + * Frame 5: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) + * Ethernet II, Src: Fortinet_cc:87:22 (e8:1c:ba:cc:87:22), Dst: EvocInte_2f:35:b8 (00:22:46:2f:35:b8) + * Internet Protocol Version 4, Src: 192.168.36.103, Dst: 192.168.40.137 + * 0100 .... = Version: 4 + * .... 0101 = Header Length: 20 bytes (5) + * Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT) + * 0000 00.. = Differentiated Services Codepoint: Default (0) + * .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0) + * Total Length: 44 + * Identification: 0xffff (65535) + * 000. .... = Flags: 0x0 + * 0... .... = Reserved bit: Not set + * .0.. .... = Don't fragment: Not set + * ..0. .... = More fragments: Not set + * ...0 0000 0000 0011 = Fragment Offset: 24 + * Time to Live: 127 + * Protocol: TCP (6) + * Header Checksum: 0x6d88 [correct] + * [Header checksum status: Good] + * [Calculated Checksum: 0x6d88] + * Source Address: 192.168.36.103 + * Destination Address: 192.168.40.137 + * [2 IPv4 Fragments (48 bytes): #4(24), #5(24)] + * [Frame: 4, payload: 0-23 (24 bytes)] + * [Frame: 5, payload: 24-47 (24 bytes)] + * [Fragment count: 2] + * [Reassembled IPv4 length: 48] + * [Reassembled IPv4 data: f4a5270f9107248703d518e75018ff005e9200003132330af4a5270f9107248b03d518e7…] + * Transmission Control Protocol, Src Port: 62629, Dst Port: 9999, Seq: 1, Ack: 1, Len: 28 + * Data (28 bytes) + * Data: 3132330af4a5270f9107248b03d518e75018ff00301600006162630a + * [Length: 28] + */ + +unsigned char data2[] = {0x45, 0x00, 0x00, 0x2c, 0xff, 0xff, 0x00, 0x03, 0x7f, 0x06, 0x6d, 0x88, 0xc0, 0xa8, 0x24, 0x67, 0xc0, 0xa8, 0x28, 0x89}; + +TEST(IPV4_UTILS, GET2) +{ + const struct ip *hdr = (struct ip *)data2; + EXPECT_TRUE(ipv4_hdr_get_version(hdr) == 4); + EXPECT_TRUE(ipv4_hdr_get_hdr_len(hdr) == 20); + EXPECT_TRUE(ipv4_hdr_get_tos(hdr) == 0); + EXPECT_TRUE(ipv4_hdr_get_total_len(hdr) == 44); + EXPECT_TRUE(ipv4_hdr_get_ipid(hdr) == 65535); + EXPECT_TRUE(ipv4_hdr_get_flags(hdr) == 0); + EXPECT_TRUE(ipv4_hdr_get_rf_flag(hdr) == false); + EXPECT_TRUE(ipv4_hdr_get_df_flag(hdr) == false); + EXPECT_TRUE(ipv4_hdr_get_mf_flag(hdr) == false); + EXPECT_TRUE(ipv4_hdr_get_frag_offset(hdr) == 24); + EXPECT_TRUE(ipv4_hdr_get_ttl(hdr) == 127); + EXPECT_TRUE(ipv4_hdr_get_proto(hdr) == 6); + EXPECT_TRUE(ipv4_hdr_get_checksum(hdr) == 0x6d88); + EXPECT_TRUE(ipv4_hdr_get_src_addr(hdr) == 0xc0a82467); + EXPECT_TRUE(ipv4_hdr_get_dst_addr(hdr) == 0xc0a82889); + EXPECT_TRUE(ipv4_hdr_get_opt_len(hdr) == 0); + EXPECT_TRUE(ipv4_hdr_get_opt_data(hdr) == data + 20); +} + +TEST(IPV4_UTILS, SET2) +{ + char buff[20] = {0}; + + struct ip *hdr = (struct ip *)buff; + ipv4_hdr_set_version(hdr, 4); + ipv4_hdr_set_hdr_len(hdr, 20); + ipv4_hdr_set_tos(hdr, 0); + ipv4_hdr_set_total_len(hdr, 44); + ipv4_hdr_set_ipid(hdr, 65535); + ipv4_hdr_set_frag_offset(hdr, 24); + ipv4_hdr_set_ttl(hdr, 127); + ipv4_hdr_set_protocol(hdr, 6); + ipv4_hdr_set_checksum(hdr, 0x6d88); + ipv4_hdr_set_src_addr(hdr, 0xc0a82467); + ipv4_hdr_set_dst_addr(hdr, 0xc0a82889); + ipv4_hdr_set_opt_len(hdr, 0); + ipv4_hdr_set_opt_data(hdr, NULL); + + ipv4_hdr_set_flags(hdr, 0); + EXPECT_TRUE(memcmp(buff, data2, 20) == 0); + + ipv4_hdr_set_rf_flag(hdr, false); + ipv4_hdr_set_df_flag(hdr, false); + ipv4_hdr_set_mf_flag(hdr, false); + EXPECT_TRUE(memcmp(buff, data2, 20) == 0); +} + +/****************************************************************************** + * options + ******************************************************************************/ + +/* + * Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1 + * 0100 .... = Version: 4 + * .... 1111 = Header Length: 60 bytes (15) + * Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT) + * 0000 00.. = Differentiated Services Codepoint: Default (0) + * .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0) + * Total Length: 124 + * Identification: 0x0000 (0) + * 010. .... = Flags: 0x2, Don't fragment + * 0... .... = Reserved bit: Not set + * .1.. .... = Don't fragment: Set + * ..0. .... = More fragments: Not set + * ...0 0000 0000 0000 = Fragment Offset: 0 + * Time to Live: 64 + * Protocol: ICMP (1) + * Header Checksum: 0xfd30 [correct] + * [Header checksum status: Good] + * [Calculated Checksum: 0xfd30] + * Source Address: 127.0.0.1 + * Destination Address: 127.0.0.1 + * Options: (40 bytes), Commercial Security + * IP Option - Commercial Security (40 bytes) + * Type: 134 + * 1... .... = Copy on fragmentation: Yes + * .00. .... = Class: Control (0) + * ...0 0110 = Number: Commercial IP security option (6) + * Length: 40 + * DOI: 1 + * Tag Type: Restrictive Category Bitmap (1) + * Sensitivity Level: 1 + * Categories: 0,2,4,5,6,239 + */ + +unsigned char data3[] = { + 0x4f, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0xfd, 0x30, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x86, 0x28, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x22, 0x00, 0x01, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; + +TEST(IPV4_UTILS, GET3) +{ + const struct ip *hdr = (struct ip *)data3; + EXPECT_TRUE(ipv4_hdr_get_version(hdr) == 4); + EXPECT_TRUE(ipv4_hdr_get_hdr_len(hdr) == 60); + EXPECT_TRUE(ipv4_hdr_get_tos(hdr) == 0); + EXPECT_TRUE(ipv4_hdr_get_total_len(hdr) == 124); + EXPECT_TRUE(ipv4_hdr_get_ipid(hdr) == 0); + EXPECT_TRUE(ipv4_hdr_get_flags(hdr) == 2); + EXPECT_TRUE(ipv4_hdr_get_rf_flag(hdr) == false); + EXPECT_TRUE(ipv4_hdr_get_df_flag(hdr) == true); + EXPECT_TRUE(ipv4_hdr_get_mf_flag(hdr) == false); + EXPECT_TRUE(ipv4_hdr_get_frag_offset(hdr) == 0); + EXPECT_TRUE(ipv4_hdr_get_ttl(hdr) == 64); + EXPECT_TRUE(ipv4_hdr_get_proto(hdr) == 1); + EXPECT_TRUE(ipv4_hdr_get_checksum(hdr) == 0xfd30); + EXPECT_TRUE(ipv4_hdr_get_src_addr(hdr) == 0x7f000001); + EXPECT_TRUE(ipv4_hdr_get_dst_addr(hdr) == 0x7f000001); + EXPECT_TRUE(ipv4_hdr_get_opt_len(hdr) == 40); + EXPECT_TRUE(ipv4_hdr_get_opt_data(hdr) == data + 20); +} + +TEST(IPV4_UTILS, SET3) +{ + char buff[60] = {0}; + + struct ip *hdr = (struct ip *)buff; + ipv4_hdr_set_version(hdr, 4); + ipv4_hdr_set_hdr_len(hdr, 60); + ipv4_hdr_set_tos(hdr, 0); + ipv4_hdr_set_total_len(hdr, 124); + ipv4_hdr_set_ipid(hdr, 0); + ipv4_hdr_set_frag_offset(hdr, 0); + ipv4_hdr_set_ttl(hdr, 64); + ipv4_hdr_set_protocol(hdr, 1); + ipv4_hdr_set_checksum(hdr, 0xfd30); + ipv4_hdr_set_src_addr(hdr, 0x7f000001); + ipv4_hdr_set_dst_addr(hdr, 0x7f000001); + ipv4_hdr_set_opt_len(hdr, 40); + ipv4_hdr_set_opt_data(hdr, data3 + 20); + + ipv4_hdr_set_flags(hdr, 2); + EXPECT_TRUE(memcmp(buff, data3, 60) == 0); + + ipv4_hdr_set_rf_flag(hdr, false); + ipv4_hdr_set_df_flag(hdr, true); + ipv4_hdr_set_mf_flag(hdr, false); + EXPECT_TRUE(memcmp(buff, data3, 60) == 0); +} + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/src/session/test/gtest_filter_tcp_dupkt.cpp b/src/session/test/gtest_filter_tcp_dupkt.cpp index c909de2..ef4b5c6 100644 --- a/src/session/test/gtest_filter_tcp_dupkt.cpp +++ b/src/session/test/gtest_filter_tcp_dupkt.cpp @@ -36,8 +36,8 @@ TEST(TCP_DUPKT_FILTER_ENABLE, SYN_DUP) packet_parse(&pkt, (const char *)tcp_pkt_c2s_syn_retransmission, sizeof(tcp_pkt1_c2s_syn)); const struct layer_record *ipv4_layer = packet_get_innermost_layer(&pkt, LAYER_TYPE_IPV4); EXPECT_TRUE(ipv4_layer); - const struct ip *hdr = (const struct ip *)ipv4_layer->hdr_ptr; - ipv4_hdr_set_ipid((struct ip *)hdr, 0x1234); + struct ip *hdr = (struct ip *)ipv4_layer->hdr_ptr; + ipv4_hdr_set_ipid(hdr, 0x1234); printf("<= packet parse\n\n"); sess = session_manager_update_session(mgr, &pkt); EXPECT_TRUE(sess); @@ -88,8 +88,8 @@ TEST(TCP_DUPKT_FILTER_ENABLE, S2C_DUP) packet_parse(&pkt, (const char *)tcp_pkt_s2c_synack_retransmission, sizeof(tcp_pkt2_s2c_syn_ack)); const struct layer_record *ipv4_layer = packet_get_innermost_layer(&pkt, LAYER_TYPE_IPV4); EXPECT_TRUE(ipv4_layer); - const struct ip *hdr = (const struct ip *)ipv4_layer->hdr_ptr; - ipv4_hdr_set_ipid((struct ip *)hdr, 0x1234); + struct ip *hdr = (struct ip *)ipv4_layer->hdr_ptr; + ipv4_hdr_set_ipid(hdr, 0x1234); printf("<= packet parse\n\n"); sess = session_manager_update_session(mgr, &pkt); EXPECT_TRUE(sess); @@ -111,7 +111,7 @@ TEST(TCP_DUPKT_FILTER_ENABLE, SKIP_FILTER) struct session *sess = NULL; struct session_manager *mgr = NULL; const struct layer_record *ipv4_layer; - const struct ip *hdr; + struct ip *hdr; char tcp_pkt_c2s_syn_retransmission[1500] = {0}; timestamp_update(); @@ -134,8 +134,8 @@ TEST(TCP_DUPKT_FILTER_ENABLE, SKIP_FILTER) packet_parse(&pkt, (const char *)tcp_pkt_c2s_syn_retransmission, sizeof(tcp_pkt1_c2s_syn)); ipv4_layer = packet_get_innermost_layer(&pkt, LAYER_TYPE_IPV4); EXPECT_TRUE(ipv4_layer); - hdr = (const struct ip *)ipv4_layer->hdr_ptr; - ipv4_hdr_set_ipid((struct ip *)hdr, 0x1234); + hdr = (struct ip *)ipv4_layer->hdr_ptr; + ipv4_hdr_set_ipid(hdr, 0x1234); printf("<= packet parse\n\n"); sess = session_manager_update_session(mgr, &pkt); EXPECT_TRUE(sess); @@ -148,8 +148,8 @@ TEST(TCP_DUPKT_FILTER_ENABLE, SKIP_FILTER) packet_parse(&pkt, (const char *)tcp_pkt_c2s_syn_retransmission, sizeof(tcp_pkt1_c2s_syn)); ipv4_layer = packet_get_innermost_layer(&pkt, LAYER_TYPE_IPV4); EXPECT_TRUE(ipv4_layer); - hdr = (const struct ip *)ipv4_layer->hdr_ptr; - ipv4_hdr_set_ipid((struct ip *)hdr, 0x1235); + hdr = (struct ip *)ipv4_layer->hdr_ptr; + ipv4_hdr_set_ipid(hdr, 0x1235); printf("<= packet parse\n\n"); sess = session_manager_update_session(mgr, &pkt); EXPECT_TRUE(sess); @@ -211,8 +211,8 @@ TEST(TCP_DUPKT_FILTER_DISABLE, C2S_DUPKT) packet_parse(&pkt, (const char *)tcp_pkt_c2s_syn_retransmission, sizeof(tcp_pkt1_c2s_syn)); const struct layer_record *ipv4_layer = packet_get_innermost_layer(&pkt, LAYER_TYPE_IPV4); EXPECT_TRUE(ipv4_layer); - const struct ip *hdr = (const struct ip *)ipv4_layer->hdr_ptr; - ipv4_hdr_set_ipid((struct ip *)hdr, 0x1234); + struct ip *hdr = (struct ip *)ipv4_layer->hdr_ptr; + ipv4_hdr_set_ipid(hdr, 0x1234); printf("<= packet parse\n\n"); sess = session_manager_update_session(mgr, &pkt); EXPECT_TRUE(sess); @@ -266,8 +266,8 @@ TEST(TCP_DUPKT_FILTER_DISABLE, S2C_DUP) packet_parse(&pkt, (const char *)tcp_pkt_s2c_synack_retransmission, sizeof(tcp_pkt2_s2c_syn_ack)); const struct layer_record *ipv4_layer = packet_get_innermost_layer(&pkt, LAYER_TYPE_IPV4); EXPECT_TRUE(ipv4_layer); - const struct ip *hdr = (const struct ip *)ipv4_layer->hdr_ptr; - ipv4_hdr_set_ipid((struct ip *)hdr, 0x1234); + struct ip *hdr = (struct ip *)ipv4_layer->hdr_ptr; + ipv4_hdr_set_ipid(hdr, 0x1234); printf("<= packet parse\n\n"); sess = session_manager_update_session(mgr, &pkt); EXPECT_TRUE(sess); diff --git a/src/session/test/gtest_overload_evict_tcp_sess.cpp b/src/session/test/gtest_overload_evict_tcp_sess.cpp index dea8abc..c3017ec 100644 --- a/src/session/test/gtest_overload_evict_tcp_sess.cpp +++ b/src/session/test/gtest_overload_evict_tcp_sess.cpp @@ -4,8 +4,8 @@ static void overwrite_ipv4_saddr(struct packet *pkt, uint32_t saddr) { const struct layer_record *ipv4_layer = packet_get_innermost_layer(pkt, LAYER_TYPE_IPV4); EXPECT_TRUE(ipv4_layer); - const struct ip *hdr = (const struct ip *)ipv4_layer->hdr_ptr; - ipv4_hdr_set_host_order_saddr((struct ip *)hdr, saddr); + struct ip *hdr = (struct ip *)ipv4_layer->hdr_ptr; + ipv4_hdr_set_src_addr(hdr, saddr); } #if 1 diff --git a/src/session/test/gtest_overload_evict_udp_sess.cpp b/src/session/test/gtest_overload_evict_udp_sess.cpp index b57f6f8..2280324 100644 --- a/src/session/test/gtest_overload_evict_udp_sess.cpp +++ b/src/session/test/gtest_overload_evict_udp_sess.cpp @@ -4,8 +4,8 @@ static void overwrite_ipv4_saddr(struct packet *pkt, uint32_t saddr) { const struct layer_record *ipv4_layer = packet_get_innermost_layer(pkt, LAYER_TYPE_IPV4); EXPECT_TRUE(ipv4_layer); - const struct ip *hdr = (const struct ip *)ipv4_layer->hdr_ptr; - ipv4_hdr_set_host_order_saddr((struct ip *)hdr, saddr); + struct ip *hdr = (struct ip *)ipv4_layer->hdr_ptr; + ipv4_hdr_set_src_addr(hdr, saddr); } #if 1 diff --git a/src/session/test/gtest_state_tcp_init_to_opening.cpp b/src/session/test/gtest_state_tcp_init_to_opening.cpp index c126657..4e6bcd6 100644 --- a/src/session/test/gtest_state_tcp_init_to_opening.cpp +++ b/src/session/test/gtest_state_tcp_init_to_opening.cpp @@ -387,8 +387,8 @@ TEST(TCP_INIT_TO_OPENING, BY_SYN_RETRANSMISSION) packet_parse(&pkt, (const char *)tcp_pkt_c2s_syn_retransmission, sizeof(tcp_pkt1_c2s_syn)); const struct layer_record *ipv4_layer = packet_get_innermost_layer(&pkt, LAYER_TYPE_IPV4); EXPECT_TRUE(ipv4_layer); - const struct ip *hdr = (const struct ip *)ipv4_layer->hdr_ptr; - ipv4_hdr_set_ipid((struct ip *)hdr, 0x1234); + struct ip *hdr = (struct ip *)ipv4_layer->hdr_ptr; + ipv4_hdr_set_ipid(hdr, 0x1234); printf("<= packet parse\n\n"); sess = session_manager_update_session(mgr, &pkt); EXPECT_TRUE(sess); @@ -485,8 +485,8 @@ TEST(TCP_INIT_TO_OPENING, BY_SYNACK_RETRANSMISSION) packet_parse(&pkt, (const char *)tcp_pkt_s2c_synack_retransmission, sizeof(tcp_pkt2_s2c_syn_ack)); const struct layer_record *ipv4_layer = packet_get_innermost_layer(&pkt, LAYER_TYPE_IPV4); EXPECT_TRUE(ipv4_layer); - const struct ip *hdr = (const struct ip *)ipv4_layer->hdr_ptr; - ipv4_hdr_set_ipid((struct ip *)hdr, 0x1234); + struct ip *hdr = (struct ip *)ipv4_layer->hdr_ptr; + ipv4_hdr_set_ipid(hdr, 0x1234); printf("<= packet parse\n\n"); sess = session_manager_update_session(mgr, &pkt); EXPECT_TRUE(sess);