Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/net/include/ip_header.h

    r88a1bb9 r849ed54  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup ip
     30 *  @{
    3131 */
    3232
    3333/** @file
    34  * IP header and options definitions.
    35  * Based on the RFC 791.
    36  */
    37 
    38 #ifndef LIBNET_IP_HEADER_H_
    39 #define LIBNET_IP_HEADER_H_
     34 *  IP header and options definitions.
     35 *  Based on the RFC~791.
     36 */
     37
     38#ifndef __NET_IP_HEADER_H__
     39#define __NET_IP_HEADER_H__
    4040
    4141#include <byteorder.h>
     
    4343
    4444/** Returns the fragment offest high bits.
    45  * @param[in] length The prefixed data total length.
    46  */
    47 #define IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length) \
    48         ((((length) / 8U) & 0x1f00) >> 8)
     45 *  @param[in] length The prefixed data total length.
     46 */
     47#define IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length) ((((length) / 8u) &0x1F00) >> 8)
    4948
    5049/** Returns the fragment offest low bits.
    51  * @param[in] length The prefixed data total length.
    52  */
    53 #define IP_COMPUTE_FRAGMENT_OFFSET_LOW(length) \
    54         (((length) / 8U) & 0xff)
     50 *  @param[in] length The prefixed data total length.
     51 */
     52#define IP_COMPUTE_FRAGMENT_OFFSET_LOW(length) (((length) / 8u) &0xFF)
    5553
    5654/** Returns the IP header length.
    57  * @param[in] length The IP header length in bytes.
    58  */
    59 #define IP_COMPUTE_HEADER_LENGTH(length) \
    60         ((uint8_t) ((length) / 4U))
     55 *  @param[in] length The IP header length in bytes.
     56 */
     57#define IP_COMPUTE_HEADER_LENGTH(length)                ((uint8_t) ((length) / 4u))
    6158
    6259/** Returns the fragment offest.
    63  * @param[in] header The IP packet header.
    64  */
    65 #define IP_FRAGMENT_OFFSET(header) \
    66         ((((header)->fragment_offset_high << 8) + \
    67             (header)->fragment_offset_low) * 8U)
     60 *  @param[in] header The IP packet header.
     61 */
     62#define IP_FRAGMENT_OFFSET(header) ((((header)->fragment_offset_high << 8) + (header)->fragment_offset_low) * 8u)
    6863
    6964/** Returns the IP packet header checksum.
    7065 *  @param[in] header The IP packet header.
    7166 */
    72 #define IP_HEADER_CHECKSUM(header) \
    73         (htons(ip_checksum((uint8_t *) (header), IP_HEADER_LENGTH(header))))
     67#define IP_HEADER_CHECKSUM(header)      (htons(ip_checksum((uint8_t *)(header), IP_HEADER_LENGTH(header))))
    7468
    7569/** Returns the actual IP packet data length.
    76  * @param[in] header The IP packet header.
    77  */
    78 #define IP_HEADER_DATA_LENGTH(header) \
    79         (IP_TOTAL_LENGTH(header) - IP_HEADER_LENGTH(header))
     70 *  @param[in] header The IP packet header.
     71 */
     72#define IP_HEADER_DATA_LENGTH(header)   (IP_TOTAL_LENGTH(header) - IP_HEADER_LENGTH(header))
    8073
    8174/** Returns the actual IP header length in bytes.
    82  * @param[in] header The IP packet header.
    83  */
    84 #define IP_HEADER_LENGTH(header) \
    85         ((header)->header_length * 4U)
     75 *  @param[in] header The IP packet header.
     76 */
     77#define IP_HEADER_LENGTH(header)                ((header)->header_length * 4u)
    8678
    8779/** Returns the actual IP packet total length.
    88  * @param[in] header The IP packet header.
    89  */
    90 #define IP_TOTAL_LENGTH(header) \
    91         ntohs((header)->total_length)
    92 
    93 /** @name IP flags definitions */
     80 *  @param[in] header The IP packet header.
     81 */
     82#define IP_TOTAL_LENGTH(header)         ntohs((header)->total_length)
     83
     84/** @name IP flags definitions
     85 */
    9486/*@{*/
    9587
    96 /** Fragment flag field shift. */
    97 #define IPFLAG_FRAGMENT_SHIFT   1
    98 
    99 /** Fragmented flag field shift. */
    100 #define IPFLAG_FRAGMENTED_SHIFT 0
     88/** Fragment flag field shift.
     89 */
     90#define IPFLAG_FRAGMENT_SHIFT           1
     91
     92/** Fragmented flag field shift.
     93 */
     94#define IPFLAG_FRAGMENTED_SHIFT         0
    10195
    10296/** Don't fragment flag value.
    103  * Permits the packet fragmentation.
    104  */
    105 #define IPFLAG_DONT_FRAGMENT    (0x1 << IPFLAG_FRAGMENT_SHIFT)
     97 *  Permits the packet fragmentation.
     98 */
     99#define IPFLAG_DONT_FRAGMENT            (0x1 << IPFLAG_FRAGMENT_SHIFT)
    106100
    107101/** Last fragment flag value.
    108  * Indicates the last packet fragment.
    109  */
    110 #define IPFLAG_LAST_FRAGMENT    (0x0 << IPFLAG_FRAGMENTED_SHIFT)
     102 *  Indicates the last packet fragment.
     103 */
     104#define IPFLAG_LAST_FRAGMENT            (0x0 << IPFLAG_FRAGMENTED_SHIFT)
    111105
    112106/** May fragment flag value.
    113  * Allows the packet fragmentation.
    114  */
    115 #define IPFLAG_MAY_FRAGMENT     (0x0 << IPFLAG_FRAGMENT_SHIFT)
     107 *  Allows the packet fragmentation.
     108 */
     109#define IPFLAG_MAY_FRAGMENT                     (0x0 << IPFLAG_FRAGMENT_SHIFT)
    116110
    117111/** More fragments flag value.
    118  * Indicates that more packet fragments follow.
    119  */
    120 #define IPFLAG_MORE_FRAGMENTS   (0x1 << IPFLAG_FRAGMENTED_SHIFT)
     112 *  Indicates that more packet fragments follow.
     113 */
     114#define IPFLAG_MORE_FRAGMENTS           (0x1 << IPFLAG_FRAGMENTED_SHIFT)
    121115
    122116/*@}*/
    123117
    124118/** Type definition of the internet header.
    125  * @see ip_header
    126  */
    127 typedef struct ip_header ip_header_t;
     119 *  @see ip_header
     120 */
     121typedef struct ip_header        ip_header_t;
     122
     123/** Type definition of the internet header pointer.
     124 *  @see ip_header
     125 */
     126typedef ip_header_t *           ip_header_ref;
    128127
    129128/** Type definition of the internet option header.
    130  * @see ip_header
    131  */
    132 typedef struct ip_option ip_option_t;
     129 *  @see ip_header
     130 */
     131typedef struct ip_option        ip_option_t;
     132
     133/** Type definition of the internet option header pointer.
     134 *  @see ip_header
     135 */
     136typedef ip_option_t *           ip_option_ref;
    133137
    134138/** Type definition of the internet version 4 pseudo header.
    135  * @see ipv4_pseudo_header
    136  */
    137 typedef struct ipv4_pseudo_header ipv4_pseudo_header_t;
     139 *  @see ipv4_pseudo_header
     140 */
     141typedef struct ipv4_pseudo_header       ipv4_pseudo_header_t;
     142
     143/** Type definition of the internet version 4 pseudo header pointer.
     144 *  @see ipv4_pseudo_header
     145 */
     146typedef ipv4_pseudo_header_t *          ipv4_pseudo_header_ref;
    138147
    139148/** Internet header.
    140  *
    141  * The variable options should be included after the header itself and
    142  * indicated by the increased header length value.
    143  */
    144 struct ip_header {
     149 *  The variable options should be included after the header itself and indicated by the increased header length value.
     150 */
     151struct ip_header{
    145152#ifdef ARCH_IS_BIG_ENDIAN
    146         uint8_t version : 4;
    147         uint8_t header_length : 4;
     153        /** The Version field indicates the format of the internet header.
     154         */
     155        uint8_t version:4;
     156        /** Internet Header Length is the length of the internet header in 32~bit words, and thus points to the beginning of the data.
     157         *  Note that the minimum value for a~correct header is~5.
     158         */
     159        uint8_t header_length:4;
    148160#else
    149         uint8_t header_length : 4;
    150         uint8_t version : 4;
    151 #endif
    152 
     161        /** Internet Header Length is the length of the internet header in 32~bit words, and thus points to the beginning of the data.
     162         *  Note that the minimum value for a~correct header is~5.
     163         */
     164        uint8_t header_length:4;
     165        /** The Version field indicates the format of the internet header.
     166         */
     167        uint8_t version:4;
     168#endif
     169        /** The Type of Service provides an indication of the abstract parameters of the quality of service desired.
     170         *  These parameters are to be used to guide the selection of the actual service parameters when transmitting a~datagram through a~particular network.
     171         *  Several networks offer service precedence, which somehow treats high precedence traffic as more important than other traffic (generally by accepting only traffic above a~certain precedence at time of high load).
     172         *  The major choice is a~three way tradeoff between low-delay, high-reliability, and high-throughput.
     173         */
    153174        uint8_t tos;
     175        /** Total Length is the length of the datagram, measured in octets, including internet header and data.
     176         *  This field allows the length of a~datagram to be up to 65,535~octets.
     177         */
    154178        uint16_t total_length;
     179        /** An identifying value assigned by the sender to aid in assembling the fragments of a~datagram.
     180         */
    155181        uint16_t identification;
    156 
    157182#ifdef ARCH_IS_BIG_ENDIAN
    158         uint8_t flags : 3;
    159         uint8_t fragment_offset_high : 5;
     183        /** Various control flags.
     184         */
     185        uint8_t flags:3;
     186        /** This field indicates where in the datagram this fragment belongs.
     187         *  High bits.
     188         */
     189        uint8_t fragment_offset_high:5;
    160190#else
    161         uint8_t fragment_offset_high : 5;
    162         uint8_t flags : 3;
    163 #endif
    164 
     191        /** This field indicates where in the datagram this fragment belongs.
     192         *  High bits.
     193         */
     194        uint8_t fragment_offset_high:5;
     195        /** Various control flags.
     196         */
     197        uint8_t flags:3;
     198#endif
     199        /** This field indicates where in the datagram this fragment belongs.
     200         *  Low bits.
     201         */
    165202        uint8_t fragment_offset_low;
     203        /** This field indicates the maximum time the datagram is allowed to remain in the internet system.
     204         *  If this field contains the value zero, then the datagram must be destroyed.
     205         *  This field is modified in internet header processing.
     206         *  The time is measured in units of seconds, but since every module that processes a~datagram must decrease the TTL by at least one even if it process the datagram in less than a~second, the TTL must be thought of only as an upper bound on the time a~datagram may exist.
     207         *  The intention is to cause undeliverable datagrams to be discarded, and to bound the maximum datagram lifetime.
     208         */
    166209        uint8_t ttl;
     210        /** This field indicates the next level protocol used in the data portion of the internet datagram.
     211         */
    167212        uint8_t protocol;
     213        /** A checksum of the header only.
     214         *  Since some header fields change (e.g., time to live), this is recomputed and verified at each point that the internet header is processed.
     215         *  The checksum algorithm is: The checksum field is the 16~bit one's complement of the one's complement sum of all 16~bit words in the header.
     216         *  For purposes of computing the checksum, the value of the checksum field is zero.
     217         */
    168218        uint16_t header_checksum;
     219        /** The source address.
     220         */
    169221        uint32_t source_address;
     222        /** The destination address.
     223         */
    170224        uint32_t destination_address;
    171225} __attribute__ ((packed));
    172226
    173227/** Internet option header.
    174  *
    175  * Only type field is always valid.
    176  * Other fields' validity depends on the option type.
    177  */
    178 struct ip_option {
     228 *  Only type field is always valid.
     229 *  Other fields' validity depends on the option type.
     230 */
     231struct ip_option{
     232        /** A single octet of option-type.
     233         */
    179234        uint8_t type;
     235        /** An option length octet.
     236         */
    180237        uint8_t length;
     238        /** A~pointer.
     239         */
    181240        uint8_t pointer;
    182 
    183241#ifdef ARCH_IS_BIG_ENDIAN
    184         uint8_t overflow : 4;
    185         uint8_t flags : 4;
     242        /** The number of IP modules that cannot register timestamps due to lack of space.
     243         */
     244        uint8_t overflow:4;
     245        /** Various internet timestamp control flags.
     246         */
     247        uint8_t flags:4;
    186248#else
    187         uint8_t flags : 4;
    188         uint8_t overflow : 4;
     249        /** Various internet timestamp control flags.
     250         */
     251        uint8_t flags:4;
     252        /** The number of IP modules that cannot register timestamps due to lack of space.
     253         */
     254        uint8_t overflow:4;
    189255#endif
    190256} __attribute__ ((packed));
    191257
    192 /** Internet version 4 pseudo header. */
    193 struct ipv4_pseudo_header {
     258/** Internet version 4 pseudo header.
     259 */
     260struct ipv4_pseudo_header{
     261        /** The source address.
     262         */
    194263        uint32_t source_address;
     264        /** The destination address.
     265         */
    195266        uint32_t destination_address;
     267        /** Reserved byte.
     268         *  Must be zero.
     269         */
    196270        uint8_t reserved;
     271        /** This field indicates the next level protocol used in the data portion of the internet datagram.
     272         */
    197273        uint8_t protocol;
     274        /** Data length is the length of the datagram, measured in octets.
     275         */
    198276        uint16_t data_length;
    199277} __attribute__ ((packed));
Note: See TracChangeset for help on using the changeset viewer.