ROHC compression/decompression library
|
IP-agnostic packet. More...
#include "protocols/ipv4.h"
#include "protocols/ipv6.h"
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
Go to the source code of this file.
Data Structures | |
struct | net_hdr |
struct | ip_packet |
Defines an IP-agnostic packet that can handle an IPv4 or IPv6 packet. More... | |
Enumerations | |
enum | ip_header_pos_t { ROHC_IP_HDR_NONE = 0, ROHC_IP_HDR_FIRST = 1, ROHC_IP_HDR_SECOND = 2 } |
enum | ip_version { IPV4 = 4, IPV6 = 6, IP_UNKNOWN = 0, IPV4_MALFORMED = 1, IPV6_MALFORMED = 2 } |
IP version. More... | |
Functions | |
static uint16_t | swab16 (const uint16_t value) |
In-place change the byte order in a two-byte value. More... | |
static uint16_t | from32to16 (const uint32_t x) |
static uint16_t | ip_fast_csum (const uint8_t *const iph, const size_t ihl) |
void | ip_create (struct ip_packet *const ip, const uint8_t *const packet, const size_t size) |
Create an IP packet from raw data. More... | |
void | ip_get_inner_packet (const struct ip_packet *const outer, struct ip_packet *const inner) |
Get the inner IP packet (IP in IP) More... | |
const uint8_t * | ip_get_raw_data (const struct ip_packet *const ip) |
Get the IP raw data (header + payload) More... | |
uint8_t * | ip_get_next_header (const struct ip_packet *const ip, uint8_t *const type) |
Get the IP next header. More... | |
uint8_t * | ip_get_next_layer (const struct ip_packet *const ip) |
Get the next header (but skip IP extensions) More... | |
uint8_t * | ip_get_next_ext_from_ip (const struct ip_packet *const ip, uint8_t *const type) |
Get the next extension header of IPv6 packets from an IPv6 header. More... | |
uint8_t * | ip_get_next_ext_from_ext (const uint8_t *const ext, uint8_t *const type) |
Get the next extension header of IPv6 packets from another extension. More... | |
unsigned int | ip_get_totlen (const struct ip_packet *const ip) |
Get the total length of an IP packet. More... | |
unsigned int | ip_get_hdrlen (const struct ip_packet *const ip) |
Get the length of an IP header. More... | |
bool | ip_is_fragment (const struct ip_packet *const ip) |
Whether the IP packet is an IP fragment or not. More... | |
static ip_version | ip_get_version (const struct ip_packet *const ip) |
Get the IP version of an IP packet. More... | |
uint8_t | ip_get_protocol (const struct ip_packet *const ip) |
Get the protocol transported by an IP packet. More... | |
unsigned int | ip_get_tos (const struct ip_packet *const ip) |
Get the IPv4 Type Of Service (TOS) or IPv6 Traffic Class (TC) of an IP packet. More... | |
unsigned int | ip_get_ttl (const struct ip_packet *const ip) |
Get the IPv4 Time To Live (TTL) or IPv6 Hop Limit (HL) of an IP packet. More... | |
void | ip_set_version (struct ip_packet *const ip, const ip_version value) |
Set the IP version of an IP packet. More... | |
void | ip_set_protocol (struct ip_packet *const ip, const uint8_t value) |
Set the protocol transported by an IP packet. More... | |
void | ip_set_tos (struct ip_packet *const ip, const uint8_t value) |
Set the IPv4 Type Of Service (TOS) or IPv6 Traffic Class (TC) of an IP packet. More... | |
void | ip_set_ttl (struct ip_packet *const ip, const uint8_t value) |
Set the IPv4 Time To Live (TTL) or IPv6 Hop Limit (HL) of an IP packet. More... | |
void | ip_set_saddr (struct ip_packet *const ip, const uint8_t *value) |
Set the Source Address of an IP packet. More... | |
void | ip_set_daddr (struct ip_packet *const ip, const uint8_t *value) |
Set the Destination Address of an IP packet. More... | |
static size_t | ipv4_get_hdrlen (const struct ip_packet *const ip) |
const struct ipv4_hdr * | ipv4_get_header (const struct ip_packet *const ip) |
Get the IPv4 header. More... | |
uint16_t | ipv4_get_id (const struct ip_packet *const ip) |
Get the IP-ID of an IPv4 packet. More... | |
uint16_t | ipv4_get_id_nbo (const struct ip_packet *const ip, const unsigned int nbo) |
Get the IP-ID of an IPv4 packet in Network Byte Order. More... | |
int | ipv4_get_df (const struct ip_packet *const ip) |
Get the Don't Fragment (DF) bit of an IPv4 packet. More... | |
uint32_t | ipv4_get_saddr (const struct ip_packet *const ip) |
Get the source address of an IPv4 packet. More... | |
uint32_t | ipv4_get_daddr (const struct ip_packet *const ip) |
Get the destination address of an IPv4 packet. More... | |
void | ipv4_set_id (struct ip_packet *const ip, const int value) |
Set the IP-ID of an IPv4 packet. More... | |
void | ipv4_set_df (struct ip_packet *const ip, const int value) |
Set the Don't Fragment (DF) bit of an IPv4 packet. More... | |
static size_t | ipv6_get_hdrlen (const struct ip_packet *const ip) |
const struct ipv6_hdr * | ipv6_get_header (const struct ip_packet *const ip) |
Get the IPv6 header. More... | |
uint32_t | ip_get_flow_label (const struct ip_packet *const ip) |
Get the flow label of an IPv6 packet. More... | |
const struct ipv6_addr * | ipv6_get_saddr (const struct ip_packet *const ip) |
Get the source address of an IPv6 packet. More... | |
const struct ipv6_addr * | ipv6_get_daddr (const struct ip_packet *const ip) |
Get the destination address of an IPv6 packet. More... | |
void | ip_set_flow_label (struct ip_packet *const ip, const uint32_t value) |
Set the flow label of an IPv6 packet. More... | |
unsigned short | ip_get_extension_size (const uint8_t *const ext) |
Get the size of an IPv6 extension. More... | |
unsigned short | ip_get_total_extension_size (const struct ip_packet *const ip) |
Get the size of the extension list. More... | |
IP-agnostic packet.
enum ip_header_pos_t |
enum ip_version |
|
inlinestatic |
void ip_create | ( | struct ip_packet *const | ip, |
const uint8_t *const | packet, | ||
const size_t | size | ||
) |
Create an IP packet from raw data.
ip | OUT: The IP packet to create |
packet | The IP packet data |
size | The length of the IP packet data |
|
inlinestatic |
This is a version of ip_compute_csum() optimized for IP headers, which always checksum on 4 octet boundaries.
unsigned short ip_get_extension_size | ( | const uint8_t *const | ext | ) |
Get the size of an IPv6 extension.
ext | The extension |
uint32_t ip_get_flow_label | ( | const struct ip_packet *const | ip | ) |
Get the flow label of an IPv6 packet.
The function does not handle ip_packet whose ip_packet::version is not IPV6.
ip | The IPv6 packet to analyze |
unsigned int ip_get_hdrlen | ( | const struct ip_packet *const | ip | ) |
Get the length of an IP header.
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to analyze |
Get the inner IP packet (IP in IP)
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
outer | The outer IP packet to analyze |
inner | The inner IP packet to create |
uint8_t* ip_get_next_ext_from_ext | ( | const uint8_t *const | ext, |
uint8_t *const | type | ||
) |
Get the next extension header of IPv6 packets from another extension.
ext | The extension to analyse |
type | OUT: The type of the next header If there is no next header the value must be ignored |
uint8_t* ip_get_next_ext_from_ip | ( | const struct ip_packet *const | ip, |
uint8_t *const | type | ||
) |
Get the next extension header of IPv6 packets from an IPv6 header.
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to analyze |
type | OUT: The type of the next header If there is no next header the value must be ignored |
uint8_t* ip_get_next_header | ( | const struct ip_packet *const | ip, |
uint8_t *const | type | ||
) |
Get the IP next header.
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to analyze |
type | OUT: The type of the next header |
uint8_t* ip_get_next_layer | ( | const struct ip_packet *const | ip | ) |
Get the next header (but skip IP extensions)
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to analyze |
uint8_t ip_get_protocol | ( | const struct ip_packet *const | ip | ) |
Get the protocol transported by an IP packet.
The protocol returned is the one transported by the last known IP extension header if any is found.
The function handles ip_packet whose ip_packet::version is IP_UNKNOWN. It always returns the special value 0.
ip | The IP packet to analyze |
const uint8_t* ip_get_raw_data | ( | const struct ip_packet *const | ip | ) |
Get the IP raw data (header + payload)
The function handles ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to analyze |
unsigned int ip_get_tos | ( | const struct ip_packet *const | ip | ) |
Get the IPv4 Type Of Service (TOS) or IPv6 Traffic Class (TC) of an IP packet.
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to analyze |
unsigned short ip_get_total_extension_size | ( | const struct ip_packet *const | ip | ) |
Get the size of the extension list.
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The packet to analyse |
unsigned int ip_get_totlen | ( | const struct ip_packet *const | ip | ) |
Get the total length of an IP packet.
The function handles ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to analyze |
unsigned int ip_get_ttl | ( | const struct ip_packet *const | ip | ) |
Get the IPv4 Time To Live (TTL) or IPv6 Hop Limit (HL) of an IP packet.
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to analyze |
|
inlinestatic |
Get the IP version of an IP packet.
The function handles ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to analyze |
bool ip_is_fragment | ( | const struct ip_packet *const | ip | ) |
Whether the IP packet is an IP fragment or not.
The IP packet is a fragment if the MF (More Fragments) bit is set or the Fragment Offset field is non-zero.
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to analyze |
void ip_set_daddr | ( | struct ip_packet *const | ip, |
const uint8_t * | value | ||
) |
Set the Destination Address of an IP packet.
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to modify |
value | The IP address value |
void ip_set_flow_label | ( | struct ip_packet *const | ip, |
const uint32_t | value | ||
) |
Set the flow label of an IPv6 packet.
The function does not handle ip_packet whose ip_packet::version is not IPV6.
ip | The IPv6 packet to modify |
value | The flow label value |
void ip_set_protocol | ( | struct ip_packet *const | ip, |
const uint8_t | value | ||
) |
Set the protocol transported by an IP packet.
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to modify |
value | The protocol value |
void ip_set_saddr | ( | struct ip_packet *const | ip, |
const uint8_t * | value | ||
) |
Set the Source Address of an IP packet.
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to modify |
value | The IP address value |
void ip_set_tos | ( | struct ip_packet *const | ip, |
const uint8_t | value | ||
) |
Set the IPv4 Type Of Service (TOS) or IPv6 Traffic Class (TC) of an IP packet.
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to modify |
value | The TOS/TC value |
void ip_set_ttl | ( | struct ip_packet *const | ip, |
const uint8_t | value | ||
) |
Set the IPv4 Time To Live (TTL) or IPv6 Hop Limit (HL) of an IP packet.
The function does not handle ip_packet whose ip_packet::version is IP_UNKNOWN.
ip | The IP packet to modify |
value | The TTL/HL value |
void ip_set_version | ( | struct ip_packet *const | ip, |
const ip_version | value | ||
) |
Set the IP version of an IP packet.
ip | The IP packet to modify |
value | The version value |
uint32_t ipv4_get_daddr | ( | const struct ip_packet *const | ip | ) |
Get the destination address of an IPv4 packet.
The function does not handle ip_packet whose ip_packet::version is not IPV4.
ip | The IPv4 packet to analyze |
int ipv4_get_df | ( | const struct ip_packet *const | ip | ) |
Get the Don't Fragment (DF) bit of an IPv4 packet.
The function does not handle ip_packet whose ip_packet::version is not IPV4.
ip | The IP packet to analyze |
|
inlinestatic |
Get the IPv4 header.
The function does not handle ip_packet whose ip_packet::version is not IPV4.
ip | The IP packet to analyze |
uint16_t ipv4_get_id | ( | const struct ip_packet *const | ip | ) |
Get the IP-ID of an IPv4 packet.
The IP-ID value is returned as-is (ie. not automatically converted to the host byte order).
The function does not handle ip_packet whose ip_packet::version is not IPV4.
ip | The IP packet to analyze |
uint16_t ipv4_get_id_nbo | ( | const struct ip_packet *const | ip, |
const unsigned int | nbo | ||
) |
Get the IP-ID of an IPv4 packet in Network Byte Order.
The function does not handle ip_packet whose ip_packet::version is not IPV4.
ip | The IP packet to analyze |
nbo | The NBO flag (if RND = 1, use NBO = 1) |
uint32_t ipv4_get_saddr | ( | const struct ip_packet *const | ip | ) |
Get the source address of an IPv4 packet.
The function does not handle ip_packet whose ip_packet::version is not IPV4.
ip | The IPv4 packet to analyze |
void ipv4_set_df | ( | struct ip_packet *const | ip, |
const int | value | ||
) |
Set the Don't Fragment (DF) bit of an IPv4 packet.
The function does not handle ip_packet whose ip_packet::version is not IPV4.
ip | The IP packet to modify |
value | The value of the DF bit |
void ipv4_set_id | ( | struct ip_packet *const | ip, |
const int | value | ||
) |
Set the IP-ID of an IPv4 packet.
The IP-ID value is set as-is (ie. not automatically converted to the host byte order).
The function does not handle ip_packet whose ip_packet::version is not IPV4.
ip | The IP packet to modify |
value | The IP-ID value |
Get the destination address of an IPv6 packet.
The function does not handle ip_packet whose ip_packet::version is not IPV6.
ip | The IPv6 packet to analyze |
|
inlinestatic |
Get the IPv6 header.
The function does not handle ip_packet whose ip_packet::version is not IPV6.
ip | The IP packet to analyze |
Get the source address of an IPv6 packet.
The function does not handle ip_packet whose ip_packet::version is not IPV6.
ip | The IPv6 packet to analyze |
|
inlinestatic |
In-place change the byte order in a two-byte value.
value | The two-byte value to modify |