135 lines
3.6 KiB
C++
135 lines
3.6 KiB
C++
/**
|
|
* @file PacketInfoIpv4.hpp
|
|
* @author Tobias
|
|
* @brief class which provides IPv4 header information
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <boost/log/trivial.hpp>
|
|
|
|
#include <rte_byteorder.h>
|
|
#include <rte_ip.h>
|
|
#include <rte_mbuf.h>
|
|
|
|
#include "Definitions.hpp"
|
|
#include "PacketDissection/PacketInfo.hpp"
|
|
|
|
#define IP_HDR_LEN 20
|
|
#define VERSION_AND_IP_HDR_LEN 0b01000101
|
|
|
|
class PacketInfoIpv4 : public PacketInfo {
|
|
public:
|
|
PacketInfoIpv4();
|
|
inline PacketInfoIpv4(rte_mbuf* const mbuf, rte_ether_hdr* const eth_hdr,
|
|
rte_ipv4_hdr* const ip_hdr)
|
|
: PacketInfo(IPv4, mbuf, eth_hdr), _ip4_hdr(ip_hdr) {}
|
|
inline ~PacketInfoIpv4() {
|
|
// PacketInfo::~PacketInfo();
|
|
}
|
|
|
|
/**
|
|
* @brief Get packets destination IP address
|
|
*
|
|
* @return uint32_t
|
|
*/
|
|
inline uint32_t get_dst_ip() {
|
|
return rte_be_to_cpu_32(_ip4_hdr->dst_addr);
|
|
}
|
|
|
|
/**
|
|
* @brief Get packets source IP address
|
|
*
|
|
* @return uint32_t
|
|
*/
|
|
inline uint32_t get_src_ip() {
|
|
return rte_be_to_cpu_32(_ip4_hdr->src_addr);
|
|
}
|
|
|
|
/**
|
|
* @brief Set packets source IP address
|
|
*
|
|
* @param ip
|
|
*/
|
|
inline void set_src_ip(uint32_t ip) {
|
|
_ip4_hdr->src_addr = rte_cpu_to_be_32(ip);
|
|
}
|
|
|
|
/**
|
|
* @brief Get packets size in byte
|
|
*
|
|
* @return uint16_t
|
|
*/
|
|
inline uint16_t get_packet_size() {
|
|
return rte_be_to_cpu_16(_ip4_hdr->total_length);
|
|
}
|
|
|
|
/**
|
|
* @brief Get the ip header struct
|
|
*
|
|
* @return rte_ipv4_hdr*
|
|
*/
|
|
inline rte_ipv4_hdr* const get_ip_hdr() { return _ip4_hdr; }
|
|
|
|
void set_ip_cksm(uint16_t cksm);
|
|
|
|
protected:
|
|
inline PacketInfoIpv4(PacketType const type, rte_mbuf* const mbuf,
|
|
rte_ether_hdr* const eth_hdr,
|
|
rte_ipv4_hdr* const ip_hdr)
|
|
: PacketInfo(type, mbuf, eth_hdr), _ip4_hdr(ip_hdr) {}
|
|
|
|
inline PacketInfoIpv4(PacketType const type, rte_mbuf* const mbuf,
|
|
rte_ipv4_hdr* const ip_hdr)
|
|
: PacketInfo(type, mbuf), _ip4_hdr(ip_hdr) {}
|
|
|
|
/**
|
|
* @brief fills this packets IPv4 header with neseceties
|
|
*
|
|
* @param src_ip IP from which packet was originally send from
|
|
* @param dst_ip IP packet is send to
|
|
* @param proto protocol whose header follows after Ip-header
|
|
* @param payload_len packets number of bytes without IP-header
|
|
*/
|
|
inline void fill_ip_hdr(uint32_t src_ip, uint32_t dst_ip, uint8_t proto,
|
|
uint16_t payload_len) {
|
|
|
|
_ip4_hdr->src_addr = rte_cpu_to_be_32(src_ip);
|
|
_ip4_hdr->dst_addr = rte_cpu_to_be_32(dst_ip);
|
|
|
|
_ip4_hdr->version_ihl = VERSION_AND_IP_HDR_LEN;
|
|
_ip4_hdr->type_of_service = 0;
|
|
_ip4_hdr->total_length = rte_be_to_cpu_16(payload_len + IP_HDR_LEN);
|
|
_ip4_hdr->packet_id = 0;
|
|
_ip4_hdr->fragment_offset = 0;
|
|
_ip4_hdr->time_to_live = 128;
|
|
_ip4_hdr->next_proto_id = proto;
|
|
_ip4_hdr->hdr_checksum = 0;
|
|
}
|
|
|
|
inline void recalculate_ip_checksum() {
|
|
_ip4_hdr->hdr_checksum = rte_ipv4_cksum(_ip4_hdr);
|
|
}
|
|
|
|
/**
|
|
* @brief Get IP pseudo header checksum
|
|
*
|
|
* @return uint16_t IP pseudo header checksum
|
|
*/
|
|
inline uint16_t get_pseudo_hdr_cksm() {
|
|
rte_mbuf* mbuf = get_mbuf();
|
|
mbuf->l2_len = sizeof(struct rte_ether_hdr);
|
|
mbuf->l3_len = sizeof(struct rte_ipv4_hdr);
|
|
return rte_ipv4_phdr_cksum(_ip4_hdr, mbuf->ol_flags);
|
|
}
|
|
|
|
inline uint8_t get_ip_hdr_len() {
|
|
uint8_t len = _ip4_hdr->version_ihl & 0b00001111;
|
|
len = len * 4;
|
|
return len;
|
|
}
|
|
|
|
private:
|
|
rte_ipv4_hdr* const _ip4_hdr;
|
|
}; |