#ifndef _TCP_HELPERS_H #define _TCP_HELPERS_H #ifdef __cpluscplus extern "C" { #endif #include #define __FAVOR_BSD 1 #include /* * TCP 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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Source Port | Destination Port | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Sequence Number | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Acknowledgment Number | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Data | |U|A|P|R|S|F| | * | Offset| Reserved |R|C|S|S|Y|I| Window | * | | |G|K|H|T|N|N| | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Checksum | Urgent Pointer | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Options | Padding | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | data | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ static inline uint16_t tcp_hdr_get_host_order_sport(const struct tcphdr *hdr) { return ntohs(hdr->th_sport); } static inline uint16_t tcp_hdr_get_host_order_dport(const struct tcphdr *hdr) { return ntohs(hdr->th_dport); } static inline uint16_t tcp_hdr_get_net_order_sport(const struct tcphdr *hdr) { return hdr->th_sport; } static inline uint16_t tcp_hdr_get_net_order_dport(const struct tcphdr *hdr) { return hdr->th_dport; } static inline uint32_t tcp_hdr_get_seq(const struct tcphdr *hdr) { return ntohl(hdr->th_seq); } static inline uint32_t tcp_hdr_get_ack(const struct tcphdr *hdr) { return ntohl(hdr->th_ack); } static inline uint8_t tcp_hdr_get_doff(const struct tcphdr *hdr) { return hdr->th_off << 2; } static inline uint8_t tcp_hdr_get_flags(const struct tcphdr *hdr) { return hdr->th_flags; } static inline bool tcp_hdr_has_flag_urg(const struct tcphdr *hdr) { return hdr->th_flags & TH_URG; } static inline bool tcp_hdr_has_flag_ack(const struct tcphdr *hdr) { return hdr->th_flags & TH_ACK; } static inline bool tcp_hdr_has_flag_psh(const struct tcphdr *hdr) { return hdr->th_flags & TH_PUSH; } static inline bool tcp_hdr_has_flag_rst(const struct tcphdr *hdr) { return hdr->th_flags & TH_RST; } static inline bool tcp_hdr_has_flag_syn(const struct tcphdr *hdr) { return hdr->th_flags & TH_SYN; } static inline bool tcp_hdr_has_flag_fin(const struct tcphdr *hdr) { return hdr->th_flags & TH_FIN; } static inline uint16_t tcp_hdr_get_window(const struct tcphdr *hdr) { return ntohs(hdr->th_win); } static inline uint16_t tcp_hdr_get_checksum(const struct tcphdr *hdr) { return ntohs(hdr->th_sum); } static inline uint16_t tcp_hdr_get_urg_ptr(const struct tcphdr *hdr) { return ntohs(hdr->th_urp); } static inline uint16_t tcp_hdr_get_opt_len(const struct tcphdr *hdr) { return tcp_hdr_get_doff(hdr) - sizeof(struct tcphdr); } static inline const uint8_t *tcp_hdr_get_opt_ptr(const struct tcphdr *hdr) { return ((const uint8_t *)hdr) + sizeof(struct tcphdr); } static inline void tcp_hdr_set_flags(struct tcphdr *hdr, uint8_t flags) { hdr->th_flags = flags; } static inline void tcp_hdr_set_flag_rst(struct tcphdr *hdr) { hdr->th_flags |= TH_RST; } #ifdef __cpluscplus } #endif #endif