
- •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

Introduction
1.3ARM TCP/IP requirements
Before beginning a port, you must ensure that the necessary resources are available in the target environment. There must be:
•a processor with spare CPU capacity (see CPU requirements on page 1-9) with an operating system
•a debug monitor
•RAM
•a network interface.
The exact size of these resources varies depending on the features you plan to implement, the performance you require, and how many simultaneous users you need to support.
The following is a brief summary of services that ARM TCP/IP requires from the system:
•at least one network interface device
•a timer that ticks at least once a second
•memory, processing power, and operating system requirements, which are detailed in this section.
1.3.1Memory requirements
It is not possible to provide exact memory requirements, however an estimate can be obtained by examining the results provided by the examples. The values provided in Table 1-1 on page 1-8 are from the MailDemo example (maildemo on page 12-6) using IP, TCP, and PPP. The code was compiled for the ARM7TDMI processor core with the ARM Software Development Toolkit, version 2.50 and was optimized for code size rather than speed.
The majority of the ipport.h build options (such as, routing, NPDEBUG, NET_STATS, and DHCP) are not defined, so the sizes shown in the table below are smaller than if they had been defined. Packet buffers, which are allocated from the heap at initialization time, are not included in these figures.
Note
The values in Table 1-1 may change with subsequent releases because the code is subject to continuous development.
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
1-7 |

Introduction
Table 1-1 ARM7TDMI memory requirements (values shown in bytes)
|
ARM |
Thumb |
|
|
|
|
|
|
code and |
code and |
Read- |
Zero-init |
ARM |
Thumb |
RAM |
|
read-only |
read-only |
write data |
data |
ROM |
ROM |
|
|
|
||||||
|
data |
data |
|
|
|
|
|
|
|
|
|
|
|
|
|
ARP |
2392 |
1668 |
28 |
224 |
2420 |
1696 |
252 |
|
|
|
|
|
|
|
|
DHCP client |
2284 |
1548 |
52 |
300 |
2336 |
1600 |
352 |
|
|
|
|
|
|
|
|
DNS |
3224 |
2376 |
40 |
3276 |
3264 |
2416 |
3316 |
|
|
|
|
|
|
|
|
ICMP |
1588 |
1100 |
4 |
104 |
1592 |
1104 |
108 |
|
|
|
|
|
|
|
|
IP |
7372 |
5068 |
72 |
772 |
7444 |
5140 |
844 |
|
|
|
|
|
|
|
|
UDP |
4812 |
3492 |
24 |
1472 |
4836 |
3516 |
1496 |
|
|
|
|
|
|
|
|
Sockets API |
9028 |
6028 |
0 |
0 |
9028 |
6028 |
0 |
|
|
|
|
|
|
|
|
TCP |
18208 |
12556 |
208 |
332 |
18416 |
12764 |
540 |
|
|
|
|
|
|
|
|
Miscellaneous |
10956 |
8476 |
328 |
4188 |
11284 |
8804 |
4516 |
routines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Totals |
59864 |
42312 |
756 |
10668 |
60620 |
43068 |
11424 |
|
|
|
|
|
|
|
|
The compilers place read-only data items, such as strings and constants, into the read-only code area. Therefore, the memory requirements for the code area include these constant data items. When designing your system, you will need to estimate the amount of ROM and RAM required:
•The ROM requirement is the sum of the read-only area and the read-write data (the read-write data has pre-initialized values).
•The RAM requirement is the sum of the read-write data and the zero-init data, plus the dynamic memory requirements of the system (for example, network buffers).
TCP and sockets use a large portion of memory. Systems that require only IP and User Datagram Protocol (UDP) services (such as routers and SNMP agents) can remove the TCP and sockets layers to reduce memory requirements.
1-8 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |

Introduction
1.3.2CPU requirements
It is not possible to provide exact processing power requirements. An SNMP agent must be able to reply to SNMP management station requests before the station times out. If the station sends only one request per second and allows one second for the reply, even the slowest processor or micro-controllers should be adequate. However, in practice, the stations sometimes send packets in bursts and the agent CPU may have tasks other than SNMP to perform.
It is recommended that you consider similar systems when you assess your processing power requirements. For embedded agents, the example code is intended to provide a starting point. Protocols can be tested under loads on the various available processors. To determine the effect of heavy network traffic on the performance of the system, other processes can be run simultaneously with the stack.
Table 1-2 contains throughput performance figures that have been obtained by using the ARMulator in conjunction with the Loopback example (see loopback on page 12-5). The Loopback code simulates a perfect network interface (either Ethernet or PPP). This simulation allows the performance of the TCP, UDP, and PPP code to be measured, independent of the network interfaces.
The Loopback code sends and receives a number of fixed-size packets, and the ARMulator is used to count the number of cycles required. This information is collated for multiple runs using different packet sizes, different numbers of packets, and different protocols.
For the purposes of these benchmark figures, it has been assumed that a perfect 32-bit, zero wait state memory interface is in use, that is:
I Cycles = S Cycles = N Cycles = 1 CPU Clock Cycle
It is recommended that you rerun these benchmarks, applying values for I, S, and N that are used by your target system. These values are set in the process.pl Perl script.
The values in Table 1-2 represent Kbits per second per MHz of CPU dedicated to this task. For example, to achieve 128Kb per second of TCP throughput using PPP on an ARM7TDMI-based system with a packet size of 100 bytes, you require 128/10.78, or about 12MHz of CPU performance.
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
1-9 |

Introduction
Table 1-2 Throughput performance using ARMulator and the Loopback example (values shown in KB)
Packet |
MAC |
MAC |
MAC |
MAC |
PPP |
PPP |
PPP |
PPP |
|
TCP |
TCP |
UDP |
UDP |
TCP |
TCP |
UDP |
UDP |
||
size |
|||||||||
ARM |
Thumb |
ARM |
Thumb |
ARM |
Thumb |
ARM |
Thumb |
||
|
|||||||||
|
|
|
|
|
|
|
|
|
|
4 |
2.65 |
2.26 |
5.33 |
4.54 |
0.81 |
0.68 |
1.98 |
1.66 |
|
|
|
|
|
|
|
|
|
|
|
10 |
6.62 |
5.57 |
13.06 |
11.40 |
1.96 |
1.64 |
4.51 |
3.82 |
|
|
|
|
|
|
|
|
|
|
|
33 |
21.51 |
18.35 |
43.41 |
36.62 |
5.70 |
4.78 |
11.39 |
9.51 |
|
|
|
|
|
|
|
|
|
|
|
100 |
63.40 |
54.11 |
124.90 |
106.10 |
12.87 |
10.78 |
20.25 |
16.89 |
|
|
|
|
|
|
|
|
|
|
|
333 |
193.00 |
162.40 |
361.10 |
305.50 |
23.66 |
19.77 |
29.02 |
24.17 |
|
|
|
|
|
|
|
|
|
|
|
1000 |
462.60 |
393.00 |
775.20 |
661.90 |
31.71 |
26.45 |
33.88 |
28.27 |
|
|
|
|
|
|
|
|
|
|
1-10 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |