2017-03-29 20:34:32 +01:00
|
|
|
/* IPXWrapper test suite
|
2023-09-02 15:07:28 +01:00
|
|
|
* Copyright (C) 2017-2023 Daniel Collins <solemnwarning@solemnwarning.net>
|
2017-03-29 20:34:32 +01:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License version 2 as published by
|
|
|
|
* the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* 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 General Public License for
|
|
|
|
* more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along with
|
|
|
|
* this program; if not, write to the Free Software Foundation, Inc., 51
|
|
|
|
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <winsock2.h>
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2023-09-02 15:07:28 +01:00
|
|
|
#include "tap/basic.h"
|
|
|
|
#include "../src/ethernet.h"
|
2017-03-29 20:34:32 +01:00
|
|
|
|
|
|
|
#define CHECK_FRAME_SIZE(func, input, output) \
|
|
|
|
is_int((output), func(input), #func "(" #input ") returns " #output)
|
|
|
|
|
|
|
|
#define UNPACK_GOOD_FRAME(func, desc, expect_ipx_off, expect_ipx_len, frame_len, ...) \
|
|
|
|
{ \
|
|
|
|
const unsigned char FRAME[frame_len] = { __VA_ARGS__ }; \
|
|
|
|
\
|
|
|
|
const novell_ipx_packet *ipx; \
|
|
|
|
size_t ipx_len; \
|
|
|
|
\
|
2017-09-12 17:44:07 +01:00
|
|
|
ok(func(&ipx, &ipx_len, FRAME, frame_len), #func "(<" desc ">) succeeds"); \
|
|
|
|
ok((ipx == (novell_ipx_packet*)(FRAME + expect_ipx_off)), #func "(<" desc ">) returns the correct payload address"); \
|
|
|
|
is_int(expect_ipx_len, ipx_len, #func "(<" desc ">) returns the correct payload length"); \
|
2017-03-29 20:34:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define UNPACK_BAD_FRAME(func, desc, frame_len, ...) \
|
|
|
|
{ \
|
|
|
|
const unsigned char FRAME[frame_len] = { __VA_ARGS__ }; \
|
|
|
|
\
|
|
|
|
const novell_ipx_packet *ipx; \
|
|
|
|
size_t ipx_len; \
|
|
|
|
\
|
|
|
|
ok(!func(&ipx, &ipx_len, FRAME, frame_len), #func "(<" desc ">) fails"); \
|
|
|
|
}
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
plan_lazy();
|
|
|
|
|
|
|
|
/* +------------------+
|
|
|
|
* | ethII_frame_size |
|
|
|
|
* +------------------+
|
|
|
|
*/
|
|
|
|
|
|
|
|
CHECK_FRAME_SIZE(ethII_frame_size, 0, 44);
|
|
|
|
CHECK_FRAME_SIZE(ethII_frame_size, 50, 94);
|
|
|
|
CHECK_FRAME_SIZE(ethII_frame_size, 2000, 2044);
|
|
|
|
|
|
|
|
/* +------------------+
|
|
|
|
* | ethII_frame_pack |
|
|
|
|
* +------------------+
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
uint8_t ptype = 0x42;
|
|
|
|
|
|
|
|
addr32_t src_net = addr32_in((unsigned char[]){ 0xDE, 0xAD, 0xBE, 0xEF });
|
|
|
|
addr48_t src_node = addr48_in((unsigned char[]){ 0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D });
|
|
|
|
uint16_t src_socket = htons(1234);
|
|
|
|
|
|
|
|
addr32_t dst_net = addr32_in((unsigned char[]){ 0xBE, 0xEF, 0x0D, 0xAD });
|
|
|
|
addr48_t dst_node = addr48_in((unsigned char[]){ 0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00 });
|
|
|
|
uint16_t dst_socket = htons(9876);
|
|
|
|
|
|
|
|
static const char payload[] = { 0x00, 0xFF, 0x12, 0x34 };
|
|
|
|
|
|
|
|
unsigned char buf[1024];
|
|
|
|
ethII_frame_pack(&buf,
|
|
|
|
ptype,
|
|
|
|
src_net, src_node, src_socket,
|
|
|
|
dst_net, dst_node, dst_socket,
|
|
|
|
payload, sizeof(payload));
|
|
|
|
|
|
|
|
static const unsigned char expect[] = {
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x81, 0x37, /* Ethertype */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x22, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
|
|
|
|
/* Payload */
|
|
|
|
0x00, 0xFF, 0x12, 0x34,
|
|
|
|
};
|
|
|
|
|
|
|
|
is_blob(expect, buf, sizeof(expect), "ethII_frame_pack() serialises correctly");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* +--------------------+
|
|
|
|
* | ethII_frame_unpack |
|
|
|
|
* +--------------------+
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Frame with smallest possible IPX packet (30 bytes) */
|
|
|
|
UNPACK_GOOD_FRAME(ethII_frame_unpack,
|
|
|
|
"frame with 30 byte packet",
|
|
|
|
|
|
|
|
14, /* Offset of IPX packet */
|
|
|
|
30, /* Length of IPX packet */
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
44,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x81, 0x37, /* Ethertype */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1E, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Frame with wrong Ethertype (valid raw frame) */
|
|
|
|
UNPACK_BAD_FRAME(ethII_frame_unpack,
|
|
|
|
"frame with wrong Ethertype",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
44,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x00, 0x1E, /* Payload length */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1E, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Frame with 2000 byte IPX packet */
|
|
|
|
UNPACK_GOOD_FRAME(ethII_frame_unpack,
|
|
|
|
"frame with 2000 byte packet",
|
|
|
|
|
|
|
|
14, /* Offset of IPX packet */
|
|
|
|
2000, /* Length of IPX packet */
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
2014,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x81, 0x37, /* Ethertype */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x07, 0xD0, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
|
|
|
|
/* IPX payload (uninitialised) */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Frame too short to hold all the headers */
|
|
|
|
UNPACK_BAD_FRAME(ethII_frame_unpack,
|
|
|
|
"truncated frame - too short",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
43,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x81, 0x37, /* Ethertype */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1D, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, /* Source socket (truncated) */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* +-------------------+
|
|
|
|
* | novell_frame_size |
|
|
|
|
* +-------------------+
|
|
|
|
*/
|
|
|
|
|
|
|
|
CHECK_FRAME_SIZE(novell_frame_size, 0, 44);
|
|
|
|
CHECK_FRAME_SIZE(novell_frame_size, 50, 94);
|
2017-08-20 22:59:49 +01:00
|
|
|
CHECK_FRAME_SIZE(novell_frame_size, 1470, 1514);
|
|
|
|
CHECK_FRAME_SIZE(novell_frame_size, 1471, 0);
|
2017-03-29 20:34:32 +01:00
|
|
|
|
|
|
|
/* +===================+
|
|
|
|
* | novell_frame_pack |
|
|
|
|
* +===================+
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
uint8_t ptype = 0x42;
|
|
|
|
|
|
|
|
addr32_t src_net = addr32_in((unsigned char[]){ 0xDE, 0xAD, 0xBE, 0xEF });
|
|
|
|
addr48_t src_node = addr48_in((unsigned char[]){ 0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D });
|
|
|
|
uint16_t src_socket = htons(1234);
|
|
|
|
|
|
|
|
addr32_t dst_net = addr32_in((unsigned char[]){ 0xBE, 0xEF, 0x0D, 0xAD });
|
|
|
|
addr48_t dst_node = addr48_in((unsigned char[]){ 0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00 });
|
|
|
|
uint16_t dst_socket = htons(9876);
|
|
|
|
|
|
|
|
static const char payload[] = { 0x00, 0xFF, 0x12, 0x34 };
|
|
|
|
|
|
|
|
unsigned char buf[1024];
|
|
|
|
novell_frame_pack(&buf,
|
|
|
|
ptype,
|
|
|
|
src_net, src_node, src_socket,
|
|
|
|
dst_net, dst_node, dst_socket,
|
|
|
|
payload, sizeof(payload));
|
|
|
|
|
|
|
|
static const unsigned char expect[] = {
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x00, 0x22, /* Payload length */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x22, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
|
|
|
|
/* Payload */
|
|
|
|
0x00, 0xFF, 0x12, 0x34,
|
|
|
|
};
|
|
|
|
|
|
|
|
is_blob(expect, buf, sizeof(expect), "novell_frame_pack() serialises correctly");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* +---------------------+
|
|
|
|
* | novell_frame_unpack |
|
|
|
|
* +---------------------+
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Frame with smallest possible IPX packet (30 bytes) */
|
|
|
|
UNPACK_GOOD_FRAME(novell_frame_unpack,
|
|
|
|
"frame with 30 byte packet",
|
|
|
|
|
|
|
|
14, /* Offset of IPX packet */
|
|
|
|
30, /* Length of IPX packet */
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
44,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x00, 0x1E, /* Payload length */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1E, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Frame with an Ethernet II Ethertype rather than a length */
|
|
|
|
UNPACK_BAD_FRAME(novell_frame_unpack,
|
|
|
|
"frame with 30 byte packet and an Ethertype",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
44,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x81, 0x37, /* Ethertype */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1E, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Frame with largest allowable IPX packet (1500 bytes) */
|
|
|
|
UNPACK_GOOD_FRAME(novell_frame_unpack,
|
|
|
|
"frame with 1500 byte packet",
|
|
|
|
|
|
|
|
14, /* Offset of IPX packet */
|
|
|
|
1500, /* Length of IPX packet */
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
1514,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x05, 0xDC, /* Payload length */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x05, 0xDC, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
|
|
|
|
/* IPX payload (uninitialised) */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Frame with 1501 length header (undefined behaviour) */
|
|
|
|
UNPACK_BAD_FRAME(novell_frame_unpack,
|
|
|
|
"frame with 1501 byte packet",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
1515,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x05, 0xDD, /* Payload length */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x05, 0xDD, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
|
|
|
|
/* IPX payload (uninitialised) */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Valid IPX packet within, but Ethernet payload length is too short */
|
|
|
|
UNPACK_BAD_FRAME(novell_frame_unpack,
|
|
|
|
"frame with valid packet but 29 bytes in length header",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
48,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x00, 0x1D, /* Payload length */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x22, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
|
|
|
|
/* IPX payload */
|
|
|
|
0x00, 0xFF, 0x12, 0x34,
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Frame too short to hold all the headers */
|
|
|
|
UNPACK_BAD_FRAME(novell_frame_unpack,
|
|
|
|
"truncated frame - too short",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
43,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x00, 0x1D, /* Payload length */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1D, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, /* Source socket (truncated) */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Length runs past frame end */
|
|
|
|
UNPACK_BAD_FRAME(novell_frame_unpack,
|
|
|
|
"truncated frame - length runs past end",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
44,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x00, 0x1F, /* Payload length */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1F, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
);
|
|
|
|
|
2017-03-29 22:00:47 +01:00
|
|
|
/* +----------------+
|
|
|
|
* | llc_frame_size |
|
|
|
|
* +----------------+
|
|
|
|
*/
|
|
|
|
|
|
|
|
CHECK_FRAME_SIZE(llc_frame_size, 0, 47);
|
|
|
|
CHECK_FRAME_SIZE(llc_frame_size, 50, 97);
|
2017-08-20 22:59:49 +01:00
|
|
|
CHECK_FRAME_SIZE(llc_frame_size, 1467, 1514);
|
|
|
|
CHECK_FRAME_SIZE(llc_frame_size, 1468, 0);
|
2017-03-29 22:00:47 +01:00
|
|
|
|
|
|
|
/* +================+
|
|
|
|
* | llc_frame_pack |
|
|
|
|
* +================+
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
uint8_t ptype = 0x42;
|
|
|
|
|
|
|
|
addr32_t src_net = addr32_in((unsigned char[]){ 0xDE, 0xAD, 0xBE, 0xEF });
|
|
|
|
addr48_t src_node = addr48_in((unsigned char[]){ 0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D });
|
|
|
|
uint16_t src_socket = htons(1234);
|
|
|
|
|
|
|
|
addr32_t dst_net = addr32_in((unsigned char[]){ 0xBE, 0xEF, 0x0D, 0xAD });
|
|
|
|
addr48_t dst_node = addr48_in((unsigned char[]){ 0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00 });
|
|
|
|
uint16_t dst_socket = htons(9876);
|
|
|
|
|
|
|
|
static const char payload[] = { 0x00, 0xFF, 0x12, 0x34 };
|
|
|
|
|
|
|
|
unsigned char buf[1024];
|
|
|
|
llc_frame_pack(&buf,
|
|
|
|
ptype,
|
|
|
|
src_net, src_node, src_socket,
|
|
|
|
dst_net, dst_node, dst_socket,
|
|
|
|
payload, sizeof(payload));
|
|
|
|
|
|
|
|
static const unsigned char expect[] = {
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x00, 0x25, /* Payload length */
|
|
|
|
|
|
|
|
/* LLC header */
|
|
|
|
0xE0, /* DSAP */
|
|
|
|
0xE0, /* SSAP */
|
|
|
|
0x03, /* Control */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x22, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
|
|
|
|
/* Payload */
|
|
|
|
0x00, 0xFF, 0x12, 0x34,
|
|
|
|
};
|
|
|
|
|
|
|
|
is_blob(expect, buf, sizeof(expect), "llc_frame_pack() serialises correctly");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* +------------------+
|
|
|
|
* | llc_frame_unpack |
|
|
|
|
* +------------------+
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Frame with smallest possible IPX packet (30 bytes) */
|
|
|
|
UNPACK_GOOD_FRAME(llc_frame_unpack,
|
|
|
|
"frame with 30 byte packet",
|
|
|
|
|
|
|
|
17, /* Offset of IPX packet */
|
|
|
|
30, /* Length of IPX packet */
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
47,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x00, 0x21, /* Payload length */
|
|
|
|
|
|
|
|
/* LLC header */
|
|
|
|
0xE0, /* DSAP */
|
|
|
|
0xE0, /* SSAP */
|
|
|
|
0x03, /* Control */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1E, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Frame with an Ethernet II Ethertype rather than a length */
|
|
|
|
UNPACK_BAD_FRAME(llc_frame_unpack,
|
|
|
|
"frame with 30 byte packet and an Ethertype",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
47,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x81, 0x37, /* Ethertype */
|
|
|
|
|
|
|
|
/* LLC header */
|
|
|
|
0xE0, /* DSAP */
|
|
|
|
0xE0, /* SSAP */
|
|
|
|
0x03, /* Control */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1E, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Frame with largest allowable IPX packet (1497 bytes) */
|
|
|
|
UNPACK_GOOD_FRAME(llc_frame_unpack,
|
|
|
|
"frame with 1497 byte packet",
|
|
|
|
|
|
|
|
17, /* Offset of IPX packet */
|
|
|
|
1497, /* Length of IPX packet */
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
1514,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x05, 0xDC, /* Payload length */
|
|
|
|
|
|
|
|
/* LLC header */
|
|
|
|
0xE0, /* DSAP */
|
|
|
|
0xE0, /* SSAP */
|
|
|
|
0x03, /* Control */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x05, 0xD9, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
|
|
|
|
/* IPX payload (uninitialised) */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Frame with 1501 length header (undefined behaviour) */
|
|
|
|
UNPACK_BAD_FRAME(llc_frame_unpack,
|
|
|
|
"frame with 1498 byte packet",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
1515,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x05, 0xDD, /* Payload length */
|
|
|
|
|
|
|
|
/* LLC header */
|
|
|
|
0xE0, /* DSAP */
|
|
|
|
0xE0, /* SSAP */
|
|
|
|
0x03, /* Control */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x05, 0xDA, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
|
|
|
|
/* IPX payload (uninitialised) */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Valid IPX packet within, but Ethernet payload length is too short */
|
|
|
|
UNPACK_BAD_FRAME(llc_frame_unpack,
|
|
|
|
"frame with valid packet but 32 bytes in length header",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
47,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x00, 0x20, /* Payload length */
|
|
|
|
|
|
|
|
/* LLC header */
|
|
|
|
0xE0, /* DSAP */
|
|
|
|
0xE0, /* SSAP */
|
|
|
|
0x03, /* Control */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1E, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Frame too short to hold all the headers */
|
|
|
|
UNPACK_BAD_FRAME(llc_frame_unpack,
|
|
|
|
"truncated frame - too short",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
46,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x00, 0x20, /* Payload length */
|
|
|
|
|
|
|
|
/* LLC header */
|
|
|
|
0xE0, /* DSAP */
|
|
|
|
0xE0, /* SSAP */
|
|
|
|
0x03, /* Control */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1D, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, /* Source socket (truncated) */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Length runs past frame end */
|
|
|
|
UNPACK_BAD_FRAME(llc_frame_unpack,
|
|
|
|
"truncated frame - length runs past end",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
47,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x00, 0x22, /* Payload length */
|
|
|
|
|
|
|
|
/* LLC header */
|
|
|
|
0xE0, /* DSAP */
|
|
|
|
0xE0, /* SSAP */
|
|
|
|
0x03, /* Control */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1F, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
);
|
|
|
|
|
|
|
|
/* Wrong DSAP */
|
|
|
|
UNPACK_BAD_FRAME(llc_frame_unpack,
|
|
|
|
"frame with wrong DSAP",
|
|
|
|
|
|
|
|
/* Frame length */
|
|
|
|
47,
|
|
|
|
|
|
|
|
/* Ethernet header */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination MAC */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source MAC */
|
|
|
|
0x00, 0x21, /* Payload length */
|
|
|
|
|
|
|
|
/* LLC header */
|
|
|
|
0xE1, /* DSAP */
|
|
|
|
0xE0, /* SSAP */
|
|
|
|
0x03, /* Control */
|
|
|
|
|
|
|
|
/* IPX header */
|
|
|
|
0xFF, 0xFF, /* Checksum */
|
|
|
|
0x00, 0x1E, /* Length */
|
|
|
|
0x00, /* Hops */
|
|
|
|
0x42, /* Type */
|
|
|
|
|
|
|
|
0xBE, 0xEF, 0x0D, 0xAD, /* Destination network */
|
|
|
|
0x99, 0xB0, 0x77, 0x1E, 0x50, 0x00, /* Destination node */
|
|
|
|
0x26, 0x94, /* Destination socket */
|
|
|
|
|
|
|
|
0xDE, 0xAD, 0xBE, 0xEF, /* Source network */
|
|
|
|
0x0B, 0xAD, 0x0B, 0xEE, 0xF0, 0x0D, /* Source node */
|
|
|
|
0x04, 0xD2, /* Source socket */
|
|
|
|
);
|
|
|
|
|
2017-03-29 20:34:32 +01:00
|
|
|
return 0;
|
|
|
|
}
|