/*
* Copyright (c) 2009 Lukas Mejdrech
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/** @addtogroup ip
* @{
*/
/** @file
* \todo
*/
#ifndef __NET_IP_CLIENT_H__
#define __NET_IP_CLIENT_H__
#include <sys/types.h>
typedef uint8_t ip_ttl_t;
typedef uint8_t ip_tos_t;
typedef uint8_t ip_protocol_t;
#include "../structures/packet/packet.h"
#define IPVERSION 4
#define MAXTTL 255
#define IPDEFTTL 64
#define IPTOS_TOS_MASK 0x1E
#define IPTOS_PRECEDENCE_SHIFT 5
#define IPTOS_DELAY_SHIFT 4
#define IPTOS_THROUGHPUT_SHIFT 3
#define IPTOS_RELIABILITY_SHIFT 2
#define IPTOS_COST_SHIFT 1
#define IPTOS_NORMALDELAY ( 0x0 << IPTOS_DELAY_SHIFT )
#define IPTOS_LOWDELAY ( 0x1 << IPTOS_DELAY_SHIFT )
#define IPTOS_NORMALTHROUGHPUT ( 0x0 << IPTOS_THROUGHPUT_SHIFT )
#define IPTOS_THROUGHPUT ( 0x1 << IPTOS_THROUGHPUT_SHIFT )
#define IPTOS_NORMALRELIABILITY ( 0x0 << IPTOS_RELIABILITY_SHIFT )
#define IPTOS_RELIABILITY ( 0x1 << IPTOS_RELIABILITY_SHIFT )
#define IPTOS_NORMALCOST ( 0x0 << IPTOS_COST_SHIFT )
#define IPTOS_MICNCOST ( 0x1 << IPTOS_COST_SHIFT )
#define IPTOS_PREC_MASK 0xE0
#define IPTOS_PREC_ROUTINE ( 0x0 << IPTOS_PRECEDENCE_SHIFT )
#define IPTOS_PREC_PRIORITY ( 0x1 << IPTOS_PRECEDENCE_SHIFT )
#define IPTOS_PREC_IMMEDIATE ( 0x2 << IPTOS_PRECEDENCE_SHIFT )
#define IPTOS_PREC_FLASH ( 0x3 << IPTOS_PRECEDENCE_SHIFT )
#define IPTOS_PREC_FLASHOVERRIDE ( 0x4 << IPTOS_PRECEDENCE_SHIFT )
#define IPTOS_PREC_CRITIC_ECP ( 0x5 << IPTOS_PRECEDENCE_SHIFT )
#define IPTOS_PREC_INTERNETCONTROL ( 0x6 << IPTOS_PRECEDENCE_SHIFT )
#define IPTOS_PREC_NETCONTROL ( 0x7 << IPTOS_PRECEDENCE_SHIFT )
#define IPOPT_COPY_SHIFT 7
#define IPOPT_CLASS_SHIFT 5
#define IPOPT_NUMBER_SHIFT 0
#define IPOPT_CLASS_MASK 0x60
#define IPOPT_NUMBER_MASK 0x1F
#define IPOPT_COPY ( 1 << IPOPT_COPY_SHIFT )
#define IPOPT_TYPE( copy, class, number ) ((( copy ) & IPOPT_COPY ) | (( class ) & IPOPT_CLASS_MASK ) | (( number << IPOPT_NUMBER_SHIFT ) & IPOPT_NUMBER_MASK ))
#define IPOPT_COPIED( o ) (( o ) & IPOPT_COPY )
#define IPOPT_CLASS( o ) (( o ) & IPOPT_CLASS_MASK )
#define IPOPT_NUMBER( o ) (( o ) & IPOPT_NUMBER_MASK )
#define IPOPT_CONTROL ( 0 << IPOPT_CLASS_SHIFT )
#define IPOPT_RESERVED1 ( 1 << IPOPT_CLASS_SHIFT )
#define IPOPT_MEASUREMENT ( 2 << IPOPT_CLASS_SHIFT )
#define IPOPT_RESERVED2 ( 3 << IPOPT_CLASS_SHIFT )
//#define IPOPT_END_OF_LIST 0x0
#define IPOPT_END IPOPT_TYPE( 0, IPOPT_CONTROL, 0 )
//#define IPOPT_NO_OPERATION 0x1
#define IPOPT_NOOP IPOPT_TYPE( 0, IPOPT_CONTROL, 1 )
//#define IPOPT_SECURITY 0x82
#define IPOPT_SEC IPOPT_TYPE( IPOPT_COPY, IPOPT_CONTROL, 2 )
#define IPOPT_SEC_LENGTH 11
#define IPOPT_SEC_UNCLASIFIED 0x0
#define IPOPT_SEC_CONFIDENTIAL 0xF035
#define IPOPT_SEC_EFTO 0x789A
#define IPOPT_SEC_MMMM 0xBC4D
#define IPOPT_SEC_PROG 0x5E26
#define IPOPT_SEC_RESTRICTED 0xAF13
#define IPOPT_SEC_SECRET 0xD788
#define IPOPT_SEC_TOP_SECRET 0x6BC5
//#define IPOPT_LOOSE_SOURCE 0x83
#define IPOPT_LSRR IPOPT_TYPE( IPOPT_COPY, IPOPT_CONTROL, 3 )
//#define IPOPT_STRICT_SOURCE 0x89
#define IPOPT_SSRR IPOPT_TYPE( IPOPT_COPY, IPOPT_CONTROL, 9 )
//#define IPOPT_RECORD_ROUTE 0x07
#define IPOPT_RR IPOPT_TYPE( IPOPT_COPY, IPOPT_CONTROL, 7 )
//#define IPOPT_STREAM_IDENTIFIER 0x88
#define IPOPT_SID IPOPT_TYPE( IPOPT_COPY, IPOPT_CONTROL, 8 )
#define IPOPT_SID_LENGTH 4
//#define IPOPT_INTERNET_TIMESTAMP 0x44
#define IPOPT_TIMESTAMP IPOPT_TYPE( IPOPT_COPY, IPOPT_MEASUREMENT, 4 )
#define IPOPT_CIPSO IPOPT_TYPE( IPOPT_COPY, IPOPT_CONTROL, 5 )
#define IPOPT_NOP IPOPT_NOOP
#define IPOPT_EOL IPOPT_END
#define IPOPT_TS IPOPT_TIMESTAMP
#define IPOPT_TS_TSONLY 0 /* timestamps only */
#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */
#define IPOPT_TS_PRESPEC 3 /* specified modules only */
int ip_client_prepare_packet( packet_t packet, ip_protocol_t protocol, ip_ttl_t ttl, ip_tos_t tos, int dont_fragment, size_t ipopt_length );
int ip_client_process_packet( packet_t packet, ip_protocol_t * protocol, ip_ttl_t * ttl, ip_tos_t * tos, int * dont_fragment, size_t * ipopt_length );
/** Returns the IP header length.
* @param packet The packet. Input parameter.
* @returns The IP header length in bytes.
* @returns ENOMEM if there is no IP header.
*/
int ip_client_header_length( packet_t packet );
// TODO ipopt manipulation
#endif
/** @}
*/