198 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * @file PacketProtTcp.hpp
 | |
|  * @author Tobias
 | |
|  * @brief class to extract and change some informations in TCP header
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <boost/log/trivial.hpp>
 | |
| #include <rte_mbuf.h>
 | |
| #include <rte_tcp.h>
 | |
| 
 | |
| #define FIN_FLAG_POS 0b00000001
 | |
| #define SYN_FLAG_POS 0b00000010
 | |
| #define RST_FLAG_POS 0b00000100
 | |
| #define ACK_FLAG_POS 0b00010000
 | |
| #define FIRST_4_BIT 0b11110000
 | |
| #define TCP_HDR_SIZE_4BYTE_WORD 0b01010000
 | |
| 
 | |
| class PacketProtTcp {
 | |
|   public:
 | |
|     // PacketProtTcp(rte_tcp_hdr* tcp_hdr);
 | |
| 
 | |
|     /**
 | |
|      * @brief Set packets TCP sequence number
 | |
|      *
 | |
|      * @param seq_num
 | |
|      */
 | |
|     inline static void set_seq_num(rte_tcp_hdr* tcp_hdr, uint32_t seq_num) {
 | |
|         tcp_hdr->sent_seq = rte_cpu_to_be_32(seq_num);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @brief Set packets TCP acknowledgment number
 | |
|      *
 | |
|      * @param ack_num
 | |
|      */
 | |
|     inline static void set_ack_num(rte_tcp_hdr* tcp_hdr, uint32_t ack_num) {
 | |
|         tcp_hdr->recv_ack = rte_cpu_to_be_32(ack_num);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @brief Get packets TCP destination port
 | |
|      *
 | |
|      * @return uint16_t
 | |
|      */
 | |
|     inline static uint16_t get_dst_port(rte_tcp_hdr* tcp_hdr) {
 | |
|         return rte_be_to_cpu_16(tcp_hdr->dst_port);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @brief Get packets TCP source port
 | |
|      *
 | |
|      * @return uint16_t
 | |
|      */
 | |
|     inline static uint16_t get_src_port(rte_tcp_hdr* tcp_hdr) {
 | |
|         return rte_be_to_cpu_16(tcp_hdr->src_port);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @brief Get packets TCP flags
 | |
|      * MSB is CWR flag, LSB is FIN flag, NS flag not included
 | |
|      * @return uint8_t
 | |
|      */
 | |
|     inline static uint8_t get_flags(rte_tcp_hdr* tcp_hdr) {
 | |
|         return tcp_hdr->tcp_flags; // these are FIN to CWR flag, but i am not
 | |
|                                    // shure in which order
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @brief Get packets TCP window size
 | |
|      *
 | |
|      * @return uint16_t
 | |
|      */
 | |
|     inline static uint16_t get_window_size(rte_tcp_hdr* tcp_hdr) {
 | |
|         return rte_be_to_cpu_16(tcp_hdr->rx_win);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @brief Get packets TCP sequence number
 | |
|      *
 | |
|      * @return uint32_t
 | |
|      */
 | |
|     inline static uint32_t get_seq_num(rte_tcp_hdr* tcp_hdr) {
 | |
|         return rte_be_to_cpu_32(tcp_hdr->sent_seq);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @brief Get packets TCP acknowledgment number
 | |
|      *
 | |
|      * @return uint32_t
 | |
|      */
 | |
|     inline static uint32_t get_ack_num(rte_tcp_hdr* tcp_hdr) {
 | |
|         return rte_be_to_cpu_32(tcp_hdr->recv_ack);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @brief Get packets TCP-header length
 | |
|      *
 | |
|      * @return uint16_t
 | |
|      */
 | |
|     inline static uint16_t get_tcp_hdr_len(rte_tcp_hdr* tcp_hdr) {
 | |
|         return (tcp_hdr->data_off & FIRST_4_BIT) * 4;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @brief Get packets TCP SYN flag
 | |
|      *
 | |
|      * @return true if flag is set
 | |
|      * @return false if flag is not set
 | |
|      */
 | |
|     inline static bool get_syn_flag(rte_tcp_hdr* tcp_hdr) {
 | |
|         if ((tcp_hdr->tcp_flags & SYN_FLAG_POS) == SYN_FLAG_POS) {
 | |
|             return true;
 | |
|         } else {
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @brief Get packets TCP ACK flag
 | |
|      *
 | |
|      * @return true if flag is set
 | |
|      * @return false if flag is not set
 | |
|      */
 | |
|     inline static bool get_ack_flag(rte_tcp_hdr* tcp_hdr) {
 | |
|         if ((tcp_hdr->tcp_flags & ACK_FLAG_POS) == ACK_FLAG_POS) {
 | |
|             return true;
 | |
|         } else {
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @brief Get packets TCP RST flag
 | |
|      *
 | |
|      * @return true if flag is set
 | |
|      * @return false if flag is not set
 | |
|      */
 | |
|     inline static bool get_rst_flag(rte_tcp_hdr* tcp_hdr) {
 | |
|         if ((tcp_hdr->tcp_flags & RST_FLAG_POS) == RST_FLAG_POS) {
 | |
|             return true;
 | |
|         } else {
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @brief Get packets TCP FIN flag
 | |
|      *
 | |
|      * @return true if flag is set
 | |
|      * @return false if flag is not set
 | |
|      */
 | |
|     inline static bool get_fin_flag(rte_tcp_hdr* tcp_hdr) {
 | |
|         if ((tcp_hdr->tcp_flags & FIN_FLAG_POS) == FIN_FLAG_POS) {
 | |
|             return true;
 | |
|         } else {
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @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_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 reci#include <rte_ip.h>eved 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 rx_win TCP recive side window
 | |
|      */
 | |
| 
 | |
|     inline static void
 | |
|     fill_payloadless_tcp_header(rte_tcp_hdr* tcp_hdr, rte_mbuf* mbuf,
 | |
|                                 uint16_t src_port, uint16_t dst_port,
 | |
|                                 uint32_t seq_num, uint32_t ack_num,
 | |
|                                 uint8_t flags, uint16_t rx_win) {
 | |
| 
 | |
|         tcp_hdr->src_port = rte_cpu_to_be_16(src_port);
 | |
|         tcp_hdr->dst_port = rte_cpu_to_be_16(dst_port);
 | |
|         tcp_hdr->sent_seq = rte_cpu_to_be_32(seq_num);
 | |
|         tcp_hdr->recv_ack = rte_cpu_to_be_32(ack_num);
 | |
|         tcp_hdr->data_off = TCP_HDR_SIZE_4BYTE_WORD;
 | |
|         tcp_hdr->tcp_flags = flags;
 | |
|         tcp_hdr->rx_win = rte_cpu_to_be_16(rx_win);
 | |
|         tcp_hdr->tcp_urp = 0;
 | |
|         tcp_hdr->cksum = 0;
 | |
|     }
 | |
| 
 | |
|     inline static void fill_tcp_cksm(rte_tcp_hdr* tcp_hdr, uint16_t cksm) {
 | |
|         tcp_hdr->cksum = rte_cpu_to_be_16(cksm);
 | |
|     }
 | |
| }; |