HECnet

From Computer History Wiki
Jump to: navigation, search

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;