mirror of
https://github.com/telekom-security/tpotce.git
synced 2025-04-19 21:52:27 +00:00
142 lines
4.4 KiB
C
142 lines
4.4 KiB
C
![]() |
/*
|
||
|
p0f - portable IP and TCP headers
|
||
|
---------------------------------
|
||
|
|
||
|
Note that all multi-byte fields are in network (i.e., big) endian, and may
|
||
|
need to be converted before use.
|
||
|
|
||
|
Copyright (C) 2012 by Michal Zalewski <lcamtuf@coredump.cx>
|
||
|
|
||
|
Distributed under the terms and conditions of GNU LGPL.
|
||
|
|
||
|
*/
|
||
|
|
||
|
#ifndef _HAVE_TCP_H
|
||
|
#define _HAVE_TCP_H
|
||
|
|
||
|
#include "types.h"
|
||
|
|
||
|
/*************
|
||
|
* IP common *
|
||
|
*************/
|
||
|
|
||
|
/* Protocol versions: */
|
||
|
|
||
|
#define IP_VER4 0x04
|
||
|
#define IP_VER6 0x06
|
||
|
|
||
|
/* IP-level ECN: */
|
||
|
|
||
|
#define IP_TOS_CE 0x01 /* Congestion encountered */
|
||
|
#define IP_TOS_ECT 0x02 /* ECN supported */
|
||
|
|
||
|
/* Encapsulated protocols we care about: */
|
||
|
|
||
|
#define PROTO_TCP 0x06
|
||
|
|
||
|
|
||
|
/********
|
||
|
* IPv4 *
|
||
|
********/
|
||
|
|
||
|
struct ipv4_hdr {
|
||
|
|
||
|
u8 ver_hlen; /* IP version (4), IP hdr len in dwords (4) */
|
||
|
u8 tos_ecn; /* ToS field (6), ECN flags (2) */
|
||
|
u16 tot_len; /* Total packet length, in bytes */
|
||
|
u16 id; /* IP ID */
|
||
|
u16 flags_off; /* Flags (3), fragment offset (13) */
|
||
|
u8 ttl; /* Time to live */
|
||
|
u8 proto; /* Next protocol */
|
||
|
u16 cksum; /* Header checksum */
|
||
|
u8 src[4]; /* Source IP */
|
||
|
u8 dst[4]; /* Destination IP */
|
||
|
|
||
|
/* Dword-aligned options may follow. */
|
||
|
|
||
|
} __attribute__((packed));
|
||
|
|
||
|
/* IP flags: */
|
||
|
|
||
|
#define IP4_MBZ 0x8000 /* "Must be zero" */
|
||
|
#define IP4_DF 0x4000 /* Don't fragment (usually PMTUD) */
|
||
|
#define IP4_MF 0x2000 /* More fragments coming */
|
||
|
|
||
|
|
||
|
/********
|
||
|
* IPv6 *
|
||
|
********/
|
||
|
|
||
|
struct ipv6_hdr {
|
||
|
|
||
|
u32 ver_tos; /* Version (4), ToS (6), ECN (2), flow (20) */
|
||
|
u16 pay_len; /* Total payload length, in bytes */
|
||
|
u8 proto; /* Next protocol */
|
||
|
u8 ttl; /* Time to live */
|
||
|
u8 src[16]; /* Source IP */
|
||
|
u8 dst[16]; /* Destination IP */
|
||
|
|
||
|
/* Dword-aligned options may follow if proto != PROTO_TCP and are
|
||
|
included in total_length; but we won't be seeing such traffic due
|
||
|
to BPF rules. */
|
||
|
|
||
|
} __attribute__((packed));
|
||
|
|
||
|
|
||
|
|
||
|
/*******
|
||
|
* TCP *
|
||
|
*******/
|
||
|
|
||
|
struct tcp_hdr {
|
||
|
|
||
|
u16 sport; /* Source port */
|
||
|
u16 dport; /* Destination port */
|
||
|
u32 seq; /* Sequence number */
|
||
|
u32 ack; /* Acknowledgment number */
|
||
|
u8 doff_rsvd; /* Data off dwords (4), rsvd (3), ECN (1) */
|
||
|
u8 flags; /* Flags, including ECN */
|
||
|
u16 win; /* Window size */
|
||
|
u16 cksum; /* Header and payload checksum */
|
||
|
u16 urg; /* "Urgent" pointer */
|
||
|
|
||
|
/* Dword-aligned options may follow. */
|
||
|
|
||
|
} __attribute__((packed));
|
||
|
|
||
|
|
||
|
/* Normal flags: */
|
||
|
|
||
|
#define TCP_FIN 0x01
|
||
|
#define TCP_SYN 0x02
|
||
|
#define TCP_RST 0x04
|
||
|
#define TCP_PUSH 0x08
|
||
|
#define TCP_ACK 0x10
|
||
|
#define TCP_URG 0x20
|
||
|
|
||
|
/* ECN stuff: */
|
||
|
|
||
|
#define TCP_ECE 0x40 /* ECN supported (SYN) or detected */
|
||
|
#define TCP_CWR 0x80 /* ECE acknowledgment */
|
||
|
#define TCP_NS_RES 0x01 /* ECE notification via TCP */
|
||
|
|
||
|
/* Notable options: */
|
||
|
|
||
|
#define TCPOPT_EOL 0 /* End of options (1) */
|
||
|
#define TCPOPT_NOP 1 /* No-op (1) */
|
||
|
#define TCPOPT_MAXSEG 2 /* Maximum segment size (4) */
|
||
|
#define TCPOPT_WSCALE 3 /* Window scaling (3) */
|
||
|
#define TCPOPT_SACKOK 4 /* Selective ACK permitted (2) */
|
||
|
#define TCPOPT_SACK 5 /* Actual selective ACK (10-34) */
|
||
|
#define TCPOPT_TSTAMP 8 /* Timestamp (10) */
|
||
|
|
||
|
|
||
|
/***************
|
||
|
* Other stuff *
|
||
|
***************/
|
||
|
|
||
|
#define MIN_TCP4 (sizeof(struct ipv4_hdr) + sizeof(struct tcp_hdr))
|
||
|
#define MIN_TCP6 (sizeof(struct ipv6_hdr) + sizeof(struct tcp_hdr))
|
||
|
|
||
|
#endif /* !_HAVE_TCP_H */
|