Skip to content
Snippets Groups Projects
Commit e644fd10 authored by phil's avatar phil
Browse files

eth basics

parent 15e1c85b
No related branches found
No related tags found
No related merge requests found
......@@ -54,6 +54,7 @@ set(AES67_INCLUDES
${AES67_DIR}/src/include/aes67/rtp-avp.h
${AES67_DIR}/src/include/aes67/rtp.h
${AES67_DIR}/src/include/aes67/audio.h
${AES67_DIR}/src/include/aes67/eth.h
${AES67_DIR}/src/include/aes67/host/time.h
${AES67_DIR}/src/include/aes67/host/timer.h
......@@ -69,6 +70,7 @@ set(AES67_SOURCE_FILES
${AES67_DIR}/src/core/sdp.c
${AES67_DIR}/src/core/sap.c
${AES67_DIR}/src/core/rtp.c
${AES67_DIR}/src/core/eth.c
)
......
......@@ -33,7 +33,8 @@ https://github.com/tschiemer/aes67
- Stream
- [ ] RTP/RTCP
- [ ] RTP
- [ ] RTCP
- Command line / developer utilities
......
/**
* AES67 Framework
* Copyright (C) 2021 Philip Tschiemer, https://github.com/tschiemer/aes67
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "aes67/eth.h"
u16_t aes67_ipv4_header_checksum(u8_t * header)
{
int len = (header[AES67_IPV4_HEADER_IHL_OFFSET] & AES67_IPV4_HEADER_IHL_MASK) << 1;
u32_t sum = 0;
while(len--){
sum += *(header++) << 8;
sum += *(header++);
}
sum = (sum & 0xffff) + (sum >> 16);
sum = (sum & 0xffff) + (sum >> 16);
sum = (~sum) & 0xffff;
return sum;
}
\ No newline at end of file
......@@ -161,6 +161,7 @@ s32_t aes67_atoi(u8_t * str, size_t len, s32_t base, u16_t * readlen);
u8_t aes67_xor8(u8_t * buf, size_t count);
#ifndef aes67_crc32
#define AES67_CRC32_VERIFY_VALUE 0x2144DF1C
u32_t aes67_crc32(u8_t * buf, size_t count);
#endif
......
/**
* @file eth.h
* Lower level networking utilities, ethernet, ip, udp.
*
* References:
* AES67-2018 https://www.aes.org/publications/standards/search.cfm?docID=96
*/
/**
* AES67 Framework
* Copyright (C) 2021 Philip Tschiemer, https://github.com/tschiemer/aes67
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef AES67_ETH_H
#define AES67_ETH_H
#include "aes67/arch.h"
#ifdef __cplusplus
extern "C" {
#endif
//#define AES67_ETH_HEADER_DST 0
//#define AES67_ETH_HEADER_SRC 6
//#define
#define AES67_ETH_ETHERTYPE_IPv4 0x0800
#define AES67_ETH_ETHERTYPE_ARP 0x0806 // address resolution protocol
#define AES67_ETH_ETHERTYPE_AVTP 0x22f0 // audio video transport protocol
#define AES67_ETH_ETHERTYPE_SRP 0x22ea // stream reservation protocol
#define AES67_ETH_ETHERTYPE_IPv6 0x86dd
#define AES67_ETH_ETHERTYPE_VLAN_TAG 0x8100
#define AES67_ETH_ETHERTYPE_IPv6 0x86dd
#define AES67_ETH_ETHERTYPE_CobraNet 0x8819
//#define AES67_ETH_CRC32_POLY 0x04c11db7
//#define AES67_ETH_CRC32_INITIAL 0xffffffff
#define AES67_IPV4_HEADER_MINSIZE 20
#define AES67_IPV4_HEADER_VERSION_OFFSET 0
#define AES67_IPV4_HEADER_VERSION_MASK 0xf0
#define AES67_IPV4_HEADER_IHL_OFFSET 0
#define AES67_IPV4_HEADER_IHL_MASK 0x0f
#define AES67_IPV4_HEADER_DSCP_OFFSET 1 // Differentiated Services Code Point (DiffServ)
#define AES67_IPV4_HEADER_DSCP_MASK 0b11111100
#define AES67_IPV4_HEADER_ECN_OFFSET 1 // Explicit Congestion Notification
#define AES67_IPV4_HEADER_ECN_MASK 0b11
#define AES67_IPV4_HEADER_LENGTH_OFFSET 2
#define AES67_IPV4_HEADER_IDENTIFICATION_OFFSET 4
#define AES67_IPV4_HEADER_FRAGMENTATION_OFFSET 6
#define AES67_IPV4_HEADER_FRAGMENTATION_FLAGS_MASK 0b1110000000000000
#define AES67_IPV4_HEADER_FRAGMENTATION_FOFFSET_MASK 0b000111111111111
#define AES67_IPV4_HEADER_TTL_OFFSET 8
#define AES67_IPV4_HEADER_PROTOCOL_OFFSET 9
#define AES67_IPV4_HEADER_HEADER_CHECKSUM_OFFSET 10
#define AES67_IPV4_HEADER_SOURCE_OFFSET 12
#define AES67_IPV4_HEADER_DESTINATION_OFFSET 16
#define AES67_IPV4_HEADER_DATA_OFFSET 20 // assuming IHL == 5 (ie no extra headers)
#define AES67_IPV4_HEADER_VERSION_4 0x40
#define AES67_IPV4_HEADER_IHL_BASIC 0x05
#define AES67_IPV4_HEADER_DSCP_DEFAULT 0
#define AES67_IPV4_HEADER_DSCP_DEFAULT_CLOCK (46<<2) // Class EF
#define AES67_IPV4_HEADER_DSCP_DEFAULT_MEDIA (34<<2) // Class AF41
#define AES67_IPV4_HEADER_ECN_NON_ECT 0 // Non ECN capable transport
#define AES67_IPV4_HEADER_ECN_ECT0 1 // ECN capable transport 0
#define AES67_IPV4_HEADER_ECN_ECT1 2 // ECN capable transport 1
#define AES67_IPV4_HEADER_ECN_CE 3 // Congestion encountered
#define AES67_IPV4_HEADER_FRAGMENTATION_FLAGS_DF 0b0100000000000000 // don't fragment
#define AES67_IPV4_HEADER_FRAGMENTATION_FLAGS_MF 0b0010000000000000 // more fragments
#define AES67_IPV4_HEADER_PROTOCOL_ICMP 0x01
#define AES67_IPV4_HEADER_PROTOCOL_IGMP 0x02
#define AES67_IPV4_HEADER_PROTOCOL_TCP 0x06
#define AES67_IPV4_HEADER_PROTOCOL_UDP 0x11
#define AES67_IPV4_HEADER_PROTOCOL_RSVP 0x2e
// No 802.1Q headers
struct aes67_eth_frame {
u8_t destination[6];
u8_t source[6];
u8_t tpid[2];
u16_t length;
u8_t data[];
} PACK_STRUCT;
struct aes67_ipv4_packet {
u8_t byte0; // version + IHL
u8_t byte1; // DSCP + ECN
u16_t length; // total packet size (header + data, >= 20)
u16_t identification; // fragmentation identification
u16_t fragmentation; // flags + offset
u8_t ttl; // time to live
u8_t protocol; //
u16_t header_checksum; // The checksum field is the 16-bit ones' complement of the ones' complement sum of all
// 16-bit words in the header. For purposes of computing the checksum, the value of the
// checksum field is zero.
union {
u8_t bytes[4];
u32_t value;
} PACK_STRUCT source;
union {
u8_t bytes[4];
u32_t value;
} PACK_STRUCT destination;
u8_t data[];
} PACK_STRUCT;
struct aes67_udp_packet {
u16_t source_port;
u16_t destination_port;
u16_t length;
u16_t checksum;
u8_t data[];
} PACK_STRUCT;
struct aes67_udp_ipv4_pseudoheader {
union {
u8_t bytes[4];
u32_t value;
} PACK_STRUCT source;
union {
u8_t bytes[4];
u32_t value;
} PACK_STRUCT destination;
u8_t zeroes;
u8_t protocol;
u16_t udp_length;
struct aes67_udp_packet udp;
};
u16_t aes67_ipv4_header_checksum(u8_t * header);
#ifdef __cplusplus
}
#endif
#endif //AES67_ETH_H
......@@ -30,6 +30,7 @@ set(TEST_UNIT_SOURCE_FILES
unit/sap.cpp
unit/sdp.cpp
unit/rtp.cpp
unit/eth.cpp
)
......
/**
* AES67 Framework
* Copyright (C) 2021 Philip Tschiemer, https://github.com/tschiemer/aes67
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "CppUTest/TestHarness.h"
#include <string>
#include "aes67/eth.h"
TEST_GROUP(Eth_TestGroup){};
TEST(Eth_TestGroup, eth_ipv4_header_checksum) {
// test value from https://en.wikipedia.org/wiki/IPv4_header_checksum
// without checksum
uint8_t ip1[] = {
0x45, 0x00, 0x00, 0x73, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0, 0, // checksum
0xc0, 0xa8, 0x00, 0x01,
0xc0, 0xa8, 0x00, 0xc7, // end of header
0x00, 0x35, 0xe9, 0x7c, 0x00, 0x5f, 0x27, 0x9f, 0x1e, 0x4b, 0x81, 0x80
};
u16_t ck = aes67_ipv4_header_checksum(ip1);
CHECK_EQUAL(0xb861, ck);
// same WITH checksum
uint8_t ip2[] = {
0x45, 0x00, 0x00, 0x73, 0x00, 0x00, 0x40, 0x00, 0x40,
0x11, 0xb8, // checksum
0x61, 0xc0, 0xa8, 0x00, 0x01,
0xc0, 0xa8, 0x00, 0xc7, // end of header
0x00, 0x35, 0xe9, 0x7c, 0x00, 0x5f, 0x27, 0x9f, 0x1e, 0x4b, 0x81, 0x80
};
ck = aes67_ipv4_header_checksum(ip2);
CHECK_EQUAL(0x0000, ck);
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment