From 85e1957fd0e66e359ed28692ad8c65dfa503b657 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 10 Oct 2025 17:53:57 -1000 Subject: [PATCH] ETHER: Coalesce Ethernet devices with consistent hierarchical attach help Migrate platform dependencies into sim_ether's help rather that scattered amongst each functional Ethernet device. --- 3B2/3b2_ni.c | 28 ++-------- PDP11/pdp11_xq.c | 75 ++------------------------ PDP11/pdp11_xu.c | 75 ++------------------------ sim_ether.c | 104 +++++++++++++++++++++++------------- sim_ether.h | 56 ++++++++++++++++++++ slirp_glue/sim_slirp.c | 116 ++++++++++++++++++++++++----------------- slirp_glue/sim_slirp.h | 2 +- 7 files changed, 202 insertions(+), 254 deletions(-) diff --git a/3B2/3b2_ni.c b/3B2/3b2_ni.c index 7e301132..4dc00109 100644 --- a/3B2/3b2_ni.c +++ b/3B2/3b2_ni.c @@ -1081,31 +1081,9 @@ t_stat ni_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) " Please note, however, that the %D driver for AT&T System V R3 UNIX\n" " always sets a MAC in the AT&T range through a software command.\n" "1 Attaching\n" - " The %D card must be attached to a LAN device to communicate with systems\n" - " on the LAN.\n" - "\n" - " To get a list of available devices on your host platform, use the command:\n" - "\n" - "+sim> SHOW ETH\n" - "\n" - " After enabling the card, it can be attached to one of the host's\n" - " Ethernet devices with the ATTACH command. For example, depending on your\n" - " platform:\n" - "\n" - "+sim> ATTACH %D eth0\n" - "+sim> ATTACH %D en0\n" - "1 Dependencies\n" -#if defined(_WIN32) - " The NPcap or WinPcap package must be installed in order to enable\n" - " communication with the host system or other computers on the local LAN.\n" - "\n" - " The NPcap package is available from https://github.com/nmap/npcap\n" - " The WinPcap package is available from http://www.winpcap.org/\n" -#else - " To build simulators with the ability to communicate to other computers\n" - " on the local LAN, the libpcap development package must be installed on\n" - " the system which builds the simulator.\n" -#endif + " %1A\n" + ETH_PLATFORM_SCP_DETAILS + /****************************************************************************/ "1 Performance\n" " The simulated NI device is capable of much faster transfer speeds than\n" " the real NI card in a 3B2, which was limited to a 10 Mbit pipe shared\n" diff --git a/PDP11/pdp11_xq.c b/PDP11/pdp11_xq.c index 7ba1e78a..057d9c55 100644 --- a/PDP11/pdp11_xq.c +++ b/PDP11/pdp11_xq.c @@ -3298,47 +3298,7 @@ const char helpString[] = "\n" /****************************************************************************/ "2 Attach\n" - " The device must be attached to a LAN device to communicate with systems\n" - " on that LAN\n" - "\n" - "+sim> SHOW %D ETH\n" - "+ETH devices:\n" -#if defined(_WIN32) - "+ eth0 \\Device\\NPF_{A6F81789-B849-4220-B09B-19760D401A38} (Local Area Connection)\n" - "+ eth1 udp:sourceport:remotehost:remoteport (Integrated UDP bridge support)\n" - "+sim> ATTACH %D eth0\n" -#else - "+ eth0 en0 (No description available)\n" - "+ eth1 tap:tapN (Integrated Tun/Tap support)\n" - "+ eth2 udp:sourceport:remotehost:remoteport (Integrated UDP bridge support)\n" - "+sim> ATTACH %D eth0\n" - "+sim> ATTACH %D en0\n" -#endif - "+sim> ATTACH %D udp:1234:remote.host.com:1234\n" - "\n" - "2 Examples\n\n" - " Given a simulator that only wants to talk IP to the outside world use\n" - " the following example:\n" - " \n" - "+sim> ATTACH %D NAT:\n" - " \n" - " Given a simulator that only wants to talk IP but also wants to allow\n" - " incoming telnet use the following example:\n" - " \n" - "+sim> ATTACH %D NAT:tcp=2323:10.0.2.15:23\n" - " \n" - " This allows connections to host port 2323 to reach port 23 on the\n" - " simulated which is configured with IP Address 10.0.2.15\n" - "\n" - " Given a simulator that only wants to talk IP but also wants to allow\n" - " incoming telnet and ftp use the following example:\n" - " \n" - "+sim> ATTACH %D NAT:tcp=2323:10.0.2.15:23,tcp=2121:10.0.2.15:21\n" - " \n" - " This allows connections to host port 2323 to reach port 23 on the\n" - " simulated which is configured with IP Address 10.0.2.15 and connections\n" - " to host port 2121 to reach port 21 on the simulated system.\n" - "\n" + " %2A\n" "1 Monitoring\n" " The %D device configuration and state can be displayed with one of the\n" " available show commands.\n" @@ -3376,35 +3336,7 @@ const char helpString[] = "+sim> SET %D DEBUG\n" "\n" /****************************************************************************/ - "1 Dependencies\n" -#if defined(_WIN32) - " The NPcap or WinPcap package must be installed in order to enable\n" - " communication with the host system or other computers on the local LAN.\n" - "\n" - " The NPcap package is available from https://github.com/nmap/npcap\n" - " The WinPcap package is available from http://www.winpcap.org/\n" -#else - " To build simulators with the ability to communicate to other computers\n" - " on the local LAN, the libpcap development package must be installed on\n" - " the system which builds the simulator.\n" - "\n" -#endif - "1 Privileges Required\n" -#if defined(_WIN32) - " Windows systems can attach the simulated %D device to the local LAN\n" - " network interface without any special privileges as long as the\n" - " WinPcap package has been previously installed on the host system.\n" -#else - " Linux, MacOS and most other Unix like systems require root privilege\n" - " to access network interfaces on the host system.\n" -#endif - "1 Host Computer Communications\n" -#if defined(_WIN32) - " On Windows using the WinPcap interface, the simulated %D device\n" - " can be used to communicate with the host computer on the same LAN\n" - " which it is attached to.\n" -#else -#endif + ETH_PLATFORM_SCP_DETAILS /****************************************************************************/ "1 Performance\n" " On modern host systems and networks, the simulated DEQNA/DELQA/DELQA-T\n" @@ -3426,8 +3358,7 @@ const char helpString[] = "++XS VAX simulators\n" "++NI AT&T 3b2 simulator\n" "++NIA-20 KL10 simulator\n" - "\n" - ; + "\n"; return scp_help (st, dptr, uptr, flag, helpString, cptr); } diff --git a/PDP11/pdp11_xu.c b/PDP11/pdp11_xu.c index 08de6fe1..1184b1c8 100644 --- a/PDP11/pdp11_xu.c +++ b/PDP11/pdp11_xu.c @@ -1996,47 +1996,7 @@ const char helpString[] = "\n" /****************************************************************************/ "2 Attach\n" - " The device must be attached to a LAN device to communicate with systems\n" - " on that LAN\n" - "\n" - "+sim> SHOW %D ETH\n" - "+ETH devices:\n" -#if defined(_WIN32) - "+ eth0 \\Device\\NPF_{A6F81789-B849-4220-B09B-19760D401A38} (Local Area Connection)\n" - "+ eth1 udp:sourceport:remotehost:remoteport (Integrated UDP bridge support)\n" - "+sim> ATTACH %D eth0\n" -#else - "+ eth0 en0 (No description available)\n" - "+ eth1 tap:tapN (Integrated Tun/Tap support)\n" - "+ eth2 udp:sourceport:remotehost:remoteport (Integrated UDP bridge support)\n" - "+sim> ATTACH %D eth0\n" - "+sim> ATTACH %D en0\n" -#endif - "+sim> ATTACH %D udp:1234:remote.host.com:1234\n" - "\n" - "2 Examples\n\n" - " Given a simulator that only wants to talk IP to the outside world use\n" - " the following example:\n" - " \n" - "+sim> ATTACH %D NAT:\n" - " \n" - " Given a simulator that only wants to talk IP but also wants to allow\n" - " incoming telnet use the following example:\n" - " \n" - "+sim> ATTACH %D NAT:tcp=2323:10.0.2.15:23\n" - " \n" - " This allows connections to host port 2323 to reach port 23 on the\n" - " simulated which is configured with IP Address 10.0.2.15\n" - "\n" - " Given a simulator that only wants to talk IP but also wants to allow\n" - " incoming telnet and ftp use the following example:\n" - " \n" - "+sim> ATTACH %D NAT:tcp=2323:10.0.2.15:23,tcp=2121:10.0.2.15:21\n" - " \n" - " This allows connections to host port 2323 to reach port 23 on the\n" - " simulated which is configured with IP Address 10.0.2.15 and connections\n" - " to host port 2121 to reach port 21 on the simulated system.\n" - "\n" + " %2A\n" "1 Monitoring\n" " The %D device configuration and state can be displayed with one of the\n" " available show commands.\n" @@ -2056,35 +2016,7 @@ const char helpString[] = "+sim> SET %D DEBUG\n" "\n" /****************************************************************************/ - "1 Dependencies\n" -#if defined(_WIN32) - " The NPcap or WinPcap package must be installed in order to enable\n" - " communication with the host system or other computers on the local LAN.\n" - "\n" - " The NPcap package is available from https://github.com/nmap/npcap\n" - " The WinPcap package is available from http://www.winpcap.org/\n" -#else - " To build simulators with the ability to communicate to other computers\n" - " on the local LAN, the libpcap development package must be installed on\n" - " the system which builds the simulator.\n" - "\n" -#endif - "1 Privileges Required\n" -#if defined(_WIN32) - " Windows systems can attach the simulated %D device to the local LAN\n" - " network interface without any special privileges as long as the\n" - " WinPcap package has been previously installed on the host system.\n" -#else - " Linux, MacOS and most other Unix like systems require root privilege\n" - " to access network interfaces on the host system.\n" -#endif - "1 Host Computer Communications\n" -#if defined(_WIN32) - " On Windows using the WinPcap interface, the simulated %D device\n" - " can be used to communicate with the host computer on the same LAN\n" - " which it is attached to.\n" -#else -#endif + ETH_PLATFORM_SCP_DETAILS /****************************************************************************/ "1 Performance\n" " On modern host systems and networks, the simulated DEUNA/DELUA\n" @@ -2106,8 +2038,7 @@ const char helpString[] = "++XS VAX simulators\n" "++NI AT&T 3b2 simulator\n" "++NIA-20 KL10 simulator\n" - "\n" - ; + "\n"; return scp_help (st, dptr, uptr, flag, helpString, cptr); } diff --git a/sim_ether.c b/sim_ether.c index 77c5bee0..0194d6b3 100644 --- a/sim_ether.c +++ b/sim_ether.c @@ -1080,6 +1080,10 @@ t_stat eth_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const cha fprintf (st, "This simulator was not built with ethernet device support\n"); return SCPE_OK; } +const char *eth_attach_scp_help_string (DEVICE *dptr) + { + return ""; + } t_stat eth_check_address_conflict (ETH_DEV* dev, ETH_MAC* const mac) {return SCPE_NOFNC;} @@ -1393,7 +1397,6 @@ static t_bool eth_vde_network_available = FALSE; const char *eth_capabilities(void) { static char capabilities[CBUFSIZE] = ""; - char cap_env[2*CBUFSIZE]; if (capabilities[0] != '\0') return capabilities; @@ -1427,8 +1430,6 @@ const char *eth_capabilities(void) strlcat (capabilities, ":NAT", sizeof (capabilities)); #endif strlcat (capabilities, ":UDP", sizeof (capabilities)); - snprintf (cap_env, sizeof(cap_env), "SIM_ETHER_CAPABILITIES=%s", capabilities); - sim_set_environment (0, cap_env); return capabilities; } @@ -3553,55 +3554,86 @@ strlcat (version, pcap_lib_version(), sizeof (version)); return version; } -t_stat eth_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) +const char *eth_attach_scp_help_string (DEVICE *dptr) { -fprintf (st, "%s attach help\n\n", dptr->name); -fprintf (st, " sim> SHOW ETHERNET\n"); -fprintf (st, " Ethernet Packet Info: %s\n", eth_version()); -fprintf (st, " ETH devices:\n"); +static char *eth_device_help_string = NULL; + +if ((eth_device_help_string != NULL) && + (strstr (eth_device_help_string, dptr->name) == NULL)) { + free (eth_device_help_string); + eth_device_help_string = NULL; + } +if (eth_device_help_string == NULL) { + MFILE *f = MOpen (); + + if (f != NULL) { + Mprintf (f, " The device must be attached to a LAN device to communicate with systems\n"); + Mprintf (f, " on that LAN.\n\n"); + Mprintf (f, "+sim> SHOW ETHERNET\n"); + Mprintf (f, "+Ethernet Packet Info: %s\n", eth_version()); + Mprintf (f, "+ETH devices:\n"); +#if defined(_WIN32) + Mprintf (f, "+eth0 \\Device\\NPF_{A6F81789-B849-4220-B09B-19760D401A38} (Local Area Connection)\n"); + Mprintf (f, "+eth1 udp:sourceport:remotehost:remoteport (Integrated UDP bridge support)\n"); +#if defined(HAVE_SLIRP_NETWORK) + Mprintf (f, "+eth3 nat:{optional-nat-parameters} (Integrated NAT (SLiRP) support)\n"); +#endif +#else #if defined(HAVE_VMNET_NETWORK) -fprintf (st, " eth0 en0 (Integrated bridged network (vmnet) support\n"); -fprintf (st, " Host IPv4 Address: 192.168.86.114/24\n"); -fprintf (st, " LinkType: Ethernet\n"); -fprintf (st, " MediaState: connected)\n"); -fprintf (st, " eth1 en1 (Integrated bridged network (vmnet) support\n"); -fprintf (st, " LinkType: WiFi\n"); -fprintf (st, " MediaState: disconnected)\n"); -fprintf (st, " eth2 tap:tapN{,HOSTIP=address/masklen} (Integrated host-only (vmnet) support)\n"); + Mprintf (f, "+eth0 en0 (Integrated bridged network (vmnet) support\n"); + Mprintf (f, " Host IPv4 Address: 192.168.86.114/24\n"); + Mprintf (f, " LinkType: Ethernet\n"); + Mprintf (f, " MediaState: connected)\n"); + Mprintf (f, "+eth1 en1 (Integrated bridged network (vmnet) support\n"); + Mprintf (f, " LinkType: WiFi\n"); + Mprintf (f, " MediaState: disconnected)\n"); + Mprintf (f, "+eth2 tap:tapN{,HOSTIP=address/masklen} (Integrated host-only (vmnet) support)\n"); #if defined(USE_VMNET_SHARED_AS_NAT) -fprintf (st, " eth3 nat:{optional-nat-parameters} (Integrated NAT (vmnet) support)\n"); + Mprintf (f, "+eth3 nat:{optional-nat-parameters} (Integrated NAT (vmnet) support)\n"); #else #if defined(HAVE_SLIRP_NETWORK) -fprintf (st, " eth3 nat:{optional-nat-parameters} (Integrated NAT (SLiRP) support)\n"); + Mprintf (f, "+eth3 nat:{optional-nat-parameters} (Integrated NAT (SLiRP) support)\n"); #endif #endif #else /* !defined(HAVE_VMNET_NETWORK) */ -fprintf (st, " eth0 en0 (No description available)\n"); + Mprintf (f, "+eth0 en0 (No description available)\n"); #if defined(HAVE_TAP_NETWORK) -fprintf (st, " eth1 tap:tapN (Integrated Tun/Tap support)\n"); + Mprintf (f, "+eth1 tap:tapN (Integrated Tun/Tap support)\n"); #endif #if defined(HAVE_VDE_NETWORK) -if (eth_vde_network_available) - fprintf (st, " eth2 vde:device{:switch-port-number} (Integrated VDE support)\n"); + if (eth_vde_network_available) + Mprintf (f, "+eth2 vde:device{:switch-port-number} (Integrated VDE support)\n"); #endif #if defined(HAVE_SLIRP_NETWORK) -fprintf (st, " eth3 nat:{optional-nat-parameters} (Integrated NAT (SLiRP) support)\n"); + Mprintf (f, "+eth3 nat:{optional-nat-parameters} (Integrated NAT (SLiRP) support)\n"); #endif #endif /* !defined(HAVE_VMNET_NETWORK) */ -fprintf (st, " eth4 udp:sourceport:remotehost:remoteport (Integrated UDP bridge support)\n"); -fprintf (st, " sim> ATTACH %s eth0\n\n", dptr->name); -fprintf (st, "or equivalently:\n\n"); -fprintf (st, " sim> ATTACH %s en0\n\n", dptr->name); -fprintf (st, "Additionally:\n\n"); -fprintf (st, " sim> ATTACH %s en1\n", dptr->name); -fprintf (st, " %%SIM-ERROR: Eth: OS device en1 is disconnected\n"); -fprintf (st, "To force a connection to a currently disconnected device:\n\n"); -fprintf (st, " sim> ATTACH -F %s en1\n", dptr->name); -fprintf (st, " %%SIM-INFO: Eth: OS device en1 is disconnected\n"); -fprintf (st, " %%SIM-INFO: Eth: opened OS device en1 - Integrated bridged network (vmnet) support\n\n"); -#if defined(HAVE_SLIRP_NETWORK) || defined(HAVE_VMNET_NETWORK) -sim_nat_attach_help (st, dptr, uptr, flag, cptr); + Mprintf (f, "+eth4 udp:sourceport:remotehost:remoteport (Integrated UDP bridge support)\n"); + Mprintf (f, "+sim> ATTACH %s eth0\n\n", dptr->name); + Mprintf (f, " or equivalently:\n\n"); + Mprintf (f, "+sim> ATTACH %s en0\n\n", dptr->name); #endif + Mprintf (f, "\n Additionally:\n\n"); + Mprintf (f, "+sim> ATTACH %s en1\n", dptr->name); + Mprintf (f, "+%%SIM-ERROR: Eth: OS device en1 is disconnected\n\n"); + Mprintf (f, " To force a connection to a currently disconnected device:\n\n"); + Mprintf (f, "+sim> ATTACH -F %s en1\n", dptr->name); + Mprintf (f, "+%%SIM-INFO: Eth: OS device en1 is disconnected\n"); + Mprintf (f, "+%%SIM-INFO: Eth: opened OS device en1 - Integrated bridged network (vmnet) support\n\n"); +#if defined(HAVE_SLIRP_NETWORK) || defined(HAVE_VMNET_NETWORK) + Mprintf (f, "%s", sim_nat_attach_scp_help (dptr)); +#endif + eth_device_help_string = MFileData (f); + MClose (f); + } + } +return eth_device_help_string; +} + +t_stat eth_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) +{ +fprintf (st, "%s attach help\n\n", dptr->name); +scp_help (st, dptr, uptr, flag, eth_attach_scp_help_string (dptr), cptr); return SCPE_OK; } diff --git a/sim_ether.h b/sim_ether.h index 48acf631..79d88170 100644 --- a/sim_ether.h +++ b/sim_ether.h @@ -348,6 +348,8 @@ t_stat eth_open (ETH_DEV* dev, const char* name, /* open ethernet interfa DEVICE* dptr, uint32 dbit); t_stat eth_close (ETH_DEV* dev); /* close ethernet interface */ t_stat eth_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); +const char *eth_attach_scp_help_string (DEVICE *dptr); +const char *eth_attach_flat_help_string (DEVICE *dptr); t_stat eth_write (ETH_DEV* dev, ETH_PACK* packet, /* write synchronous packet; */ ETH_PCALLBACK routine); /* callback when done */ int eth_read (ETH_DEV* dev, ETH_PACK* packet, /* read single packet; */ @@ -407,6 +409,60 @@ t_stat sim_ether_test (DEVICE *dptr, const char *cptr); /* unit test routine */ #define SIM_TEST(xxx) #endif + + /****************************************************************************/ +#if defined(_WIN32) +#define ETH_PLATFORM_SCP_DEPENDENCIES \ + "1 Dependencies\n" \ + " The NPcap or WinPcap package must be installed in order to enable\n" \ + " communication with the host system or other computers on the local LAN.\n" \ + "\n" \ + " The NPcap package is available from https://github.com/nmap/npcap\n" \ + " The WinPcap package is available from http://www.winpcap.org/\n" +#else /* !defined(_WIN32) */ +#define ETH_PLATFORM_SCP_DEPENDENCIES \ + "1 Dependencies\n" \ + " To build simulators with the ability to communicate to other computers\n" \ + " on the local LAN, the libpcap development package must be installed on\n" \ + " the system which builds the simulator.\n" \ + "\n" +#endif /* defined(_WIN32) */ + /****************************************************************************/ +#if defined(_WIN32) +#define ETH_PLATFORM_SCP_PRIVILEGES \ + "1 Privileges Required\n" \ + " Windows systems can attach the simulated %D device to the local LAN\n" \ + " network interface without any special privileges as long as the\n" \ + " Npcap or WinPcap package has been previously installed on the host system.\n" +#else /* !defined(_WIN32) */ +#define ETH_PLATFORM_SCP_PRIVILEGES \ + "1 Privileges Required\n" \ + " Linux, macOS and most other Unix like systems require root privilege\n" \ + " to access network interfaces on the host system.\n" +#endif /* defined(_WIN32) */ + /****************************************************************************/ +#if defined(_WIN32) +#define ETH_PLATFORM_SCP_HOST_COMMUNICATIONS \ + "1 Host Computer Communications\n" \ + " On Windows using the WinPcap interface, the simulated %D device\n" \ + " can be used to communicate with the host computer on the same LAN\n" \ + " which it is attached to.\n" +#else /* !defined(_WIN32) */ +#if defined(HAVE_VMNET_NETWORK) +#define ETH_PLATFORM_SCP_HOST_COMMUNICATIONS \ + "1 Host Computer Communications\n" \ + " On macOS using the LAN or WiFi interfaces, the simulated %D device\n" \ + " can be used to communicate with the host computer and other computers\n" \ + " on the same LAN as well as reaching beyond across the Internet.\n" +#else /* !defined(HAVE_VMNET_NETWORK) */ +#define ETH_PLATFORM_SCP_HOST_COMMUNICATIONS +#endif /* defined(HAVE_VMNET_NETWORK) */ +#endif /* defined(_WIN32) */ + /****************************************************************************/ +#define ETH_PLATFORM_SCP_DETAILS ETH_PLATFORM_SCP_DEPENDENCIES \ + ETH_PLATFORM_SCP_PRIVILEGES \ + ETH_PLATFORM_SCP_HOST_COMMUNICATIONS + #ifdef __cplusplus } #endif diff --git a/slirp_glue/sim_slirp.c b/slirp_glue/sim_slirp.c index b71c3d87..99278afb 100644 --- a/slirp_glue/sim_slirp.c +++ b/slirp_glue/sim_slirp.c @@ -662,54 +662,74 @@ while (rtmp) { } } -t_stat sim_nat_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) +const char *sim_nat_attach_scp_help(DEVICE *dptr) { -fprintf (st, "%s", -"NAT options:\n" -" DHCP{=dhcp_start_address} Enables DHCP server and specifies\n" -" guest LAN DHCP start IP address\n" -" BOOTFILE=bootfilename specifies DHCP returned Boot Filename\n" -" TFTP=tftp-base-path Enables TFTP server and specifies\n" -" base file path\n" -" NAMESERVER=nameserver_ipaddres specifies DHCP nameserver IP address\n" -" DNS=nameserver_ipaddres specifies DHCP nameserver IP address\n" -" DNSSEARCH=domain{:domain{:domain}} specifies DNS Domains search suffixes\n" -" GATEWAY=host_ipaddress{/masklen} specifies LAN gateway IP address\n" -" NETWORK=network_ipaddress{/masklen} specifies LAN network address\n" -" UDP=port:address:address's-port maps host UDP port to guest port\n" -" TCP=port:address:address's-port maps host TCP port to guest port\n" -" NODHCP disables DHCP server\n\n" -"Default NAT Options: GATEWAY=10.0.2.2, masklen=24(netmask is 255.255.255.0)\n" -" DHCP=10.0.2.15, NAMESERVER=10.0.2.3\n" -" Nameserver defaults to proxy traffic to host system's active nameserver\n\n" -"The 'address' field in the UDP and TCP port mappings are the simulated\n" -"(guest) system's IP address which, if DHCP allocated would default to\n" -"10.0.2.15 or could be statically configured to any address including\n" -"10.0.2.4 thru 10.0.2.14.\n\n" -"NAT limitations\n\n" -"There are four limitations of NAT mode which users should be aware of:\n\n" -" 1) ICMP protocol limitations:\n" -" Some frequently used network debugging tools (e.g. ping or tracerouting)\n" -" rely on the ICMP protocol for sending/receiving messages. While some\n" -" ICMP support is available on some hosts (ping may or may not work),\n" -" some other tools may not work reliably.\n\n" -" 2) Receiving of UDP broadcasts is not reliable:\n" -" The guest does not reliably receive broadcasts, since, in order to save\n" -" resources, it only listens for a certain amount of time after the guest\n" -" has sent UDP data on a particular port.\n\n" -" 3) Protocols such as GRE, DECnet, LAT and Clustering are unsupported:\n" -" Protocols other than TCP and UDP are not supported.\n\n" -" 4) Forwarding host ports < 1024 impossible:\n" -" On Unix-based hosts (e.g. Linux, Solaris, Mac OS X) it is not possible\n" -" to bind to ports below 1024 from applications that are not run by root.\n" -" As a result, if you try to configure such a port forwarding, the attach\n" -" will fail.\n\n" -"These limitations normally don't affect standard network use. But the\n" -"presence of NAT has also subtle effects that may interfere with protocols\n" -"that are normally working. One example is NFS, where the server is often\n" -"configured to refuse connections from non-privileged ports (i.e. ports not\n" -"below 1024).\n" -); -return SCPE_OK; +return "1 NAT options:\n" +"+DHCP{=dhcp_start_address} Enables DHCP server and specifies\n" +"++++++++++guest LAN DHCP start IP address\n" +"+BOOTFILE=bootfilename specifies DHCP returned Boot Filename\n" +"+TFTP=tftp-base-path Enables TFTP server and specifies\n" +"++++++++++base file path\n" +"+NAMESERVER=nameserver_ipaddres specifies DHCP nameserver IP address\n" +"+DNS=nameserver_ipaddres specifies DHCP nameserver IP address\n" +"+DNSSEARCH=domain{:domain{:domain}} specifies DNS Domains search suffixes\n" +"+GATEWAY=host_ipaddress{/masklen} specifies LAN gateway IP address\n" +"+NETWORK=network_ipaddress{/masklen} specifies LAN network address\n" +"+UDP=port:address:address's-port maps host UDP port to guest port\n" +"+TCP=port:address:address's-port maps host TCP port to guest port\n" +"+NODHCP disables DHCP server\n\n" +" Default NAT Options: GATEWAY=10.0.2.2, masklen=24(netmask is 255.255.255.0)\n" +"++++++DHCP=10.0.2.15, NAMESERVER=10.0.2.3\n" +"+Nameserver defaults to proxy traffic to host system's active nameserver\n\n" +" The 'address' field in the UDP and TCP port mappings are the simulated\n" +" (guest) system's IP address which, if DHCP allocated, would default to\n" +" 10.0.2.15 or could be statically configured to any address including\n" +" 10.0.2.4 thru 10.0.2.14.\n\n" +"1 NAT limitations\n\n" +" There are four limitations of NAT mode which users should be aware of:\n\n" +"+1) ICMP protocol limitations:\n" +"++Some frequently used network debugging tools (e.g. ping or traceroute)\n" +"++rely on the ICMP protocol for sending/receiving messages. While some\n" +"++ICMP support is available on some hosts (ping may or may not work),\n" +"++some other tools may not work reliably.\n\n" +"+2) Receiving of UDP broadcasts is not reliable:\n" +"++The guest does not reliably receive broadcasts, since, in order to save\n" +"++resources, it only listens for a certain amount of time after the guest\n" +"++has sent UDP data on a particular port.\n\n" +"+3) Protocols such as GRE, DECnet, LAT and Clustering are unsupported:\n" +"++Protocols other than TCP and UDP are not supported.\n\n" +"+4) Forwarding host ports < 1024 impossible:\n" +"++On Unix-based hosts (e.g. Linux, Solaris, Mac OS X) it is not possible\n" +"++to bind to ports below 1024 from applications that are not run by root.\n" +"++As a result, if you try to configure such a port forwarding, the attach\n" +"++will fail.\n\n" +" These limitations normally don't affect standard network use. But the\n" +" presence of NAT has also subtle effects that may interfere with protocols\n" +" that are normally working. One example is NFS, where the server is often\n" +" configured to refuse connections from non-privileged ports (i.e. ports not\n" +" below 1024).\n\n" +"1 NAT Examples\n\n" +" Given a simulator that only wants to talk IP to the outside world use\n" +" the following example:\n" +" \n" +"+sim> ATTACH %D NAT:\n" +" \n" +" Given a simulator that only wants to talk IP but also wants to allow\n" +" incoming telnet use the following example:\n" +" \n" +"+sim> ATTACH %D NAT:tcp=2323:10.0.2.15:23\n" +" \n" +" This allows connections to host port 2323 to reach port 23 on the\n" +" simulated which is configured with IP Address 10.0.2.15\n" +"\n" +" Given a simulator that only wants to talk IP but also wants to allow\n" +" incoming telnet and ftp use the following example:\n" +" \n" +"+sim> ATTACH %D NAT:tcp=2323:10.0.2.15:23,tcp=2121:10.0.2.15:21\n" +" \n" +" This allows connections to host port 2323 to reach port 23 on the\n" +" simulated which is configured with IP Address 10.0.2.15 and connections\n" +" to host port 2121 to reach port 21 on the simulated system.\n" +"\n"; } diff --git a/slirp_glue/sim_slirp.h b/slirp_glue/sim_slirp.h index ef860386..3454140a 100644 --- a/slirp_glue/sim_slirp.h +++ b/slirp_glue/sim_slirp.h @@ -44,7 +44,7 @@ int sim_slirp_select (SLIRP *slirp, int ms_timeout); void sim_slirp_dispatch (SLIRP *slirp); void sim_slirp_show (SLIRP *slirp, FILE *st); int sim_nat_parse_args (NAT *nat, const char *args, int nat_type, char *errbuf, size_t errbuf_size); -t_stat sim_nat_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); +const char *sim_nat_attach_scp_help(DEVICE *dptr); void sim_nat_show (NAT *nat, FILE *st); #endif /* HAVE_SLIRP_NETWORK */