diff options
Diffstat (limited to 'share/doc/iso/wisc/esis_design.nr')
-rw-r--r-- | share/doc/iso/wisc/esis_design.nr | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/share/doc/iso/wisc/esis_design.nr b/share/doc/iso/wisc/esis_design.nr new file mode 100644 index 0000000..437f3ee --- /dev/null +++ b/share/doc/iso/wisc/esis_design.nr @@ -0,0 +1,114 @@ +.NC "The Design of the ARGO Network Layer" +.sh 1 "End System to Intermediate System Routing Protocol" +.pp +The following sections describe the design of the End System to Intermediate +System (ES-IS) Routing Exchange Protocol. +.sh 2 "Overview" +.nf +- protocol involves sending/receiving hello pdus. +- timers determine + - when to send information + - when to discard information +- want to keep as much of the work outside of kernel +- only put functions and tables in kernel when necessary +.sh 2 "Supported Features (brief overview of each)" +- report configuration (both ES and IS) +- record configuration (both ES and IS) +- flush configuration (both ES and IS) +- query configuration (ES only) +- configuration response (ES only) +- request redirect (IS only) +- record redirect (ES only) +- flush old redirect (ES only) +- multicast vs. broadcast (using broadcast only) +.sh 2 "Kernel Resident Features" +.sh 3 "Support for PDU Transmission" +- need mechanism to send/receive PDUs +- utilize ES-IS socket (like raw socket) +- socket(AF_ISO, SOCK_DGRAM, ISOPROTO_ESIS) +.sh 4 "Sending PDUs" +- sendmsg() used for transmitting PDUS +- data will be pre-formed ES-IS PDU +- no checks will be made on the pdu format +- addr_snpa is the destination (to) +- before sending, socket must be associated with a particular interface + this is done via setsockopt(): + ESISOPT_SETIF - option + buffer is name of interface, ie. "un0" +.sh 4 "Receiving PDUs" +- recvmsg() used for receiving PDUs +- data will be: + #define ESIS_PDU + #define ESIS_CONFIG_RESP + #define ESIS_REDIR_REQ + struct esis_indication { + short ei_type; /* type of indication */ + union { + struct ? config_resp + struct ? redir_req + char pdu[0] + } ei_u; + } +- no checks will be made on the pdu format +- addr_snpa is the source (from) +.sh 4 "Addressing" +- ES-IS PDUs are sent to SNPA. +- addresses used are SN addresses, not NSAP addresses +- format of msg_name (part of msghdr) struct sockaddr_iso + afi = 0 /* means special snpa address */ + isoa_u is struct addr_snpa + struct addr_snpa { + char sn_addr[7]; /* snpa addr */ + } + isoa_len is number of bytes of sn_addr that are valid + +- sn_addr may be a unicast or multicast address +- multicast addresses will be faked via broadcast addresses +.sh 3 "NSAP to SNPA translation" +- translation from NSAP to SNAP required for every CLNP PDU sent +- function provided by iso_nsap_to_snpa + + iso_nsap_to_snpa(ifp, m, nsap, snpa) + struct ifnet *ifp; /* outgoing interface */ + struct mbuf *m; /* pkt */ + struct sockaddr_iso *nsap; /* destination address */ + char *snpa; /* RESULT: snpa address */ + { + if (nsap.afi == AFI_SNPAADDR) { + copy snpa addr from nsap into snpa + return SUCCESS + } else { + scan RIB for (RIB.nsap == nsap) + if (found) { + copy RIB.snpa into snpa + return SUCCESS + } + scan RIB for (RIB.type == IS) && (RIB.ifp = ifp) + if (found) { + copy RIB.snpa into snpa + return SUCCESS + } + if (ifp allows multicast) { + /* invoke query configuration function */ + copy ifp.ifaddr.ifa_all_es into snpa + return SUCCESS + } + + return FAILURE + } + } + +- NSAP to SNPA table resides in kernel so CLNP has quick access +- entries added/timed-out of table via user level ES-IS daemon +.sh 3 "Query Configuration Functon" +- invoked when iso_nsap_to_snpa + - requires snpa, but + - does not find a match for dest nsap, and + - does not find a match for Any IS. +- clnp packet is sent to address "all ES" as specified in ifnet structure + (for now, this is just the broadcast address) +.sh 3 "Configuration Response Function" +- invoked by clnp_input(), after determining that the packet received is + destined for one of its NSAPs +- checks if sn_dst == "all ES" (for now, this is all hex ffs) +- if true, a copy of packet is made, and passed up to esis_input() |