=== modified file 'src/common/crc.c' --- old/src/common/crc.c 2011-11-27 12:16:55 +0000 +++ new/src/common/crc.c 2011-12-22 11:50:12 +0000 @@ -24,6 +24,7 @@ #include "crc.h" #include "rohc.h" +#include "esp.h" //FWX #include "rtp.h" #include @@ -502,6 +503,98 @@ } +// Begin FWX + +/** + * @brief Compute the CRC-STATIC part of an ESP header + * + * Concerned fields are: + * all fields expect those for CRC-DYNAMIC + * - bytes 1-4 in original ESP header + * + * @param ip The outer IP packet + * @param ip2 The inner IP packet if there is 2 IP headers, NULL otherwise + * @param next_header The next header located after the IP header(s) + * @param crc_type The type of CRC + * @param init_val The initial CRC value + * @param crc_table The pre-computed table for fast CRC computation + * @return The checksum + */ +unsigned int esp_compute_crc_static(const unsigned char *const ip, + const unsigned char *const ip2, + const unsigned char *const next_header, + const unsigned int crc_type, + const unsigned int init_val, + const unsigned char *const crc_table) +{ + unsigned int crc; + struct esphdr *esp; + + assert(ip != NULL); + assert(next_header != NULL); + assert(crc_table != NULL); + + crc = init_val; + + /* compute the CRC-STATIC value for IP and IP2 headers */ + crc = compute_crc_static(ip, ip2, next_header, crc_type, crc, crc_table); + + /* get the start of ESP header */ + esp = (struct esphdr *) next_header; + + /* bytes 1-4 (Security parameters index) */ + crc = crc_calculate(crc_type, (unsigned char *)(&esp->security_parameters_index), 4, + crc, crc_table); + + return crc; +} + + +/** + * @brief Compute the CRC-DYNAMIC part of an ESP header + * + * Concerned fields are: + * - bytes 5-8 in original ESP header + * + * @param ip The outer IP packet + * @param ip2 The inner IP packet if there is 2 IP headers, NULL otherwise + * @param next_header The next header located after the IP header(s) + * @param crc_type The type of CRC + * @param init_val The initial CRC value + * @param crc_table The pre-computed table for fast CRC computation + * @return The checksum + */ +unsigned int esp_compute_crc_dynamic(const unsigned char *const ip, + const unsigned char *const ip2, + const unsigned char *const next_header, + const unsigned int crc_type, + const unsigned int init_val, + const unsigned char *const crc_table) +{ + unsigned int crc; + struct esphdr *esp; + + assert(ip != NULL); + assert(next_header != NULL); + assert(crc_table != NULL); + + crc = init_val; + + /* compute the CRC-DYNAMIC value for IP and IP2 headers */ + crc = compute_crc_dynamic(ip, ip2, next_header, crc_type, crc, crc_table); + + /* get the start of ESP header */ + esp = (struct esphdr *) next_header; + + /* bytes 5-8 (Sequence number) */ + crc = crc_calculate(crc_type, (unsigned char *)(&esp->sequence_number), 4, + crc, crc_table); + + return crc; +} + +// End FWX + /** * @brief Compute the CRC-STATIC part of a RTP header * === modified file 'src/common/crc.h' --- old/src/common/crc.h 2011-11-26 14:10:43 +0000 +++ new/src/common/crc.h 2011-12-22 12:13:16 +0000 @@ -85,6 +85,23 @@ const unsigned char *const crc_table) __attribute__((nonnull(1, 3, 6))); +// Begin FWX +unsigned int esp_compute_crc_static(const unsigned char *const ip, + const unsigned char *const ip2, + const unsigned char *const next_header, + const unsigned int crc_type, + const unsigned int init_val, + const unsigned char *const crc_table) + __attribute__((nonnull(1, 3, 6))); +unsigned int esp_compute_crc_dynamic(const unsigned char *const ip, + const unsigned char *const ip2, + const unsigned char *const next_header, + const unsigned int crc_type, + const unsigned int init_val, + const unsigned char *const crc_table) + __attribute__((nonnull(1, 3, 6))); +// End FWX + unsigned int rtp_compute_crc_static(const unsigned char *const ip, const unsigned char *const ip2, const unsigned char *const next_header, === modified file 'src/common/rohc.h' --- old/src/common/rohc.h 2011-11-29 21:07:40 +0000 +++ new/src/common/rohc.h 2011-12-22 11:51:01 +0000 @@ -464,6 +464,8 @@ #define ROHC_PROFILE_RTP 0x0001 /// The number allocated for the ROHC UDP profile #define ROHC_PROFILE_UDP 0x0002 +/// The number allocated for the ROHC ESP profile +#define ROHC_PROFILE_ESP 0x0003 // FWX /// The number allocated for the ROHC IP-only profile (see 5 in the RFC 3843) #define ROHC_PROFILE_IP 0x0004 /// The number allocated for the ROHC UDP-Lite profile (see 7 in the RFC 4019) === modified file 'src/comp/Makefile.am' --- old/src/comp/Makefile.am 2011-11-26 13:30:57 +0000 +++ new/src/comp/Makefile.am 2011-12-22 11:58:33 +0000 @@ -13,6 +13,7 @@ c_ip.c \ c_udp.c \ c_udp_lite.c \ + c_esp.c \ c_rtp.c INCLUDES = \ @@ -29,5 +30,6 @@ c_ip.h \ c_udp.h \ c_udp_lite.h \ + c_esp.h \ c_rtp.h === modified file 'src/comp/c_generic.c' --- old/src/comp/c_generic.c 2011-12-18 17:57:02 +0000 +++ new/src/comp/c_generic.c 2011-12-22 11:55:57 +0000 @@ -551,6 +551,7 @@ break; case ROHC_PROFILE_UNCOMPRESSED: case ROHC_PROFILE_UDP: + case ROHC_PROFILE_ESP: // FWX case ROHC_PROFILE_IP: case ROHC_PROFILE_UDPLITE: p = -1; @@ -7683,6 +7684,9 @@ case ROHC_PROFILE_UDP: total_size += 6; /* UDP part in IR packet */ break; + case ROHC_PROFILE_ESP: + total_size += 8; /* ESP part in IR packet */ // FWX + break; case ROHC_PROFILE_UDPLITE: total_size += 8; /* size of UDP-lite part in IR packet */ break; @@ -7737,6 +7741,8 @@ case ROHC_PROFILE_UDP: total_size += 2; /* size of UDP part in IR packet */ break; + case ROHC_PROFILE_ESP: // FWX + break; case ROHC_PROFILE_UDPLITE: total_size += 4; /* size of UDP-lite part in IR packet */ break; === modified file 'src/comp/rohc_comp.c' --- old/src/comp/rohc_comp.c 2011-11-26 12:51:01 +0000 +++ new/src/comp/rohc_comp.c 2011-12-22 13:33:09 +0000 @@ -46,6 +46,7 @@ extern struct c_profile c_rtp_profile, c_udp_profile, c_udp_lite_profile, + c_esp_profile, // FWX c_ip_profile, c_uncompressed_profile; @@ -57,6 +58,7 @@ &c_rtp_profile, &c_udp_profile, &c_udp_lite_profile, + &c_esp_profile, // FWX &c_ip_profile, &c_uncompressed_profile, }; @@ -1250,6 +1252,8 @@ /* test all compression profiles */ for(i = 0; i < C_NUM_PROFILES; i++) { +/* FWX */ rohc_debugf(3, "try profile %d '%s' (0x%04x)\n", + i, c_profiles[i]->description, c_profiles[i]->id); /* skip profile if the profile is not enabled */ if(!comp->profiles[i]) { === modified file 'src/comp/rohc_comp_internals.h' --- old/src/comp/rohc_comp_internals.h 2011-11-26 12:51:01 +0000 +++ new/src/comp/rohc_comp_internals.h 2011-12-22 11:59:12 +0000 @@ -39,7 +39,7 @@ */ /** The number of ROHC profiles ready to be used */ -#define C_NUM_PROFILES 5 +#define C_NUM_PROFILES 6 // FWX /** The maximal number of outgoing feedbacks that can be queued */ #define FEEDBACK_RING_SIZE 10 === modified file 'src/decomp/Makefile.am' --- old/src/decomp/Makefile.am 2010-06-06 17:51:59 +0000 +++ new/src/decomp/Makefile.am 2011-12-22 12:03:54 +0000 @@ -14,6 +14,7 @@ d_ip.c \ d_udp.c \ d_udp_lite.c \ + d_esp.c \ d_rtp.c INCLUDES = \ @@ -31,5 +32,6 @@ d_ip.h \ d_udp.h \ d_udp_lite.h \ + d_esp.h \ d_rtp.h === modified file 'src/decomp/rohc_decomp.c' --- old/src/decomp/rohc_decomp.c 2011-11-26 18:28:24 +0000 +++ new/src/decomp/rohc_decomp.c 2011-12-22 12:10:08 +0000 @@ -43,6 +43,7 @@ d_udp_profile, d_ip_profile, d_udplite_profile, + d_esp_profile, // FWX d_rtp_profile; /** @@ -54,6 +55,7 @@ &d_udp_profile, &d_ip_profile, &d_udplite_profile, + &d_esp_profile, // FWX &d_rtp_profile, }; @@ -483,7 +485,7 @@ decomp->statistics.packets_received++; rohc_debugf(1, "decompress the %d-byte packet #%u\n", isize, decomp->statistics.packets_received); - + ret = d_decode_header(decomp, ibuf, isize, obuf, osize, &ddata); if(ddata.active == NULL && (ret == ROHC_ERROR_PACKET_FAILED || === modified file 'src/decomp/rohc_decomp.h' --- old/src/decomp/rohc_decomp.h 2011-11-26 14:23:46 +0000 +++ new/src/decomp/rohc_decomp.h 2011-12-22 12:15:52 +0000 @@ -29,7 +29,7 @@ #include "rohc_comp.h" /// The number of ROHC profiles ready to be used -#define D_NUM_PROFILES 5 +#define D_NUM_PROFILES 6 // FWX /// ROHC decompressor states (see 4.3.2 in the RFC 3095) === modified file 'test/non_regression/test_non_regression.c' --- old/test/non_regression/test_non_regression.c 2011-12-18 17:57:02 +0000 +++ new/test/non_regression/test_non_regression.c 2011-12-22 12:07:43 +0000 @@ -794,6 +794,7 @@ rohc_activate_profile(comp1, ROHC_PROFILE_IP); rohc_activate_profile(comp1, ROHC_PROFILE_UDPLITE); rohc_activate_profile(comp1, ROHC_PROFILE_RTP); + rohc_activate_profile(comp1, ROHC_PROFILE_ESP); // FWX rohc_c_set_large_cid(comp1, use_large_cid); /* create the compressor 2 */ @@ -813,6 +814,7 @@ rohc_activate_profile(comp2, ROHC_PROFILE_IP); rohc_activate_profile(comp2, ROHC_PROFILE_UDPLITE); rohc_activate_profile(comp2, ROHC_PROFILE_RTP); + rohc_activate_profile(comp2, ROHC_PROFILE_ESP); // FWX rohc_c_set_large_cid(comp2, use_large_cid); /* create the decompressor 1 */