Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
aes-standards
aes67
Commits
e644fd10
Commit
e644fd10
authored
Jun 09, 2021
by
phil
Browse files
eth basics
parent
15e1c85b
Changes
7
Hide whitespace changes
Inline
Side-by-side
CMakeLists.txt
View file @
e644fd10
...
...
@@ -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
)
...
...
README.md
View file @
e644fd10
...
...
@@ -33,7 +33,8 @@ https://github.com/tschiemer/aes67
-
Stream
-
[ ] RTP/RTCP
-
[ ] RTP
-
[ ] RTCP
-
Command line / developer utilities
...
...
src/core/eth.c
0 → 100644
View file @
e644fd10
/**
* 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
src/include/aes67/def.h
View file @
e644fd10
...
...
@@ -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
...
...
src/include/aes67/eth.h
0 → 100644
View file @
e644fd10
/**
* @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
test/CMakeLists.txt
View file @
e644fd10
...
...
@@ -30,6 +30,7 @@ set(TEST_UNIT_SOURCE_FILES
unit/sap.cpp
unit/sdp.cpp
unit/rtp.cpp
unit/eth.cpp
)
...
...
test/unit/eth.cpp
0 → 100644
View file @
e644fd10
/**
* 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
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment