
- •Preface
- •About this book
- •Intended audience
- •Using this book
- •Typographical conventions
- •Further reading
- •Feedback
- •Feedback on ARM TCP/IP
- •Feedback on this book
- •Introduction
- •1.1 A typical embedded networking stack
- •1.2 What is PPP?
- •1.3 ARM TCP/IP requirements
- •1.3.1 Memory requirements
- •1.3.2 CPU requirements
- •1.3.3 Operating system requirements
- •1.4 ARM PPP requirements
- •1.4.1 Line management functions
- •1.4.2 Static memory
- •1.4.3 Dynamic memory
- •1.4.4 Periodic clock tick
- •1.5 Example package directories
- •1.6 Sample programs
- •TCP/IP Porting
- •2.1 Porting procedure
- •2.2 Portable and nonportable files
- •2.2.1 Portable files
- •2.2.2 Nonportable files
- •2.3 Creating the IP port file
- •2.3.1 Standard macros and definitions
- •2.3.2 CPU architecture
- •2.3.4 Debugging aids
- •2.3.5 Timers and multitasking
- •2.3.6 Stack features and options
- •2.4 Coding the glue layer
- •2.4.1 Task control
- •2.5 Specifying IP addresses
- •2.5.1 Porting programmer IP issues
- •2.5.2 End user IP issues
- •2.6 Testing the TCP/IP port
- •PPP Porting
- •3.1 Porting procedure
- •3.2 Porting PPP
- •3.2.1 Source files
- •3.2.2 Compiling PPP
- •3.2.3 Entry points and support calls
- •3.3 Testing PPP
- •3.3.1 Loopback
- •3.3.2 Client connection
- •3.3.3 Server connection
- •3.3.4 Abrupt disconnect
- •3.3.5 Multilink test
- •TCP/IP API Functions
- •4.2.1 cksum()
- •4.2.2 dprintf() and initmsg()
- •4.2.3 dtrap()
- •4.2.4 ENTER_CRIT_SECTION() and EXIT_CRIT_SECTION()
- •4.2.5 LOCK_NET_RESOURCE() and UNLOCK_NET_RESOURCE()
- •4.2.6 npalloc()
- •4.2.7 npfree()
- •4.2.8 panic()
- •4.2.9 prep_ifaces()
- •4.2.10 tcp_sleep()
- •4.2.11 tcp_wakeup()
- •4.3 Network interfaces
- •4.3.1 The NET structure
- •4.3.2 n_close()
- •4.3.3 n_init()
- •4.3.4 n_reg_type()
- •4.3.5 n_stats()
- •4.3.6 pkt_send()
- •4.3.7 raw_send()
- •PPP API Functions
- •5.2.1 _ALLOC() functions
- •5.2.2 ConPrintf()
- •5.2.3 _FREE() functions
- •5.2.4 get_secret()
- •5.2.5 ppp_port_init()
- •5.3 Serial line drivers
- •5.3.1 ln_connect()
- •5.3.2 ln_getc()
- •5.3.3 ln_hangup()
- •5.3.4 ln_putc()
- •5.3.5 ln_speed()
- •5.3.6 ln_state()
- •5.3.7 ln_write()
- •5.4 PPP entry points
- •5.4.1 lcp_lowerdown()
- •5.4.2 lcp_lowerup()
- •5.4.3 ppp_input()
- •5.4.4 ppp_timeisup()
- •5.4.5 prep_ppp()
- •Modem Functions
- •6.1 dialer.c
- •6.1.1 dial()
- •6.1.2 dial_check()
- •6.1.3 dialer_status()
- •6.1.4 modem_cmd()
- •6.1.5 modem_connect()
- •6.1.6 modem_getc()
- •6.1.7 modem_gets()
- •6.1.8 modem_hangup()
- •6.1.9 modem_init()
- •6.1.10 modem_lstate()
- •6.1.11 modem_putc()
- •6.1.12 modem_reset()
- •6.1.13 modem_speed()
- •6.1.14 modem_state()
- •6.1.15 modem_write()
- •6.2 login.c
- •6.2.1 do_script()
- •6.2.2 login()
- •6.2.3 log_input()
- •6.2.4 log_output()
- •6.2.5 logserver()
- •6.3 mdmport.c
- •6.3.1 dial_delay()
- •6.3.2 hangup()
- •6.3.3 modem_clr_dtr() and modem_set_dtr()
- •6.3.4 modem_DCD()
- •6.3.5 modem_portstat()
- •DHCP Client Functions
- •7.1 DHCP client functions
- •7.1.1 dhc_init()
- •7.1.2 dhc_discover()
- •7.1.3 dhc_set_callback()
- •7.1.4 dhc_halt()
- •7.1.5 dhc_second()
- •Low-overhead UDP Functions
- •8.1 UDP functions
- •8.1.1 udp_alloc()
- •8.1.2 udp_close()
- •8.1.3 udp_open()
- •8.1.4 udp_send()
- •8.1.5 udp_socket()
- •Sockets
- •9.1 ARM implementation of sockets
- •9.2 Socket API reference
- •9.2.1 t_accept()
- •9.2.2 t_bind()
- •9.2.3 t_connect()
- •9.2.4 t_errno()
- •9.2.5 t_getpeername()
- •9.2.6 t_getsockname()
- •9.2.7 t_getsockopt()
- •9.2.8 t_listen()
- •9.2.9 t_recv() and t_recvfrom()
- •9.2.10 t_select()
- •9.2.11 t_send() and t_sendto()
- •9.2.12 t_setsockopt()
- •9.2.13 t_shutdown()
- •9.2.14 t_socket()
- •9.2.15 t_socketclose()
- •ARM-specific Functions
- •10.1 ARM directories
- •10.1.1 armthumb
- •10.2 cksum.s
- •10.3 clock.c
- •10.3.1 clock_init()
- •10.3.2 clock_c()
- •10.4 delay.s
- •10.5 dtrap.s
- •10.6 except.s
- •10.7.1 ENTER_CRIT_SECTION() and EXIT_CRIT_SECTION()
- •10.7.2 irqDispatch()
- •10.7.3 irq_Enable() and irq_Disable()
- •10.7.4 irqInit()
- •10.8 lswap.s
- •10.10 olicom.c
- •10.11 pcmcia.c
- •10.12 stack.s
- •10.13 uart.c description
- •10.14 uart.c ring buffer management functions
- •10.14.1 ring_add()
- •10.14.2 ring_avail()
- •10.14.3 ring_new()
- •10.14.4 ring_remove()
- •10.14.5 ring_space()
- •10.15 uart.c interface functions
- •10.15.1 uart_getc()
- •10.15.2 uart_DCD()
- •10.15.3 uart_delay()
- •10.15.4 uart_do_irq()
- •10.15.5 uart_init()
- •10.15.6 uart_irq()
- •10.15.7 uart_putc()
- •10.15.8 uart_ready()
- •10.15.9 uart_reset()
- •10.15.10 uart_setup()
- •10.15.11 uart_stats()
- •10.16 uart.c debug TTY interface functions
- •10.16.1 dputchar()
- •10.16.2 getch()
- •10.16.3 kbhit()
- •Miscellaneous Library Functions
- •11.1 app_ping.c
- •11.2 in_utils.c
- •11.2.1 con_page()
- •11.2.2 hexdump()
- •11.2.3 nextarg()
- •11.2.4 ns_printf()
- •11.2.5 panic()
- •11.2.6 print_eth()
- •11.2.7 print_ipad()
- •11.2.8 print_uptime()
- •11.2.11 sysuptime()
- •11.2.12 uslash()
- •11.3 memman.c
- •11.4 menus.c, menulib.c, and nrmenus.c
- •11.5 nextcarg.c
- •11.5.1 nextcarg()
- •11.6 nvfsio.c
- •11.6.1 Overview
- •11.6.2 nv_fclose()
- •11.6.3 nv_fgets()
- •11.6.4 nv_fopen()
- •11.6.5 nv_fprintf()
- •11.6.6 nv_fwrite()
- •11.6.7 nv_initialize()
- •11.6.8 nv_writeflash()
- •11.7 nvparms.c
- •11.8 parseip.c
- •11.8.1 parseip()
- •11.9 reshost.c
- •11.9.1 in_reshost()
- •11.10 strilib.c
- •11.11 strlib.c
- •11.12 tcp_echo.c
- •11.13 ttyio.c
- •11.14 udp_echo.c
- •11.15 userpass.c
- •11.15.1 add_user()
- •11.15.2 check_permit()
- •Example Applications
- •12.1 Overview of the examples
- •12.1.1 Requirements
- •12.1.2 Building projects
- •12.1.3 Running the examples
- •12.2 Example descriptions
- •12.2.1 chargen
- •12.2.2 loopback
- •12.2.3 maildemo
- •12.2.4 menus
- •Error Codes
- •A.1 ENP_ error codes
- •A.2 Socket error codes

Chapter 1
Introduction
The TCP/IP porting sources are provided to enable you to port ARM TCP/IP and
Point-to-Point Protocol (PPP) to other networking environments.
This chapter introduces networking, the ARM porting functions, the requirements for porting ARM TCP/IP and PPP, a list of the example package directories, and an overview of the sample programs provided.
This chapter contains the following sections:
•A typical embedded networking stack on page 1-2
•What is PPP? on page 1-4
•ARM TCP/IP requirements on page 1-7
•ARM PPP requirements on page 1-12
•Example package directories on page 1-16
•Sample programs on page 1-18.
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
1-1 |

Introduction
1.1A typical embedded networking stack
Figure 1-1 shows the events that drive a typical embedded networking stack and the stack’s responses:
•the user enters commands
•packets are received from the network
•timers go off.
In each case, a call is made to the stack to handle the event.
In response to these events, the stack:
•makes calls to the system
•sends network packets
•returns data or status information to the calling user
•sets additional timers.
User commands
Timers
and
Stack
task control
Network interfaces
Figure 1-1 Network stack events
In an ideal situation, calls are mapped directly onto the underlying system. For example, the stack’s external call to send a packet has the same syntax as the network interface's exported send call. However, in a more typical situation, the stack designer does not know what tasking system, user applications, or interfaces are supported in the target system.
1-2 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |

Introduction
The ARM portable stack is designed with simple, generic interfaces. You must create a glue layer that maps this generic interface onto the specific interfaces available on the target system. For example, the stack is designed with a generic send_packet() call, and you code a glue function to send the packet using the system’s network interface.
In this example, the Ethernet driver, the SLIP driver, and the PPP driver each need different glue functions.
To maximize portability, the stack:
•minimizes the number of calls to glue functions
•uses simple glue functions
•provides detailed documentation
•either uses standard interfaces (such as sockets and the ANSI C library) or provides examples when there is no standard.
The majority of the work in porting a stack is understanding and implementing the glue functions. The ARM TCP/IP stack has the following categories of glue functions:
•Application Program Interface (API)
•memory allocation and management
•network hardware interface
•timer and tasking interface.
These functions are discussed in greater detail in Chapter 4 TCP/IP API Functions.
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
1-3 |

Introduction
1.2What is PPP?
PPPis a specification for the transmission of network data over serial lines. It:
•converts blocks of network data (packets) into single bytes for transmission over a serial line, such as ISDN or a dial-up modem, and re-assembles the packets on receipt
•checksums the packets
•compresses TCP/IP protocol headers
•verifies the identity of (authenticates) the computer on the other end of the line
•allows packets from multiple protocols to be transferred on a shared line.
PPP does not handle modem dialing. However, ARM provides additional software with PPP that does this for a standard Hayes command set modem. The ARM PPP provides software (IPCP) for using PPP to transfer IP packets. It does not include layers for non-IP protocols, such as AppleTalk and DECnet.
Note
In this document, the term PPP, when used without other qualification, refers to the
ARM PPP code as ported to an embedded system.
The ARM package implements all the protocols required for IP transmission and the optional protocols for authentication and TCP/IP header compression.
PPP is actually a family of protocols, all working together to provide the functionality described above. Two members of the family, LCP and IPCP, provide a virtual connection service and handle a set of options, such as the authentication to use and whether to compress packets.
Each connection protocol moves these connections between states defined by a Finite State Machine (FSM) specification. Other members of the PPP family provide services to the connection protocols, such as security (CHAP, UPAP).
Figure 1-2 shows how PPP fits between the IP protocol family and the hardware link.
1-4 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |

Introduction
TCP/IP software
|
|
|
|
|
TCP |
|
|
UDP |
|
|
|
|
|
|
|
|
|
|
|
PPP software |
|
|
IP |
|
|||||
|
|
|
|
|
|||||
|
FSM |
IPCP |
|
|
|
|
|||
|
|
|
Optional Ethernet or |
||||||
|
|
|
Authentication |
|
|
||||
|
|
|
protocol |
|
|
|
other MAC drivers |
||
|
|
|
LCP |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
Line command functions |
|
|
|
|
||||
|
|
|
|
|
(These hardware drivers |
||||
|
|
Modem Dialer |
|||||||
|
|
|
|
|
|
are examples provided |
|||
|
|
|
RS-232 |
||||||
|
|
|
|
|
with PPP) |
||||
|
|
|
|
|
|
|
|
|
|
Figure 1-2 The IP protocol and PPP
In this case, the line hardware is a modem. The following is a brief description of each layer:
LCP |
Link Control Protocol. This is the carrier on which all the other protocols |
|
are layered. This layer is responsible for establishing the initial link |
|
between the two ends, then prompting the upper layers to start their |
|
option negotiation. It is also responsible for identifying the protocol of |
|
each incoming packet and passing those packets to the appropriate upper |
|
layers. |
IPCP |
IP Control Protocol. This handles IP-related options and packets. IPCP |
|
options include assigning IP addresses and negotiating the use of TCP/IP |
|
header compression. All IP packets sent and received on the PPP |
|
connection are encapsulated in this protocol. |
FSM |
Finite State Machine. This is not an actual protocol, but rather contains |
|
the definitions for the series of events that a PPP connection protocol |
|
moves through, from the initiation of the link to termination. Both LCP |
|
and IPCP use the same FSM code. |
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
1-5 |

Introduction
Any or all of the following authentication protocols can be configured and each end of the link can negotiate which of them will be used:
CHAP Challenge Handshake Authentication Protocol. CHAP is the primary mechanism for a PPP node to guarantee the identity of the host on the other end of the line. Authentication is initiated by sending a CHAP message (the challenge) through LCP from one PPP host to the other. The CHAP challenge contains an encrypted string, generated by the industry standard MD5 digest algorithm, based on an ASCII string (called a secret) that is known to both hosts.
The challenged host must return the correct CHAP reply. If it does not, the challenger terminates the connection. Generally, either host may send the CHAP challenge at any time after the LCP connection is established.
MS-CHAP Microsoft’s implementation of CHAP (see above). The encrypted string found in the CHAP challenge is generated by Microsoft’s proprietary algorithm, rather than by the MD5 digest algorithm. The proprietary algorithm is based on a unicode string that is known to both hosts.
MS-CHAP is used by Microsoft Remote Access Service (RAS).
UPAP User/Password Authentication Protocol. UPAP is similar to CHAP, except that a user name and password are used to generate the authentication packets. This is useful when multiple users with different levels of access may be dialing into a PPP interface.
For more detail about the individual layers, see RFC 1661, the PPP specification.
1-6 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |