diff --git a/headers/header_spec.txt b/headers/header_spec.txt index 90def1eb36789bcf7ad67f2739707038715a56ba..8edd41b725ca4d2b6daea0b05e64e1f823f9fe4d 100644 --- a/headers/header_spec.txt +++ b/headers/header_spec.txt @@ -251,6 +251,7 @@ share/libc/net/if.h: CEA_LGPL share/libc/netdb.c: CEA_LGPL share/libc/netdb.h: CEA_LGPL share/libc/netinet/in.h: CEA_LGPL +share/libc/netinet/ip.h: CEA_LGPL share/libc/netinet/tcp.h: CEA_LGPL share/libc/nl_types.h: CEA_LGPL share/libc/poll.h: CEA_LGPL diff --git a/share/libc/__fc_integer.h b/share/libc/__fc_integer.h index a1ae2183b3ff341163cf1a55f67103d392c9eb48..ec13533449295ac9a7109e66bc37f7e7c3b38383 100644 --- a/share/libc/__fc_integer.h +++ b/share/libc/__fc_integer.h @@ -25,6 +25,7 @@ #define Frama_C_INTEGER #include "features.h" __PUSH_FC_STDLIB +__BEGIN_DECLS /*@ @@ -32,5 +33,6 @@ __PUSH_FC_STDLIB */ +__END_DECLS __POP_FC_STDLIB #endif diff --git a/share/libc/netinet/ip.h b/share/libc/netinet/ip.h new file mode 100644 index 0000000000000000000000000000000000000000..e4e709f347008b1b99daf8f5921f7e841fc443bb --- /dev/null +++ b/share/libc/netinet/ip.h @@ -0,0 +1,205 @@ +/**************************************************************************/ +/* */ +/* This file is part of Frama-C. */ +/* */ +/* Copyright (C) 2007-2020 */ +/* CEA (Commissariat à l'énergie atomique et aux énergies */ +/* alternatives) */ +/* */ +/* you can redistribute it and/or modify it under the terms of the GNU */ +/* Lesser General Public License as published by the Free Software */ +/* Foundation, version 2.1. */ +/* */ +/* It is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Lesser General Public License for more details. */ +/* */ +/* See the GNU Lesser General Public License version 2.1 */ +/* for more details (enclosed in the file licenses/LGPLv2.1). */ +/* */ +/**************************************************************************/ + +// This is a non-POSIX file, provided for better compatibility on a +// best-effort basis. + +#ifndef __NETINET_IP_H +#define __NETINET_IP_H +#include "../features.h" +__PUSH_FC_STDLIB +__BEGIN_DECLS +#include "../__fc_inet.h" + +// The definitions below suppose a little endian architecture. + +struct timestamp +{ + uint8_t len; + uint8_t ptr; + unsigned int flags:4; + unsigned int overflow:4; + uint32_t data[9]; +}; + +struct iphdr +{ + unsigned int ihl:4; + unsigned int version:4; + uint8_t tos; + uint16_t tot_len; + uint16_t id; + uint16_t frag_off; + uint8_t ttl; + uint8_t protocol; + uint16_t check; + uint32_t saddr; + uint32_t daddr; +}; + +struct ip +{ + unsigned int ip_hl:4; + unsigned int ip_v:4; + uint8_t ip_tos; + unsigned short ip_len; + unsigned short ip_id; + unsigned short ip_off; + uint8_t ip_ttl; + uint8_t ip_p; + unsigned short ip_sum; + struct in_addr ip_src, ip_dst; +}; + +#define IP_RF 0x8000 +#define IP_DF 0x4000 +#define IP_MF 0x2000 +#define IP_OFFMASK 0x1fff + +struct ip_timestamp +{ + uint8_t ipt_code; + uint8_t ipt_len; + uint8_t ipt_ptr; + unsigned int ipt_flg:4; + unsigned int ipt_oflw:4; + uint32_t data[9]; +}; + +#define IPVERSION 4 +#define IP_MAXPACKET 65535 + +#define IPTOS_ECN_MASK 0x03 +#define IPTOS_ECN(x) ((x) & IPTOS_ECN_MASK) +#define IPTOS_ECN_NOT_ECT 0x00 +#define IPTOS_ECN_ECT1 0x01 +#define IPTOS_ECN_ECT0 0x02 +#define IPTOS_ECN_CE 0x03 + +#define IPTOS_DSCP_MASK 0xfc +#define IPTOS_DSCP(x) ((x) & IPTOS_DSCP_MASK) +#define IPTOS_DSCP_AF11 0x28 +#define IPTOS_DSCP_AF12 0x30 +#define IPTOS_DSCP_AF13 0x38 +#define IPTOS_DSCP_AF21 0x48 +#define IPTOS_DSCP_AF22 0x50 +#define IPTOS_DSCP_AF23 0x58 +#define IPTOS_DSCP_AF31 0x68 +#define IPTOS_DSCP_AF32 0x70 +#define IPTOS_DSCP_AF33 0x78 +#define IPTOS_DSCP_AF41 0x88 +#define IPTOS_DSCP_AF42 0x90 +#define IPTOS_DSCP_AF43 0x98 +#define IPTOS_DSCP_EF 0xb8 + +#define IPTOS_CLASS_MASK 0xe0 +#define IPTOS_CLASS(class) ((class) & IPTOS_CLASS_MASK) +#define IPTOS_CLASS_CS0 0x00 +#define IPTOS_CLASS_CS1 0x20 +#define IPTOS_CLASS_CS2 0x40 +#define IPTOS_CLASS_CS3 0x60 +#define IPTOS_CLASS_CS4 0x80 +#define IPTOS_CLASS_CS5 0xa0 +#define IPTOS_CLASS_CS6 0xc0 +#define IPTOS_CLASS_CS7 0xe0 + +#define IPTOS_CLASS_DEFAULT IPTOS_CLASS_CS0 + +#define IPTOS_TOS_MASK 0x1E +#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK) +#define IPTOS_LOWDELAY 0x10 +#define IPTOS_THROUGHPUT 0x08 +#define IPTOS_RELIABILITY 0x04 +#define IPTOS_LOWCOST 0x02 +#define IPTOS_MINCOST IPTOS_LOWCOST + +#define IPTOS_PREC_MASK IPTOS_CLASS_MASK +#define IPTOS_PREC(tos) IPTOS_CLASS(tos) +#define IPTOS_PREC_NETCONTROL IPTOS_CLASS_CS7 +#define IPTOS_PREC_INTERNETCONTROL IPTOS_CLASS_CS6 +#define IPTOS_PREC_CRITIC_ECP IPTOS_CLASS_CS5 +#define IPTOS_PREC_FLASHOVERRIDE IPTOS_CLASS_CS4 +#define IPTOS_PREC_FLASH IPTOS_CLASS_CS3 +#define IPTOS_PREC_IMMEDIATE IPTOS_CLASS_CS2 +#define IPTOS_PREC_PRIORITY IPTOS_CLASS_CS1 +#define IPTOS_PREC_ROUTINE IPTOS_CLASS_CS0 + +#define IPOPT_COPY 0x80 +#define IPOPT_CLASS_MASK 0x60 +#define IPOPT_NUMBER_MASK 0x1f + +#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 0x00 +#define IPOPT_RESERVED1 0x20 +#define IPOPT_DEBMEAS 0x40 +#define IPOPT_MEASUREMENT IPOPT_DEBMEAS +#define IPOPT_RESERVED2 0x60 + +#define IPOPT_EOL 0 +#define IPOPT_END IPOPT_EOL +#define IPOPT_NOP 1 +#define IPOPT_NOOP IPOPT_NOP + +#define IPOPT_RR 7 +#define IPOPT_TS 68 +#define IPOPT_TIMESTAMP IPOPT_TS +#define IPOPT_SECURITY 130 +#define IPOPT_SEC IPOPT_SECURITY +#define IPOPT_LSRR 131 +#define IPOPT_SATID 136 +#define IPOPT_SID IPOPT_SATID +#define IPOPT_SSRR 137 +#define IPOPT_RA 148 + +#define IPOPT_OPTVAL 0 +#define IPOPT_OLEN 1 +#define IPOPT_OFFSET 2 +#define IPOPT_MINOFF 4 + +#define MAX_IPOPTLEN 40 + +#define IPOPT_TS_TSONLY 0 +#define IPOPT_TS_TSANDADDR 1 +#define IPOPT_TS_PRESPEC 3 + +#define IPOPT_SECUR_UNCLASS 0x0000 +#define IPOPT_SECUR_CONFID 0xf135 +#define IPOPT_SECUR_EFTO 0x789a +#define IPOPT_SECUR_MMMM 0xbc4d +#define IPOPT_SECUR_RESTR 0xaf13 +#define IPOPT_SECUR_SECRET 0xd788 +#define IPOPT_SECUR_TOPSECRET 0x6bc5 + +#define MAXTTL 255 +#define IPDEFTTL 64 +#define IPFRAGTTL 60 +#define IPTTLDEC 1 + +#define IP_MSS 576 + +__END_DECLS +__POP_FC_STDLIB + +#endif diff --git a/share/libc/netinet/tcp.h b/share/libc/netinet/tcp.h index e6b54e6bb39df74c0e11ca3793cd46cd29abb49e..a87954a655ae87e5e60a0a79418a90b68854f658 100644 --- a/share/libc/netinet/tcp.h +++ b/share/libc/netinet/tcp.h @@ -56,6 +56,7 @@ #include <features.h> __PUSH_FC_STDLIB +__BEGIN_DECLS /* * User-settable options (used with setsockopt). @@ -342,6 +343,7 @@ struct tcp_cookie_transactions #endif /* Misc. */ +__END_DECLS __POP_FC_STDLIB #endif /* netinet/tcp.h */ diff --git a/share/libc/pthread.h b/share/libc/pthread.h index 1d1e8fd806abf584768b36de2d2ebf5a4a0acf35..cb5f7f538a9213bbca5092d962708c6c5f72fd3c 100644 --- a/share/libc/pthread.h +++ b/share/libc/pthread.h @@ -25,6 +25,7 @@ #include "features.h" __PUSH_FC_STDLIB +__BEGIN_DECLS #include "errno.h" @@ -369,5 +370,6 @@ extern void pthread_testcancel(void); // (sched.h has already been included) #include "time.h" +__END_DECLS __POP_FC_STDLIB #endif diff --git a/share/libc/sys/file.h b/share/libc/sys/file.h index 6744af37fc860cbc478c4b31c8ecf3ca883b23e8..b627e24badd85e725310daaa6287a44af726f248 100644 --- a/share/libc/sys/file.h +++ b/share/libc/sys/file.h @@ -25,6 +25,7 @@ #include "../features.h" __PUSH_FC_STDLIB +__BEGIN_DECLS // Note: this file is not C11 nor POSIX, but Linux-specific. // The values for the constants below are based on the glibc. @@ -46,5 +47,6 @@ __PUSH_FC_STDLIB */ extern int flock(int fd, int operation); +__END_DECLS __POP_FC_STDLIB #endif diff --git a/share/libc/sys/mman.h b/share/libc/sys/mman.h index 9bc0105c71feebb46e6c5c3354e497d3d90a3c47..ed2baf1ff2c81de8c8870e24bd878b21d4cf5ab8 100644 --- a/share/libc/sys/mman.h +++ b/share/libc/sys/mman.h @@ -28,6 +28,7 @@ #include "../__fc_define_off_t.h" #include "../__fc_define_size_t.h" __PUSH_FC_STDLIB +__BEGIN_DECLS // The values for the constants below are based on an x86 Linux, // declared in the order given by POSIX.1-2008. @@ -92,5 +93,6 @@ extern int posix_madvise (void *__addr, size_t __len, int __advice); extern int shm_open (const char *__name, int __oflag, mode_t __mode); extern int shm_unlink (const char *__name); +__END_DECLS __POP_FC_STDLIB #endif diff --git a/share/libc/sys/times.h b/share/libc/sys/times.h index 8ec99d000d9cfa84bf00d3302d9d2810bd069f08..8d54e4e2edaa7f894ec571f4575070beb2c8525d 100644 --- a/share/libc/sys/times.h +++ b/share/libc/sys/times.h @@ -25,6 +25,7 @@ #include "../features.h" __PUSH_FC_STDLIB +__BEGIN_DECLS #include "../time.h" struct tms @@ -38,5 +39,7 @@ struct tms /*@ requires valid_buffer: \valid(buffer); assigns \result, *buffer \from __fc_time; */ extern clock_t times (struct tms *buffer); + +__END_DECLS __POP_FC_STDLIB #endif diff --git a/share/libc/sys/utsname.h b/share/libc/sys/utsname.h index e60cacea8b185e8452c44e948a147ce6348c5556..b26453462934619f6359b93963bc0b95e13bda93 100644 --- a/share/libc/sys/utsname.h +++ b/share/libc/sys/utsname.h @@ -25,6 +25,7 @@ #include "../features.h" __PUSH_FC_STDLIB +__BEGIN_DECLS // Arbitrary length, based on the one used in Linux #define _FC_UTSNAME_LENGTH 65 @@ -46,5 +47,6 @@ struct utsname */ extern int uname (struct utsname *name); +__END_DECLS __POP_FC_STDLIB #endif diff --git a/tests/libc/fc_libc.c b/tests/libc/fc_libc.c index db68bcf3adf8d06663093e725347cb4f8ae7de7f..5ad226916ca36cd0496df4992e45e78d79a22da2 100644 --- a/tests/libc/fc_libc.c +++ b/tests/libc/fc_libc.c @@ -98,6 +98,7 @@ #include "netdb.h" #include "net/if.h" #include "netinet/in.h" +#include "netinet/ip.h" #include "netinet/tcp.h" #include "nl_types.h" #include "poll.h" diff --git a/tests/libc/oracle/fc_libc.0.res.oracle b/tests/libc/oracle/fc_libc.0.res.oracle index d0a318762b25eed2f4bbcf4f604f864e49adb936..e3ca27e4863a5c853bf6c387842e38e4363e8e51 100644 --- a/tests/libc/oracle/fc_libc.0.res.oracle +++ b/tests/libc/oracle/fc_libc.0.res.oracle @@ -4,10 +4,10 @@ [eva] Initial state computed [eva:initial-state] Values of globals at initialization -[eva] tests/libc/fc_libc.c:154: assertion got status valid. [eva] tests/libc/fc_libc.c:155: assertion got status valid. [eva] tests/libc/fc_libc.c:156: assertion got status valid. [eva] tests/libc/fc_libc.c:157: assertion got status valid. +[eva] tests/libc/fc_libc.c:158: assertion got status valid. [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== diff --git a/tests/libc/oracle/fc_libc.2.res.oracle b/tests/libc/oracle/fc_libc.2.res.oracle index 4b7f321bdaefa863bb3a434a0f0479af8319120d..b1e1247a43669f03d504de710fa2a4b5337ce754 100644 --- a/tests/libc/oracle/fc_libc.2.res.oracle +++ b/tests/libc/oracle/fc_libc.2.res.oracle @@ -73,6 +73,7 @@ skipping share/libc/complex.h [kernel] Parsing share/libc/net/if.h (with preprocessing) [kernel] Parsing share/libc/netdb.h (with preprocessing) [kernel] Parsing share/libc/netinet/in.h (with preprocessing) +[kernel] Parsing share/libc/netinet/ip.h (with preprocessing) [kernel] Parsing share/libc/netinet/tcp.h (with preprocessing) [kernel] Parsing share/libc/nl_types.h (with preprocessing) [kernel] Parsing share/libc/poll.h (with preprocessing)