/** * @file PacketInfoIpv4Tcp.hpp * @author Tobias * @brief class to provide packets IPv4 and TCP header information * @date 2021-06-08 * */ #pragma once #include #include #include #include "DebugHelper.hpp" #include "Definitions.hpp" #include "PacketDissection/PacketInfoIpv4.hpp" #include "PacketDissection/PacketProtTcp.hpp" class PacketInfoIpv4Tcp : public PacketInfoIpv4 { public: inline PacketInfoIpv4Tcp(); inline PacketInfoIpv4Tcp(rte_mbuf* mbuf) : PacketInfoIpv4( IPv4TCP, mbuf, rte_pktmbuf_mtod(mbuf, struct rte_ether_hdr*), rte_pktmbuf_mtod_offset(mbuf, struct rte_ipv4_hdr*, (uint16_t)sizeof(struct rte_ether_hdr))) , _tcp_hdr(rte_pktmbuf_mtod_offset( mbuf, struct rte_tcp_hdr*, (sizeof(struct rte_ether_hdr) + sizeof(struct rte_ipv4_hdr)))) {} inline PacketInfoIpv4Tcp(rte_mbuf* mbuf, rte_ether_hdr* eth_hdr, rte_ipv4_hdr* ip_hdr, rte_tcp_hdr* l4_hdr) : PacketInfoIpv4(IPv4TCP, mbuf, eth_hdr, ip_hdr) , _tcp_hdr(l4_hdr) {} inline PacketInfoIpv4Tcp(rte_mbuf* mbuf, rte_ipv4_hdr* ip_hdr, rte_tcp_hdr* l4_hdr) : PacketInfoIpv4(IPv4TCP, mbuf, ip_hdr) , _tcp_hdr(l4_hdr) {} inline ~PacketInfoIpv4Tcp() { // PacketInfoIpv4::~PacketInfoIpv4(); // _tcp_hdr = nullptr; } /** * @brief Set packets TCP sequence number * * @param seq_num */ inline void set_seq_num(uint32_t seq_num) { PacketProtTcp::set_seq_num(_tcp_hdr, seq_num); } /** * @brief Set packets TCP acknowledgment number * * @param ack_num */ inline void set_ack_num(uint32_t ack_num) { PacketProtTcp::set_ack_num(_tcp_hdr, ack_num); } /** * @brief Get packets TCP destination port * * @return uint16_t */ inline uint16_t get_dst_port() { return PacketProtTcp::get_dst_port(_tcp_hdr); } /** * @brief Get packets TCP source port * * @return uint16_t */ inline uint16_t get_src_port() { return PacketProtTcp::get_src_port(_tcp_hdr); } /** * @brief Get packets TCP flags * MSB is CWR flag, LSB is FIN flag, NS flag not included * @return uint8_t */ inline uint8_t get_flags() { const char desc[] = "mbuf"; return PacketProtTcp::get_flags( _tcp_hdr); // these are FIN to CWR flag, but // i am not shure in which order } /** * @brief Get packets payload size in byte * * @return uint16_t */ inline uint16_t get_payload_size() { uint16_t length = get_packet_size(); length = length - get_ip_hdr_len(); length = length - PacketProtTcp::get_tcp_hdr_len(_tcp_hdr); return length; } /** * @brief Get packets TCP window size * * @return uint16_t */ inline uint16_t get_window_size() { return PacketProtTcp::get_window_size(_tcp_hdr); } /** * @brief Get packets TCP sequence number * * @return uint32_t */ inline uint32_t get_seq_num() { return PacketProtTcp::get_seq_num(_tcp_hdr); } /** * @brief Get packets TCP acknowledgment number * * @return uint32_t */ inline uint32_t get_ack_num() { return PacketProtTcp::get_ack_num(_tcp_hdr); } /** * @brief Get packets TCP SYN flag * * @return true if flag is set * @return false if flag is not set */ inline bool get_syn_flag() { return PacketProtTcp::get_syn_flag(_tcp_hdr); } /** * @brief Get packets TCP ACK flag * * @return true if flag is set * @return false if flag is not set */ inline bool get_ack_flag() { return PacketProtTcp::get_ack_flag(_tcp_hdr); } /** * @brief Get packets TCP RST flag * * @return true if flag is set * @return false if flag is not set */ inline bool get_rst_flag() { return PacketProtTcp::get_rst_flag(_tcp_hdr); } /** * @brief Get packets TCP FIN flag * * @return true if flag is set * @return false if flag is not set */ inline bool get_fin_flag() { return PacketProtTcp::get_fin_flag(_tcp_hdr); } /** * @brief fills empty mbuf with IP and TCP header * If this PacketInfo has a _mbuf and this _mbuf is empty, * then all IP and TCP header information is filled in. * This function doesn't create a new mbuf. * @param src_mac MAC address packet was send from * @param dst_mac MAC address packet is going to be send to * @param src_ip IP address packet originally originated from * @param dst_ip IP address packet is going to be send to * @param src_port TCP port packet originally was send from * @param dst_port TCP port packet should be recieved on * @param seq_num TCP sequence number * @param ack_num TCP acknowledgment number * @param flags TCP flags wich are going to be set, can't set NS flag * @param tcp_window TCP recive window size */ inline void fill_payloadless_tcp_packet( rte_ether_addr src_mac, rte_ether_addr dst_mac, uint32_t src_ip, uint32_t dst_ip, uint16_t src_port, uint16_t dst_port, uint32_t seq_num, uint32_t ack_num, uint8_t flags, uint16_t tcp_window) { // const char desc[] = "mbuf"; // let PacketInfo handle ethernet filling fill_eth_hdr(dst_mac, src_mac); // let prot objekt handle tcp filling PacketProtTcp::fill_payloadless_tcp_header(_tcp_hdr, get_mbuf(), src_port, dst_port, seq_num, ack_num, flags, tcp_window); // let PacketInfoIpv4 handle IPv4 filling fill_ip_hdr(src_ip, dst_ip, 6, 20); } /** * @brief fills in current checksums * calculates current IPv4 and TCP checksum and changes * them inside the packet */ inline void recalculate_checksums() { rte_ipv4_hdr* ip4_hdr = get_ip_hdr(); _tcp_hdr->cksum = 0; ip4_hdr->hdr_checksum = 0; _tcp_hdr->cksum = rte_ipv4_udptcp_cksum(ip4_hdr, _tcp_hdr); PacketInfoIpv4::recalculate_ip_checksum(); } inline void prepare_offloading_checksums() { rte_mbuf* mbuf = get_mbuf(); mbuf->ol_flags = PKT_TX_IPV4 | PKT_TX_IP_CKSUM | PKT_TX_TCP_CKSUM; mbuf->l4_len = sizeof(struct rte_tcp_hdr); uint16_t cksm = PacketInfoIpv4::get_pseudo_hdr_cksm(); PacketProtTcp::fill_tcp_cksm(_tcp_hdr, cksm); } inline void set_tcp_cksm(uint16_t cksm) { PacketProtTcp::fill_tcp_cksm(_tcp_hdr, cksm); } private: rte_tcp_hdr* _tcp_hdr; };