#ifndef _TFE_PKT_UTIL_H #define _TFE_PKT_UTIL_H #ifdef __cpluscplus extern "C" { #endif enum addr_type_t { ADDR_TYPE_IPV4 = 1, ADDR_TYPE_IPV6 = 2, }; struct pkt_info { enum addr_type_t addr_type; union { struct iphdr *v4; struct ip6_hdr *v6; } iphdr; uint16_t iphdr_len; uint16_t ip_totlen; struct tcphdr *tcphdr; uint16_t tcphdr_len; char *data; uint16_t data_len; int parse_failed; }; // always success void tfe_pkt_parse_ipv4_header(const void *a_packet, struct pkt_info *pktinfo); // check pktinfo->parse_failed for status void tfe_pkt_parse_ipv6_header(const void *a_packet, struct pkt_info *pktinfo); uint16_t tfe_pkt_checksum_ip(const void *buf, size_t hdr_len); uint16_t tfe_pkt_checksum_tcp_v4(const void *buf, size_t len, in_addr_t src_addr, in_addr_t dest_addr); uint16_t tfe_pkt_checksum_tcp_v6(const void *buf, size_t len, struct in6_addr src_addr, struct in6_addr dest_addr); /* * 目的:在 IP 的 Payload ${data} 中查找指定的 tcp ${option}。 * * 已知: * 1.所有的 tcp options 所占的存储空间的长度为 ${optlen} * 2.${out_opt_buff} 输出缓冲区的最大长度为 ${out_opt_buff_size} * * 返回值: * 1.若找到指定的 tcp ${option} 则返回 1,并将该 tcp ${option} 对应的值拷贝到 ${out_opt_buff} 中,并将拷贝的值所占的存储空间记录到 ${out_optlen} 中 * 2.若未找到指定的 tcp ${option} 则返回 0 */ int tfe_pkt_find_tcp_option(uint8_t option, char *data, unsigned int opts_total_len, uint8_t *out_opt_len, char *out_opt_buff, unsigned int out_opt_buff_size); #ifdef __cpluscplus } #endif #endif