00001
00002
00003
00004
00005
00006
00007
00008 #ifndef IP_H
00009 #define IP_H
00010
00011
00012 #define IP_V4 4
00013
00014 #define IP_V6 6
00015
00016
00017 #define IP_FRAME_LEN 65535
00018
00019 #define IP_HEAD_MIN_LEN 20
00020
00021 #define IP_DEFAULT_TTL 64
00022
00023
00024 #define IPPROTO_ICMP 1
00025
00026 #define IPPROTO_IGMP 2
00027
00028 #define IPPROTO_TCP 6
00029
00030 #define IPPROTO_UDP 17
00031
00032
00033 #define IP_TOS_MIN_DELAY 0x10
00034
00035 #define IP_TOS_MAX_THRU 0x08
00036
00037 #define IP_TOS_MAX_RELY 0x04
00038
00039 #define IP_TOS_MIN_COST 0x02
00040
00041
00042
00043 #define IP_FLAG_MF 0x2000
00044
00045 #define IP_FLAG_DF 0x4000
00046
00047 #define IP_FLAG_CE 0x8000
00048
00049 #define IP_FLAG_MASK 0x1FFF
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #define IP_ADDRESS(a, b, c, d) ((a) | (b) << 8 | (c) << 16 | (d) << 24)
00060
00061 #define IP_A(ip) ((uint8_t) ((ip) >> 24))
00062
00063 #define IP_B(ip) ((uint8_t) ((ip) >> 16))
00064
00065 #define IP_C(ip) ((uint8_t) ((ip) >> 8))
00066
00067 #define IP_D(ip) ((uint8_t) ((ip) >> 0))
00068
00069
00070 #define INADDR_LOOPBACK IP_ADDRESS(127, 0, 0, 1)
00071
00072 #define INADDR_ANY IP_ADDRESS(0, 0, 0, 0)
00073
00074 #define INADDR_BROADCAST IP_ADDRESS(255, 255, 255, 255)
00075
00076
00077 typedef uint32_t in_addr_t;
00078
00079
00080 typedef struct ip
00081 {
00082 #if __BYTE_ORDER__ == __LITTLE_ENDIAN__
00083 uint8_t ip_hdr_len:4;
00084 uint8_t ip_version:4;
00085 #else
00086 uint8_t ip_version:4;
00087 uint8_t ip_hdr_len:4;
00088 #endif
00089
00090 uint8_t ip_tos;
00091
00092 uint16_t ip_len;
00093
00094
00095 uint16_t ip_id;
00096
00097 uint16_t ip_off;
00098
00099
00100 uint8_t ip_ttl;
00101
00102 uint8_t ip_proto;
00103
00104 uint16_t ip_chk;
00105
00106
00107 uint32_t ip_src;
00108
00109 uint32_t ip_dst;
00110 } __attribute__ ((packed)) ip_t;
00111
00112
00113
00114 uint16_t ip_checksum(const void *buf, size_t hdr_len);
00115 void set_host_ip_net(in_addr_t ip, in_addr_t netmask);
00116 in_addr_t get_host_ip();
00117 in_addr_t get_host_netmask();
00118 in_addr_t get_host_bcast();
00119 void to_ip_layer(ip_t *packet);
00120 int inet_aton(const char *cp, in_addr_t *inp);
00121 int send_ip_packet(uint32_t ip_to, const void *data, size_t len, uint8_t ttl, uint8_t proto);
00122
00123
00124
00125 #endif