Difference between revisions of "HECnet"
From Computer History Wiki
(Home page moved.) |
|||
(4 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
+ | The HECnet is a network of various DECNET machines across the internet. Using a [http://mim.stupi.net/bridge.tar specialized bridge program], people have bridged together their systems. | ||
+ | |||
+ | From the [http://mim.stupi.net/hecnet.htm homepage]: | ||
+ | <pre> | ||
+ | What is HECnet? | ||
+ | |||
+ | HECnet is a DECnet that connects different people who play around with different DEC machines. | ||
+ | The network should not be regarded as a serious networking setup, nor should it be expected | ||
+ | to work 24/7. It's a hobby project between people who think it's fun to create a DECnet network. | ||
+ | HECnet is basically a DECnet phase IV network. Currently, the main router is a PDP-11 | ||
+ | running RSX-11M-PLUS. The machine is located in Uppsala, Sweden. | ||
+ | |||
+ | The connectivity between nodes can be anything that works. The current connectivity is with | ||
+ | an ethernet bridge between sites. Other solutions that have been used are a virtual serial | ||
+ | async. connection talking DDCMP. Other possibilities are GRE and DECnet over IP. | ||
+ | </pre> | ||
+ | |||
+ | There is also an Italian HECnet with quite a few nodes online... | ||
+ | *http://decnet.ipv7.net/ | ||
+ | |||
+ | == Patch to bridge to add TCP/IP support == | ||
+ | The following will add TCP/IP support into the above bridge program. On the [[Networking with SIMH]] page you can find the code section to compile a HECnet client into [[SIMH]]. | ||
+ | |||
+ | <pre> | ||
+ | --- bridge.c Mon Aug 6 07:50:45 2007 | ||
+ | +++ bridge-ip.c Sun Feb 15 12:23:43 2009 | ||
+ | @@ -61,6 +61,9 @@ | ||
+ | #define ETHERTYPE_LAT 0x6004 | ||
+ | #define ETHERTYPE_MOPDL 0x6001 | ||
+ | #define ETHERTYPE_MOPRC 0x6002 | ||
+ | +#define ETHERTYPE_IP 0x0800 | ||
+ | +#define ETHERTYPE_ARP 0x0806 | ||
+ | +#define ETHERTYPE_REVARP 0x8035 | ||
+ | |||
+ | #define MAX(a,b) (a>b?a:b) | ||
+ | |||
+ | @@ -71,6 +74,9 @@ | ||
+ | |||
+ | struct bpf_insn insns[] = { | ||
+ | BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12), | ||
+ | + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_REVARP, 7, 0), | ||
+ | + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_ARP, 6, 0), | ||
+ | + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_IP, 5, 0), | ||
+ | BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_MOPRC, 4, 0), | ||
+ | BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_MOPDL, 3, 0), | ||
+ | BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_LAT, 2, 0), | ||
+ | @@ -95,8 +101,8 @@ | ||
+ | When data arrives, we filter, process and send it out again. | ||
+ | */ | ||
+ | |||
+ | -typedef enum {DECnet, LAT} pkttyp; | ||
+ | -#define MAXTYP 2 | ||
+ | +typedef enum {DECnet, LAT, IP} pkttyp; | ||
+ | +#define MAXTYP 3 | ||
+ | |||
+ | struct BRIDGE { | ||
+ | char name[40]; | ||
+ | @@ -326,6 +332,7 @@ | ||
+ | if(strcmp(buf,"[lat]") == 0) mode = 2; | ||
+ | if(sscanf(buf,"[source %d.%d]", &area, &node) == 2) mode = 3; | ||
+ | if(strcmp(buf,"[relay]") == 0) mode = 4; | ||
+ | + if(strcmp(buf,"[ip]") == 0) mode = 5; | ||
+ | if(mode < 0) { | ||
+ | printf("Bad configuration at line %d\n%s\n", line,buf); | ||
+ | exit(1); | ||
+ | @@ -352,6 +359,10 @@ | ||
+ | break; | ||
+ | case 4: | ||
+ | break; | ||
+ | + case 5: | ||
+ | + if (!add_service(buf,IP,"IP")) | ||
+ | + printf("%d: IP bridge %s don't exist.\n", line, buf); | ||
+ | + break; | ||
+ | default: | ||
+ | printf("weird state at line %d\n",line); | ||
+ | exit(1); | ||
+ | @@ -380,6 +391,14 @@ | ||
+ | is_ethertype(data, ETHERTYPE_MOPRC)); | ||
+ | } | ||
+ | |||
+ | +int is_ip(struct DATA *data) | ||
+ | +{ | ||
+ | + return (is_ethertype(data, ETHERTYPE_IP) || | ||
+ | + is_ethertype(data, ETHERTYPE_ARP) || | ||
+ | + is_ethertype(data, ETHERTYPE_REVARP)); | ||
+ | +} | ||
+ | + | ||
+ | + | ||
+ | unsigned long timedelta(struct timeval old) | ||
+ | { | ||
+ | struct timeval now; | ||
+ | @@ -496,6 +515,8 @@ | ||
+ | |||
+ | if (is_decnet(d)) d->type = DECnet; | ||
+ | if (is_lat(d)) d->type = LAT; | ||
+ | + if (is_ip(d)) d->type = IP; | ||
+ | + | ||
+ | |||
+ | if (bridge[d->source].types[d->type] == 0) return; | ||
+ | if (d->type == -1) return; | ||
+ | </pre> | ||
+ | |||
+ | |||
{{stub}} | {{stub}} | ||
+ | |||
[[Category:DECnet]] | [[Category:DECnet]] |
Latest revision as of 11:05, 4 March 2022
The HECnet is a network of various DECNET machines across the internet. Using a specialized bridge program, people have bridged together their systems.
From the homepage:
What is HECnet? HECnet is a DECnet that connects different people who play around with different DEC machines. The network should not be regarded as a serious networking setup, nor should it be expected to work 24/7. It's a hobby project between people who think it's fun to create a DECnet network. HECnet is basically a DECnet phase IV network. Currently, the main router is a PDP-11 running RSX-11M-PLUS. The machine is located in Uppsala, Sweden. The connectivity between nodes can be anything that works. The current connectivity is with an ethernet bridge between sites. Other solutions that have been used are a virtual serial async. connection talking DDCMP. Other possibilities are GRE and DECnet over IP.
There is also an Italian HECnet with quite a few nodes online...
Patch to bridge to add TCP/IP support
The following will add TCP/IP support into the above bridge program. On the Networking with SIMH page you can find the code section to compile a HECnet client into SIMH.
--- bridge.c Mon Aug 6 07:50:45 2007 +++ bridge-ip.c Sun Feb 15 12:23:43 2009 @@ -61,6 +61,9 @@ #define ETHERTYPE_LAT 0x6004 #define ETHERTYPE_MOPDL 0x6001 #define ETHERTYPE_MOPRC 0x6002 +#define ETHERTYPE_IP 0x0800 +#define ETHERTYPE_ARP 0x0806 +#define ETHERTYPE_REVARP 0x8035 #define MAX(a,b) (a>b?a:b) @@ -71,6 +74,9 @@ struct bpf_insn insns[] = { BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12), + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_REVARP, 7, 0), + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_ARP, 6, 0), + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_IP, 5, 0), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_MOPRC, 4, 0), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_MOPDL, 3, 0), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_LAT, 2, 0), @@ -95,8 +101,8 @@ When data arrives, we filter, process and send it out again. */ -typedef enum {DECnet, LAT} pkttyp; -#define MAXTYP 2 +typedef enum {DECnet, LAT, IP} pkttyp; +#define MAXTYP 3 struct BRIDGE { char name[40]; @@ -326,6 +332,7 @@ if(strcmp(buf,"[lat]") == 0) mode = 2; if(sscanf(buf,"[source %d.%d]", &area, &node) == 2) mode = 3; if(strcmp(buf,"[relay]") == 0) mode = 4; + if(strcmp(buf,"[ip]") == 0) mode = 5; if(mode < 0) { printf("Bad configuration at line %d\n%s\n", line,buf); exit(1); @@ -352,6 +359,10 @@ break; case 4: break; + case 5: + if (!add_service(buf,IP,"IP")) + printf("%d: IP bridge %s don't exist.\n", line, buf); + break; default: printf("weird state at line %d\n",line); exit(1); @@ -380,6 +391,14 @@ is_ethertype(data, ETHERTYPE_MOPRC)); } +int is_ip(struct DATA *data) +{ + return (is_ethertype(data, ETHERTYPE_IP) || + is_ethertype(data, ETHERTYPE_ARP) || + is_ethertype(data, ETHERTYPE_REVARP)); +} + + unsigned long timedelta(struct timeval old) { struct timeval now; @@ -496,6 +515,8 @@ if (is_decnet(d)) d->type = DECnet; if (is_lat(d)) d->type = LAT; + if (is_ip(d)) d->type = IP; + if (bridge[d->source].types[d->type] == 0) return; if (d->type == -1) return;