From b58ef3eb1eff3b4906328deff6e782e68dd29f7a Mon Sep 17 00:00:00 2001 From: Daniel Collins Date: Sun, 20 Aug 2017 16:44:49 +0100 Subject: [PATCH] getsockopt: Return correct maxpkt when using Ethernet frame types. --- src/winsock.c | 4 +-- tests/15-interfaces.t | 64 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/winsock.c b/src/winsock.c index d198427..50e8796 100644 --- a/src/winsock.c +++ b/src/winsock.c @@ -58,10 +58,10 @@ static int _max_ipx_payload(void) { case FRAME_TYPE_ETH_II: case FRAME_TYPE_NOVELL: - return 1500 - (14 + sizeof(novell_ipx_packet)); + return 1500 - sizeof(novell_ipx_packet); case FRAME_TYPE_LLC: - return 1500 - (17 + sizeof(novell_ipx_packet)); + return 1500 - (3 + sizeof(novell_ipx_packet)); } abort(); diff --git a/tests/15-interfaces.t b/tests/15-interfaces.t index 0236d06..b968877 100644 --- a/tests/15-interfaces.t +++ b/tests/15-interfaces.t @@ -33,6 +33,7 @@ our ($remote_mac_b, $remote_ip_b); use constant { IP_MAX_DATA_SIZE => 8192, ETHER_MAX_DATA_SIZE => 1470, + LLC_MAX_DATA_SIZE => 1467, }; my @expected_addrs; @@ -173,6 +174,7 @@ describe "IPXWrapper" => sub { reg_delete_key($remote_ip_a, "HKCU\\Software\\IPXWrapper"); reg_set_dword( $remote_ip_a, "HKCU\\Software\\IPXWrapper", "use_pcap", 1); + reg_set_dword( $remote_ip_a, "HKCU\\Software\\IPXWrapper", "frame_type", 1); reg_set_addr( $remote_ip_a, "HKCU\\Software\\IPXWrapper\\$remote_mac_a", "net", "00:00:00:01"); reg_set_addr( $remote_ip_a, "HKCU\\Software\\IPXWrapper\\$remote_mac_b", "net", "00:00:00:02"); @@ -196,6 +198,68 @@ describe "IPXWrapper" => sub it_should_behave_like "getsockopt"; }; }; + + describe "using Novell Ethernet encapsulation" => sub + { + before all => sub + { + reg_delete_key($remote_ip_a, "HKCU\\Software\\IPXWrapper"); + reg_set_dword( $remote_ip_a, "HKCU\\Software\\IPXWrapper", "use_pcap", 1); + reg_set_dword( $remote_ip_a, "HKCU\\Software\\IPXWrapper", "frame_type", 2); + reg_set_addr( $remote_ip_a, "HKCU\\Software\\IPXWrapper\\$remote_mac_a", "net", "00:00:00:01"); + reg_set_addr( $remote_ip_a, "HKCU\\Software\\IPXWrapper\\$remote_mac_b", "net", "00:00:00:02"); + + @expected_addrs = ( + { + net => "00:00:00:01", + node => $remote_mac_a, + maxpkt => ETHER_MAX_DATA_SIZE, + }, + + { + net => "00:00:00:02", + node => $remote_mac_b, + maxpkt => ETHER_MAX_DATA_SIZE, + }, + ); + }; + + describe "getsockopt" => sub + { + it_should_behave_like "getsockopt"; + }; + }; + + describe "using LLC (802.2) Ethernet encapsulation" => sub + { + before all => sub + { + reg_delete_key($remote_ip_a, "HKCU\\Software\\IPXWrapper"); + reg_set_dword( $remote_ip_a, "HKCU\\Software\\IPXWrapper", "use_pcap", 1); + reg_set_dword( $remote_ip_a, "HKCU\\Software\\IPXWrapper", "frame_type", 3); + reg_set_addr( $remote_ip_a, "HKCU\\Software\\IPXWrapper\\$remote_mac_a", "net", "00:00:00:01"); + reg_set_addr( $remote_ip_a, "HKCU\\Software\\IPXWrapper\\$remote_mac_b", "net", "00:00:00:02"); + + @expected_addrs = ( + { + net => "00:00:00:01", + node => $remote_mac_a, + maxpkt => LLC_MAX_DATA_SIZE, + }, + + { + net => "00:00:00:02", + node => $remote_mac_b, + maxpkt => LLC_MAX_DATA_SIZE, + }, + ); + }; + + describe "getsockopt" => sub + { + it_should_behave_like "getsockopt"; + }; + }; }; sub get_first_addr_node