117 lines
3.7 KiB
Plaintext
117 lines
3.7 KiB
Plaintext
.\" $NetBSD: esis_design.nr,v 1.2 1998/01/09 06:34:45 perry Exp $
|
|
.\"
|
|
.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()
|