[comp.protocols.tcp-ip] IP over X.25

chm@nbires.nbi.com (Paul Chmielewski) (02/03/89)

We're in the process of putting together an IP-over-X.25 package for our
4.3 derivative UNIX systems.  We currently have an intelligent communications
card (VME bus) on which we run X.25.  The UNIX kernel and networking subsystem
are pretty much straight from BSD4.3.  We plan to write a network interface
driver to interface with the X.25 code.  I'm interested in hearing from people
who have already done this or something similiar.  I'd like to hear about 
problems you ran into, what type of performance to expect, or what documentation
you found useful.  I've read RFC 877, but it doesn't seem to address all of the
issues.

I do have one specific question concerning the internet address to virtual
circuit pairings.  Is there a standard mechanism for telling the called end
of a virtual circuit what the internet address of the calling host is?  I'm
thinking that each X.25 VC or PVC will be configured as a point-to-point link.
The machine initiating the call can fairly easily map the pt-to-pt IP addresses
to the virtual circuit.  But I'm not sure how the machine accepting the call
would do this.  One possibility would be to include the initiating machines
IP address in the Call User Data Field after the protocol demultiplexing octet.
Any comments??


Paul Chmielewski		
NBI Inc., Boulder, CO		chm@nbires.UUCP or chm@nbires.NBI.COM
(303) 938-2926

barns@GATEWAY.MITRE.ORG (Bill Barns) (02/04/89)

Paul,

If you have not made the acquaintance of the Defense Data Network (DDN)
X.25 Standard Service, it would probably be a good idea to do so.  It
will NOT answer your immediate question, but considering the type of
product you are developing, it seems to me that it would be rather
silly not to support the DDN Standard Service as a configuration
option.  That may be the largest single market for IP over X.25.  I
will not describe it in detail as there are documents for that, but
very briefly, it uses an algorithmic transformation between IP
addresses and X.121 addresses.  This transformation has some
limitations which make it undesirable or unusable in many other
situations, but it seems like it would be worth implementing, or at
least leaving hooks for.

DDN Standard X.25 has a couple of other twists which involve
network-specific X.25 facilities at SVC initiation, as well as the CUD
which is essentially as described in the RFC.  Also, it imposes some
implicit restrictions on the assignment of IP datagrams to X.25 VCs, so
that Precedence will work.  If you code it right to start with, the
extra work is minimal; retrofitting may or may not be easy, "depending."

The common method of address handling (that I know of) involves keeping
static address mapping tables in all the X.25 endpoints involved.  These
tables associate IP addresses with X.121 DTE addresses.  This method has
the advantage of providing the basis for some security checking.  Since
the static configuration table lists all the DTE's that are expected to
call and talk IP with you, you can clear calls from impostors.  You would
also have the IP layer do its routing based on this information, which
prevents a legitimate DTE address from acquiring packets destined to an
IP address properly belonging to some other DTE.  The utility of this
depends on the validity of the DTE address, but there is some validation
of this in most public data networks, I believe.  I would certainly want
such a feature to be available in any box that I used on a public data
network in this way.

Send mail if you would like to chat about this further...  this seems
like enough for the public wire.

Bill Barns / MITRE-Washington / barns@gateway.mitre.org

CERF@A.ISI.EDU (02/04/89)

Paul,
After the VC is established, the first packet over the link is an IP
packet containing source/destination IP addresses and, probably, a TCP
SYN packet or a UDP packet. Won't the Source/Dest address in the
first IP packet be sufficient or have I missed some initialization
problem on the receiving end?

Vint Cerf

art@SAGE.ACC.COM (02/05/89)

>Paul,
>After the VC is established, the first packet over the link is an IP
>packet containing source/destination IP addresses and, probably, a TCP
>SYN packet or a UDP packet. Won't the Source/Dest address in the
>first IP packet be sufficient or have I missed some initialization
>problem on the receiving end?
>
>Vint Cerf

Vint,

Unfortunately, the Source address in the IP packet may have little
relation to the X.121 address at the other end of the VC. If there
is at least one gateway between the local machine and the remote 
machine, the virtual circuit really exists as a logical level 2
connection between the local machine and gateway.  It's probably
better to translate from the X.121 calling address to an associated
IP address.

The IETF Performance Working Group has been working on a paper that
covers, amoung other things, issues around SVC management for IP over
X.25.

+-----------------------------------------------------------------------+
|	Art Berggreen		Advanced Computer Communications	|
|	<art@sage.acc.com>	Santa Barbara Street			|
|	(805)963-9431		Santa Barbara, CA 93101			|
+-----------------------------------------------------------------------+

kre@cs.mu.oz.au (Robert Elz) (02/06/89)

In article <220@cutter.nbi.com>, chm@nbires.nbi.com (Paul Chmielewski) writes:
> Is there a standard mechanism for telling the called end
> of a virtual circuit what the internet address of the calling host is?

I doubt that looking at the address on the first datagram is the right
way, that may have come from anywhere, and just happens to be being routed
through this X.25 connection (the calling site may have restrictions on
for whom it will forward datagrams over x.25, but then again, it also
might not).

A useful question might be "Do you care?"

I think not, datagrams arrive over the link, they carry source addresses,
the address of the particular site at the other end of the link shouldn't
matter much.

When you come to sending out a datagram, you need (somehow) to translate
the IP address to a DTE address - you have to be able to do this to
cope with the case where your end initiates the connection anyway.

Its likely that this translation will produce the same DTE address as
was in the "calling address" x.25 field in the initial call packet.
In that case, you can send your datagram(s) back out over this same
call (if its still active).

kre

keith@SPIDER.CO.UK (Keith Mitchell) (02/07/89)

I am nearing completion of a Unix V.3 STREAMS-based implementation of
IP over X.25, which is part of our SpiderTCP and SpiderX.25 protocol
software products. We call it IXE (IP/X.25 Encapsulation).

It fits into the STREAMS protocol stack as a multiplexing driver
underneath IP and above our X.25 stack. It conforms fully to the
rather skimpy RFC 877 spec, and although at present it will only
work with CCITT-flavour X.25 PDNs, DDN support is on the way. (CCITT
is a lot more in demand in Europe than DDN, obviously). On the other
hand, it *does* work with both the 1980 and 1984 flavours of X.25.
Clearing down of idle X.25 calls and pre-emption of these when
resources are scarce are implemented.

Address mapping for this stuff is something of an issue. At present
we use a lookup table, which is the only way of really doing the
job, but if you have a lot of WAN destinations to talk to then there
is a danger of guzzling up lots of kernel memory.  Some kind of
address resolution protocol would be nice, but another way to look
at it is from a security point of view.

If you are connected to a public network, then anyone could call you
up and claim to be some host with a remote IP address that higher-
level software trusts.  This leaves you wide open to spoofing by
Public Data Network hackers. On the other hand, PDNs are usually set
up so you can trust the X.25 calling address, so we use this to look
back into the table and check that the remote IP host is who it
claims to be.

Using the CUDF field for address resolution does not seem like a
good idea to me.  I would prefer the use of X.25 facilities for
this, most specifically the extended addressing one of X.25(1984).
When used for the ISO CONS, this carries an NSAP. It is interesting
to note that a scheme for encoding IP addresses into NSAPs already
exists (RFC 986), at least for the connection-less world.  Some
scheme along these lines would thus bypass the need for table
lookup, and I think is probably the right approach. (Again you have
to trust the address you get from the PDN).

It strikes me that generally RFC 877 leaves a lot of issues
unanswered, and the introduction of the 1984 (and now 1988)
standards for X.25 have aggravated this. Is is perhaps time for a
new standard in this area ?  Any such work probably ought to take
into account using ISO IP (or CLNP) over X.25 circuits as well. Does
anyone have any thoughts on this ?

Keith Mitchell

Spider Systems Ltd.        Spider Systems Inc.
65 Bonnington Road        12 New England Executive Park
Edinburgh, Scotland        Burlington, MA 01803
+44 31-554 9424            +1 (617) 270-3510

keith@spider.co.uk        keith%spider.co.uk@uunet.uu.net
keith@uk.co.spider        ...!uunet!ukc!spider!keith

smb@ulysses.homer.nj.att.com (Steven M. Bellovin) (02/08/89)

In article <8902071459.AA22881@redrump.spider.co.uk>, keith@SPIDER.CO.UK (Keith Mitchell) writes:
> Address mapping for this stuff is something of an issue. At present
> we use a lookup table, which is the only way of really doing the
> job, but if you have a lot of WAN destinations to talk to then there
> is a danger of guzzling up lots of kernel memory.

I have an implementation of IP over Datakit(r) VCS circuits that I did
for 4.3bsd; I had the same problems.  One thing I did was to do call
setup from user-level.  If a circuit to a destination is needed, but none
is available, the IP address is passed to a daemon process; this process
looks up the dialstring, makes the call, and hands the circuit back to
the dkip driver.  Because I'm using a user-level process, the mappings
can reside in a file.

The problem, though, is that *lots* of IP drivers need this sort of lookup,
especially for wide-area non-broadcast nets.  Dkip has one version, assorted
X.25 implementations have their own, dial-up SLIP needs analogous data,
etc.  Perhaps we can find some way to store the information via the
Domain Name System.  What we'd need, more or less, is a new record type
PHYSADDR in class IN; its data field would contain a type code (Datakit VCS,
X.25, etc., and a type-dependent set of dialing instructions.  The inverse
mapping, or -- more likely -- the equivalent to the INADDR.ARPA records would
be useful as well, for validation of incoming calls.

I'm not entirely happy with this idea, though; the format of the dialing
instructions is rather too variable for a single record type.  But the
PHYSADDR record needs to be tied to the IN class, since IP is the primary
client for the information.  Suggestions, anyone?

		--Steve Bellovin
		smb@ulysses.att.com

dyer@spdcc.COM (Steve Dyer) (02/08/89)

In article <11194@ulysses.homer.nj.att.com> smb@ulysses.homer.nj.att.com (Steven M. Bellovin) writes:
>Perhaps we can find some way to store the information via the
>Domain Name System.  What we'd need, more or less, is a new record type
>PHYSADDR in class IN; its data field would contain a type code (Datakit VCS,
>X.25, etc., and a type-dependent set of dialing instructions.  The inverse
>mapping, or -- more likely -- the equivalent to the INADDR.ARPA records would
>be useful as well, for validation of incoming calls.
>
>I'm not entirely happy with this idea, though; the format of the dialing
>instructions is rather too variable for a single record type.  But the
>PHYSADDR record needs to be tied to the IN class, since IP is the primary
>client for the information.  Suggestions, anyone?

If you can live without the IN class, the Hesiod nameserver mods to
BIND we made at MIT would seem to be just what you want.  It essentially
uses class HS, type TXT for its resource records.  The TXT type
is just free-form ASCII text, and further qualification ("typing") is
done with a second string, the HesiodNameType, which when concatenated
with the name of the object to be resolved, is passed by the Hesiod
calls to the DNS.  Since there was no way to predict what data Hesiod
would be carrying in the future, we decided against defining new RR types,
preferring to encode this in the domain names of the RRs.

	char **cp;
e.g.,
	cp = hes_resolve(hostname-or-ip-addr-as-octet-string, "physaddr");
	/* Now cp == NULL */
	/* or cp[0], cp[1], cp[N-1] contain strings and cp[N] == NULL */
	cp[0] == "x25 some-long-ISO-addr", etc.
You get the idea.

In our use of Hesiod within Athena, we quite commonly return strings
of the form
	TYPE strings-meaningful-for-said-TYPE
and application which use Hesiod know about the structure of the
strings for a particular HesiodNameType.

If you want to examine Hesiod, it can be retrieved as pub/hesiod.tar.Z
from athena-dist.mit.edu.
-- 
Steve Dyer
dyer@ursa-major.spdcc.com aka {ima,harvard,rayssd,linus,m2c}!spdcc!dyer
dyer@arktouros.mit.edu

barns@GATEWAY.MITRE.ORG (Bill Barns) (02/09/89)

From offline sources I gather that some people were confused about what
the X.121/IP address mapping discussion really meant.  Here is an
attempt at an explanation.  After that, I have some remarks on the NSAP
vs. IP issue.

The point of an X.121/IP address mapping table is to enable mapping in
the IP -> X.121 direction, not the other way around.  This is needed to
identify or create an appropriate X.25 virtual circuit to carry an IP
datagram through an X.25 subnet to its destination or an appropriate
gateway.  The reverse mapping turns out not to be a very useful thing,
and thus is not really an issue.

It also happens that the list of X.121 addresses appearing in the
mapping table can be used for a rough validation of the legitimacy of
an incoming X.25 call.  In general, however, it is not possible to use
the reverse mapping X.121 -> IP to validate the IP addresses contained
in datagrams arriving over an X.25 VC whose other end is an X.121
address in the table.  Although the entity on the other end of the X.25
VC has an IP address, it does not necessarily follow that datagrams
received from the other end will have that particular IP address as the
IP source address.

There are three main reasons why the address might be different.
     (1) The other end of the X.25 VC is an IP gateway (router).  In
this situation there will be many IP source addresses appearing in the
datagrams arriving on that VC, and the IP address of the gateway itself
will not usually appear in those datagrams.
     (2) Source routing is being used.  In this case, the IP source
address might be anything, and the address of the gateway at the far
end of the VC will generally appear in the option, but this is not
assured.
     (3) The device at the other end is claiming an inappropriate IP
address.

The idea of checking each datagram's IP source address and the X.121
address of the other end of the X.25 VC on which it arrived against the
static table to detect spoofing is meant to deal with (3) above, but it
causes legitimate actions (1) and (2) to fail.  The functions (1) and
(2) are part of the normal IP definition and one ought not to break
these things unless there are particularly strong reasons to do so in a
specific limited usage environment.

One might try to cope with (1) by maintaining some knowledge of
legitimate backside network numbers for such gateways, but this
requires a more elaborate static table and tends to be impractical if
the backside has backdoors into other parts of the Internet.

If you distinguish between non-gateways and gateways in the static
table, it would be possible to use logic to cope with case (2) for
the non-gateways.  This would require checking for source routing
options.  This can work because the non-gateway is either the source
or has to have been named explicitly in the source route, in order
for a properly functioning gateway to have sent it the packet in the
first place.  (This logic doesn't hold for gateways because gateways
may have been routed to because of extrinsically derived information at
the prior hop.)

For the gateway case, security protection against unauthorized use of a
network (remember that the X.25 VC is a network/subnet in the IP sense)
can be implemented separately from VC management and X.121 address
mapping, and this is a nice feature to have.  It does not make sense to
shut down an X.25 VC to a gateway because an unauthorized party (or
someone impersonating one) has sent a datagram through it.  If you do
this, you make it easy for troublemakers to induce denial of service to
legitimate users.  Instead, filtering should be done at appropriate
gateways, and the undesirable datagrams should be dropped, with
appropriate ICMP messages to their source if feasible.  This feature
exists in several commercial gateway boxes.  The same thing can be done
in end systems, but the utility there is less clear.

Now then, about IP and ISO and so on.  The RFC that discusses IP-flavored
NSAPs is not 100% up with the latest thinking there.  As far as I know,
the current thought is IDEA003.  This scheme talks explicitly about the
case of isolated end systems on PDNs but the NSAP treatment essentially
ignores the question of IP address association.  The object of these
documents was to support ISO stacks, not IP.  The reason for the hybrid
NSAP format was to provide hooks for using IP routing mechanisms to
support NSAP interpretation, rather than the other way around.

There is official ISO work on the usage of CLNP over X.25, and this is
the mode of operation envisioned (most of the time) by US GOSIP.  But
it is not clear that all of the questions one might ask have really been
answered - or they may have been answered in ways you won't like.  The
first octet of CUD is now officially supposed to contain the protocol
identifier when you plan to use OSI protocols.  There is a designated
value, hex 81, identifying CLNP.  Distinct values are assigned (I don't
recall them) for ES-IS and IS-IS, which apparently means that it is
necessary to have two X.25 VC's to support one user's traffic between
two network entities.  I'm surprised that we aren't hearing howls from
gateway vendors already.  ES-IS should handle the problem of converting
the NSAP to an X.121 address, but of course you need a preconfigured
X.121 address for the IS so you can talk to it to ask the question, and
the IS (or another IS) still needs to be told what the mapping and
topology are.  These matters are outside the scope of the ISO specs.

Bill Barns

smb@ulysses.homer.nj.att.com (Steven M. Bellovin) (02/11/89)

The point of doing a X.121->IP address map is to economize on virtual
circuits.  That is, routes are often symmetric; if a packet from A to B
goes through gateways G1 and G2, replies from B to A will often go through
G2 and G1.  If G1 and G2 communicate via X.25, G1 will call G2 to send
the first packet; if the reply is going to traverse the same path, it
makes sense to reuse the X.25 VC.  If G2 has to open its own circuit back
to G1, it will incur a delay, and -- probably more important -- it will
waste a channel.  Some boards only support a limited number of channels;
requiring two circuits for each call will, more or less, halve the number
of connections a gateway can handle.  (I'm assuming we don't want it
thrashing on connection setup/teardown.)

The flip side is the security issue:  can one trust the calling X.25 address
supplied?  That depends on how much trust one has in the underlying network,
or, more precisely, in the underlying X.25 *internetwork*.  If the network
provider is corrupt, making a new outgoing call won't help, as it will
be diverted as well.  But if the X.25 network relays calls from other
X.25 data networks, and doesn't check the source address properly, it is
possible that some spoofing will occur.

I note that the two X.25 drivers lying around my 4.3bsd system here (for
the ACC 5256/6250 and the 625 board) both behave as I describe:  they
attempt to determine the IP address to associate with incoming calls.


		--Steve Bellovin

karn@jupiter..bellcore.com (Phil R. Karn) (02/11/89)

>The point of doing a X.121->IP address map is to economize on virtual
>circuits.  That is, routes are often symmetric; if a packet from A to B
>goes through gateways G1 and G2, replies from B to A will often go through
>G2 and G1....

On the other hand, CSNET's experience with real commercial X.25 networks
like Telenet has shown that multiple parallel virtual circuits are often
necessary anyway to even approach acceptable performance. The problem is the
small X.25 packet size limit and the tiny packet-layer flow control window.
In the absence of a mechanism for increasing this window you are forced to
open up additional circuits and distribute your traffic among them. Face it,
X.25 was designed for remote slow-speed terminal networking, not serious
computer networking.

I can also say from experience that such a path is an excellent stress test
for your TCP segment reordering code...

Phil

rajaei@ttds.UUCP (Hassan Rajaei) (02/14/89)

In article <13962@bellcore.bellcore.com> karn@jupiter.bellcore.com (Phil R. Karn) writes:

>On the other hand, CSNET's experience with real commercial X.25 networks
>like Telenet has shown that multiple parallel virtual circuits are often
>necessary anyway to even approach acceptable performance. The problem is the
>small X.25 packet size limit and the tiny packet-layer flow control window.
>In the absence of a mechanism for increasing this window you are forced to
>open up additional circuits and distribute your traffic among them. Face it,
>X.25 was designed for remote slow-speed terminal networking, not serious
>computer networking.

I quite agree with Phil. X.25 can not satisfy the high performance needed
for high-speed communication and certainly not for internetworking. Isn't
it really funny to have VC over a large network while it is not necessary?
I believe the PTTs have done some mistake and now it is hard for them to 
admit and backup. The investment is so enormous that nobody dare to backup
just like FORTRAN. I don't care which protocol the commercial world want to
use, but I do care what scientists and researchers use or will use. These
people have already started the alternative solutions. If other people listen
enough we can hope for a newer and better standard than X.25.

Hassan Rajaei

haas@wasatch.UUCP (Walt Haas) (02/16/89)

In article <13962@bellcore.bellcore.com>, karn@jupiter..bellcore.com (Phil R. Karn) writes:
> On the other hand, CSNET's experience with real commercial X.25 networks
> like Telenet has shown that multiple parallel virtual circuits are often
> necessary anyway to even approach acceptable performance. The problem is the
> small X.25 packet size limit and the tiny packet-layer flow control window.

I was waiting for somebody else to point out the obvious, but it didn't
happen... the small packet size limit and flow control window are *NOT X.25*
problems, they are problems with the Telenet implementation!

Please read the literature before you post...


Walt Haas    haas@cs.utah.edu    utah-cs!haas

karn@jupiter..bellcore.com (Phil R. Karn) (02/16/89)

>I was waiting for somebody else to point out the obvious, but it didn't
>happen... the small packet size limit and flow control window are *NOT X.25*
>problems, they are problems with the Telenet implementation!
>
>Please read the literature before you post...

I did. Unfortunately nobody seemed particularly interested in implementing
all those wonderful features like modulo-128 packet numbering and packet
window negotiation.  Nor did Telenet seem interested in fixing their
switches to not act as though the D bit were always set.

Paper specs by themselves don't do much for me.

The more gratuitously complicated a protocol is, the greater the
opportunity for the vender to screw it up.

Phil

Denis.Russell@newcastle.ac.uk (10/04/90)

I have an interest in routing IP datagrams over an X.25 network,
and  would  like  some information on the characteristics actual
products  (routers)  that  do  this.   The  kind  of  completely
hypothetical  (!)  setup that interests me is a set of say 50 to
100 mainly Ethernet LANs connected by a wide-area  X.25  network
with X.25 speeds in the 9.6kbps-64kbps-2Mbps range.
 
     In  the  worst  case  one might imagine a permanent 2 * N^2
network of X.25 calls, and clearly some intermediate plan  using
an hierarchy of routers would be preferable.
 
     However,  I  am  primarily  interested  in  an intermediate
scenario where the X.25 calls are established and  cleared  down
as required.  Clearly the practicality of this this would depend
on  the  traffic  pattern - but that is not the primary focus of
this query.  The primary focus is to find  out  whether  routers
that  support  X.25  as  an  IP  bearer  have  the right sort of
characteristic for such an application.  For example, one  would
require  support for a substantial number of such calls (10, 20,
30?), and the  automatic  clearing  down  of  calls  after  some
inactivity  timeout.   What  speed X.25 is supported (preferably
well beyond 64kbps)?  Does a  router  exploit  already  existing
inbound  X.25  calls  to send outbound datagrams or does traffic
always result in two calls, one used in  each  direction?   What
other questions are important?
 
     As  some  examples of the clarifications we would value are
that we understand that Sunlink supports only 4  X.25  calls  by
default,  but  can  be configured for any larger number.  On the
other hand, the calls are never cleared due to  inactivity.   We
don't  know  whether any routers exploit X.25 in a duplex manner
or whether two calls are always/sometimes/never set up.
 
     I'll  summarise  to  the  list  if there is interest in the
results.
 
Denis Russell           JANET:     Denis.Russell@uk.ac.newcastle
Computing Laboratory    Internet:  Denis.Russell@newcastle.ac.uk
The University
Claremont Road          Tel:   (+44) 91 222 8243
Newcastle upon Tyne     Fax:   (+44) 91 222 8232
       NE1 7RU          Telex: 53 65 4  UNINEW G
ENGLAND

a20@nikhefh.nikhef.nl (Marten Terpstra) (10/05/90)

In article <emu-ul20.1990.1004.143548.cl04@uk.ac.ncl.mts> Denis.Russell@newcastle.ac.uk writes:

[stuf deleted]

>this query.  The primary focus is to find  out  whether  routers
>that  support  X.25  as  an  IP  bearer  have  the right sort of
>characteristic for such an application.  For example, one  would
>require  support for a substantial number of such calls (10, 20,
>30?), and the  automatic  clearing  down  of  calls  after  some
>inactivity  timeout.   What  speed X.25 is supported (preferably
>well beyond 64kbps)?  Does a  router  exploit  already  existing
>inbound  X.25  calls  to send outbound datagrams or does traffic
>always result in two calls, one used in  each  direction?   What
>other questions are important?

CISCO IP routers can provide you with everything you want.
The max speed for normal serial interfaces in these boxes is T1
(or 1.544 Mbit/s). You can of course get higher speed interfaces.

The set-up and clearing of calls can simply be done by specifying an
idle timer. Only one call is needed for two way traffic. It will set
up a call if it has traffic to route. CISCO even provides x25 switching
if you want this. Ask CISCO for some info or drop a line at
customer-support@cisco.com.

Marten
--
Marten Terpstra                                  National Institute for Nuclear
Internet : terpstra@nikhef.nl 		                and High Energy Physics
Oldie-net: {....}mcsun!nikhefh!terpstra	      (NIKHEF-H), PO Box 41882, 1009 DB
Phone    : +31 20 592 5102                           Amsterdam, The Netherlands