diff options
-rw-r--r-- | share/man/man4/natmip.4 | 140 | ||||
-rw-r--r-- | sys/netinet/if_atm.c | 115 |
2 files changed, 166 insertions, 89 deletions
diff --git a/share/man/man4/natmip.4 b/share/man/man4/natmip.4 index f75f964..2ef1b2c 100644 --- a/share/man/man4/natmip.4 +++ b/share/man/man4/natmip.4 @@ -1,6 +1,6 @@ .\" $FreeBSD$ .\" -.Dd June 13, 2003 +.Dd August 11, 2003 .Dt NATMIP 4 .Os .Sh NAME @@ -19,15 +19,103 @@ like: .Pp .Dl # ifconfig en0 128.252.200.1 netmask 0xffffff00 up .Pp -A PVC is added with the -.Dq route -utility: +IP routing is done with special interface routes (routes with directly +reachable destinations) with a link layer gateway address. +The link layer address specifies the ATM interface through which the +destination can be reached, the virtual channel that connects to the +destination and the ATM characteristics of this channel. +The address part of the link layer address (see +.Xr link_addr 3 ) +consists of a fixed part (the first 5 bytes) and a part that +depends on the kind of the PVC (UBR, CBR, VBR, ABR). Multi-byte values +are big-endian encoded: the bytes with the lower numbers contain the +higher order bits. +.Bl -tag -width "bytes 12...12" -offset indent +.It byte 0 +Is a flag byte. Currently only flag 0x20 is used. +When set, all IP frames are LLC/SNAP encapsulated before putting them into +an AAL5 frame. +Setting this flag is recommended and allows interoperability with other +CLIP implementations. +Note that BPF works only with LLC/SNAP encapsulation. +.It byte 1 +This is the VPI of the channel. +.It bytes 2...3 +VCI of the channel. Must not be zero. +.It byte 4 +Traffic type. One of 0 (UBR), 1 (CBR), 2 (ABR), 3 (VBR). +.El +.Pp +The variable part for UBR connections may be either empty or three bytes: +.Bl -tag -width "bytes 12...12" -offset indent +.It bytes 5...7 +Specifies the peak cell rate for UBR. +.El +.Pp +The variable part for CBR connections must be three bytes: +.Bl -tag -width "bytes 12...12" -offset indent +.It bytes 5...7 +Specifies the peak cell rate for CBR. +.El .Pp -.Dl # route add -iface <remote IP address> -link en0:z.0.x.y +The variable part for VBR connections must be 9 bytes long and specifies three +values: +.Bl -tag -width "bytes 12...12" -offset indent +.It bytes 5...7 +Specifies the peak cell rate for VBR. +.It bytes 8...10 +This is the sustainable cell rate. +.It bytes 11...13 +The maximum burst size. +.El .Pp -where x and y are the hexadecimal byte encoding of the VCI to use, -and z is the byte encoding of the following flags: +The variable part for ABR connections must be 19 bytes long and specifies the +following values: +.Bl -tag -width "bytes 12...12" -offset indent +.It bytes 5...7 +Specifies the peak cell rate for ABR. +.It bytes 8...10 +The minimum cell rate. +.It bytes 11...13 +The initial cell rate. +.It bytes 14...16 +The transient buffer exposure. +.It byte 17 +The NRM value. +.It byte 18 +The TRM value. +.It bytes 19...20 +The ADTF value. +.It byte 21 +The rate increase factor (RIF). +.It byte 22 +The rate decrease factor (RDF). +.It byte 23 +The cutoff decrease factor (CDF). +.El .Pp +To add a PVC the +.Dq route +utility can be used: +.Pp +.Ic # route add -iface +.Ar <remote IP address> +.Ic -link +.Ar <iface> Ns Ic \&: Ns Ar <lladdr> +.Pp +The +.Ar <iface> +is the ATM interface through which +.Ar <remote IP address> +can be reached and +.Ar <lladdr> +is the link layer address as a string of dot-separated, hexadecimal bytes. +.Pp +NATM also supports the old, original format. This consists of 4 byte +link layer addresses (and the channels are implicit UBR): +.Bl -tag -width "bytes 12...12" -offset indent +.It byte 0 +Flags: .Bl -tag -width "0x02" -offset indent -compact .It 0x01 use AAL5. @@ -38,40 +126,48 @@ if using AAL5, use an LLC/SNAP header. Thus, parameter 3 means AAL5 and LLC/SNAP encapsulation (this is the required setting for interworking with other CLIP clients). Note that BPF works only with LLC/SNAP encapsulation. +.It byte 1 +VPI for the channel +.It bytes 2...3 +VCI for the channel +.El .Sh EXAMPLES Suppose you have 3 hosts 128.252.200.1, 128.252.200.2 and 128.252.200.3 connected by ATM through PVCs: .Pp .Bl -item -offset indent -compact .It -between 128.252.200.1 and 128.252.200.2: 0xc9 +between 128.252.200.1 and 128.252.200.2: 0xc9 UBR .It -between 128.252.200.1 and 128.252.200.3: 0xca +between 128.252.200.1 and 128.252.200.3: 0xca VBR .It -between 128.252.200.2 and 128.252.200.3: 0xcb +between 128.252.200.2 and 128.252.200.3: 0xcb CBR .El .Pp +The parameters for the VBR channel are: PCR 50000, SCR 10000, MBS 10. +The peak cell rate for the CBR channel is 100000. +.Pp To enable the links use the following commands: .Pp on host 128.252.200.1: .Bd -literal -offset indent -compact # ifconfig en0 128.252.200.1 netmask 0xffffff00 up -# route add -iface 128.252.200.2 -link en0:3.0.0.c9 -# route add -iface 128.252.200.3 -link en0:3.0.0.ca +# route add -iface 128.252.200.2 -link en0:3.0.0.c9.0 +# route add -iface 128.252.200.3 -link en0:3.0.0.ca.3.0.c3.50.0.27.10.0.0.a .Ed .Pp on host 128.252.200.2: .Bd -literal -offset indent -compact # ifconfig en0 128.252.200.2 netmask 0xffffff00 up -# route add -iface 128.252.200.1 -link en0:3.0.0.c9 -# route add -iface 128.252.200.3 -link en0:3.0.0.cb +# route add -iface 128.252.200.1 -link en0:3.0.0.c9.0 +# route add -iface 128.252.200.3 -link en0:3.0.0.cb.1.1.86.a0 .Ed .Pp on host 128.252.200.3: .Bd -literal -offset indent -compact # ifconfig en0 128.252.200.3 netmask 0xffffff00 up -# route add -iface 128.252.200.1 -link en0:3.0.0.ca -# route add -iface 128.252.200.2 -link en0:3.0.0.cb +# route add -iface 128.252.200.1 -link en0:3.0.0.ca.3.0.c3.50.0.27.10.0.0.a +# route add -iface 128.252.200.2 -link en0:3.0.0.cb.1.1.86.a0 .Ed .Pp This can also be done in @@ -82,8 +178,8 @@ on host 128.252.200.1: network_interfaces="lo0 en0" ifconfig_en0="inet 128.252.200.1 netmask 255.255.255.0" static_routes="host2 host3" -route_host2="-iface 128.252.200.2 -link en0:3.0.0.c9" -route_host3="-iface 128.252.200.3 -link en0:3.0.0.ca" +route_host2="-iface 128.252.200.2 -link en0:3.0.0.c9.0" +route_host3="-iface 128.252.200.3 -link en0:3.0.0.ca.3.0.c3.50.0.27.10.0.0.a" .Ed .Pp on host 128.252.200.2: @@ -91,8 +187,8 @@ on host 128.252.200.2: network_interfaces="lo0 en0" ifconfig_en0="inet 128.252.200.2 netmask 255.255.255.0" static_routes="host1 host3" -route_host1="-iface 128.252.200.1 -link en0:3.0.0.c9" -route_host3="-iface 128.252.200.3 -link en0:3.0.0.cb" +route_host1="-iface 128.252.200.1 -link en0:3.0.0.c9.0" +route_host3="-iface 128.252.200.3 -link en0:3.0.0.cb.1.1.86.a0" .Ed .Pp on host 128.252.200.3: @@ -100,8 +196,8 @@ on host 128.252.200.3: network_interfaces="lo0 en0" ifconfig_en0="inet 128.252.200.3 netmask 255.255.255.0" static_routes="host1 host2" -route_host1="-iface 128.252.200.1 -link en0:3.0.0.ca" -route_host2="-iface 128.252.200.2 -link en0:3.0.0.cb" +route_host1="-iface 128.252.200.1 -link en0:3.0.0.ca.3.0.c3.50.0.27.10.0.0.a" +route_host2="-iface 128.252.200.2 -link en0:3.0.0.cb.1.1.86.a0" .Ed .Sh SEE ALSO .Xr en 4 , diff --git a/sys/netinet/if_atm.c b/sys/netinet/if_atm.c index f328c07..82c95bf 100644 --- a/sys/netinet/if_atm.c +++ b/sys/netinet/if_atm.c @@ -65,6 +65,24 @@ __FBSDID("$FreeBSD$"); #define SDL(s) ((struct sockaddr_dl *)s) +#define GET3BYTE(V, A, L) do { \ + (V) = ((A)[0] << 16) | ((A)[1] << 8) | (A)[2]; \ + (A) += 3; \ + (L) -= 3; \ + } while (0) + +#define GET2BYTE(V, A, L) do { \ + (V) = ((A)[0] << 8) | (A)[1]; \ + (A) += 2; \ + (L) -= 2; \ + } while (0) + +#define GET1BYTE(V, A, L) do { \ + (V) = *(A)++; \ + (L)--; \ + } while (0) + + /* * atm_rtrequest: handle ATM rt request (in support of generic code) * inputs: "req" = request code @@ -136,96 +154,59 @@ atm_rtrequest(int req, struct rtentry *rt, struct rt_addrinfo *info) if (alen == 4) { /* old type address */ - op.param.flags = *addr++; - op.param.vpi = *addr++; - op.param.vci = *addr++ << 8; - op.param.vci |= *addr++; + GET1BYTE(op.param.flags, addr, alen); + GET1BYTE(op.param.vpi, addr, alen); + GET2BYTE(op.param.vci, addr, alen); op.param.traffic = ATMIO_TRAFFIC_UBR; op.param.aal = (op.param.flags & ATM_PH_AAL5) ? ATMIO_AAL_5 : ATMIO_AAL_0; } else { /* new address */ op.param.aal = ATMIO_AAL_5; - /* 1. byte LLC/SNAP flag */ - op.param.flags = *addr++ & ATM_PH_LLCSNAP; - alen--; - /* 2.-4. byte VPI/VCI */ - op.param.vpi = *addr++; - op.param.vci = *addr++ << 8; - op.param.vci |= *addr++; - alen -= 3; - /* 5. byte: traffic */ - op.param.traffic = *addr++; - alen--; + + GET1BYTE(op.param.flags, addr, alen); + op.param.flags &= ATM_PH_LLCSNAP; + + GET1BYTE(op.param.vpi, addr, alen); + GET2BYTE(op.param.vci, addr, alen); + + GET1BYTE(op.param.traffic, addr, alen); + switch (op.param.traffic) { case ATMIO_TRAFFIC_UBR: - if (alen >= 3) { - op.param.tparam.pcr = *addr++ << 16; - op.param.tparam.pcr = *addr++ << 8; - op.param.tparam.pcr = *addr++ << 0; - alen -= 3; - } + if (alen >= 3) + GET3BYTE(op.param.tparam.pcr, + addr, alen); break; case ATMIO_TRAFFIC_CBR: if (alen < 3) goto bad_param; - op.param.tparam.pcr = *addr++ << 16; - op.param.tparam.pcr = *addr++ << 8; - op.param.tparam.pcr = *addr++ << 0; - alen -= 3; + GET3BYTE(op.param.tparam.pcr, addr, alen); break; case ATMIO_TRAFFIC_VBR: if (alen < 3 * 3) goto bad_param; - op.param.tparam.pcr = *addr++ << 16; - op.param.tparam.pcr = *addr++ << 8; - op.param.tparam.pcr = *addr++ << 0; - alen -= 3; - op.param.tparam.scr = *addr++ << 16; - op.param.tparam.scr = *addr++ << 8; - op.param.tparam.scr = *addr++ << 0; - alen -= 3; - op.param.tparam.mbs = *addr++ << 16; - op.param.tparam.mbs = *addr++ << 8; - op.param.tparam.mbs = *addr++ << 0; - alen -= 3; + GET3BYTE(op.param.tparam.pcr, addr, alen); + GET3BYTE(op.param.tparam.scr, addr, alen); + GET3BYTE(op.param.tparam.mbs, addr, alen); break; case ATMIO_TRAFFIC_ABR: - if (alen < 4 * 3 + 1 * 2 + 5 + 1) + if (alen < 4 * 3 + 2 + 1 * 2 + 3) goto bad_param; - op.param.tparam.pcr = *addr++ << 16; - op.param.tparam.pcr = *addr++ << 8; - op.param.tparam.pcr = *addr++ << 0; - alen -= 3; - op.param.tparam.mcr = *addr++ << 16; - op.param.tparam.mcr = *addr++ << 8; - op.param.tparam.mcr = *addr++ << 0; - alen -= 3; - op.param.tparam.icr = *addr++ << 16; - op.param.tparam.icr = *addr++ << 8; - op.param.tparam.icr = *addr++ << 0; - alen -= 3; - op.param.tparam.tbe = *addr++ << 16; - op.param.tparam.tbe = *addr++ << 8; - op.param.tparam.tbe = *addr++ << 0; - alen -= 3; - op.param.tparam.nrm = *addr++; - alen--; - op.param.tparam.trm = *addr++; - alen--; - op.param.tparam.adtf = *addr++ << 8; - op.param.tparam.adtf = *addr++ << 0; - alen -= 2; - op.param.tparam.rif = *addr++; - alen--; - op.param.tparam.rdf = *addr++; - alen--; - op.param.tparam.cdf = *addr++; - alen--; + GET3BYTE(op.param.tparam.pcr, addr, alen); + GET3BYTE(op.param.tparam.mcr, addr, alen); + GET3BYTE(op.param.tparam.icr, addr, alen); + GET3BYTE(op.param.tparam.tbe, addr, alen); + GET1BYTE(op.param.tparam.nrm, addr, alen); + GET1BYTE(op.param.tparam.trm, addr, alen); + GET2BYTE(op.param.tparam.adtf, addr, alen); + GET1BYTE(op.param.tparam.rif, addr, alen); + GET1BYTE(op.param.tparam.rdf, addr, alen); + GET1BYTE(op.param.tparam.cdf, addr, alen); break; default: |