summaryrefslogtreecommitdiffstats
path: root/share/doc/iso/wisc/esis_design.nr
diff options
context:
space:
mode:
Diffstat (limited to 'share/doc/iso/wisc/esis_design.nr')
-rw-r--r--share/doc/iso/wisc/esis_design.nr114
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()
OpenPOWER on IntegriCloud