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

PPP Porting
3.2Porting PPP
This section outlines the steps you must follow to port the ARM PPP code into the ARM IP stack. Initially, define USE_PPP in ipport.h and include the PPP sources in your makefile or project file (.apj).
Several port-specific defines, functions, and static variables must be set up before PPP can operate. These are:
#define _NPPP 3
The maximum number of simultaneous PPP connections allowed (for example, 1 per modem).
void ConPrintf(char *, …);
A user-provided printf-like function for debugging. In the sample program, this can be set to send its output to the console, a log file, or both. Logging to a file during development is highly recommended if you are writing a new serial driver.
int ppp_port_init(int unit);
The hook for per-port initialization. You should provide code in this function to initialize the nets[] and ppp_lines[] entries.
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
3-3 |

PPP Porting
3.2.1Source files
As provided, the PPP source code is several C source files and include files. These are called the PPP portable or port-independent source files. You do not need to modify these for a normal PPP port.
The PPP code is organized into files that are named for the layer or module implemented. For example, lcp.c implements the LCP functionality. All connection-oriented modules have a number of functions that implement the FSM. These are table driven and, as such, are compiled into fsm_callbacks structures as defined in fsm.h. Typically, you do not have to modify these functions.
Two additional files, one C source and one include file, are provided as part of the sample package. These files implement the port-dependent functions. You must duplicate the functionality of these files in the target system as part of the porting process.
The sample port files are both approximately 8KB of commented source. They are:
•ppp_port.c
•ppp_port.h.
It is recommended that you compile and run the sample programs before you begin your porting activity. This will give you some hands-on experience with PPP and you will have the opportunity to step through the PPP code under the source level debugger. Also, if your port is unsuccessful, you will have a working reference platform to aid in debugging.
3-4 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |

PPP Porting
3.2.2Compiling PPP
The first step in the porting process is to compile the portable portions of the PPP code in your development system. You must set up a makefile or project (.apj) file with the appropriate compile options, library invocations, and linking command.
PPP include file
To compile the code, you must provide your own version of the ppp_port.h file to define the data types shown in Example 3-1:
Example 3-1
typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned short unshort; typedef unsigned long u_long; typedef int bool;
#ifndef TRUE #define TRUE -1 #endif
#ifndef FALSE #define FALSE 0 #endif
#ifndef NULL
#define NULL ((void*)0) #endif
/* 8-bit unsigned */ /* 16-bit unsigned */ /* duplicate */
/* 32-bit unsigned */ /* another common */ /* type extension */
typedef unsigned long ip_addr; |
/* 32-bit IP v4 address */ |
|
|
For most compilers, you can use these defines exactly as they appear in the sample package nptypes.h file, which is in the ..\inet directory.
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
3-5 |

PPP Porting
Setting PPP options
Early in the porting process, you must decide which of the optional features of PPP you want to utilize, and set the ifdefs for them. These ifdefs are generally set in your ppp_port.h file. The options they include can be useful, but they can nearly double the size of the PPP code. If your systems have limited memory, you may want to omit these options. Most ports can simply define VJC and CHAP_SUPPORT, so you can go to Entry points and support calls on page 3-8. However, the compile-time options are documented here for completeness.
The following C code excerpt shows all options enabled:
#define VJC |
1 |
/* VJ header compression */ |
#define CHAP_SUPPORT |
1 |
/* CHAP authentication */ |
#define PAP_SUPPORT |
1 |
/* password authentication */ |
#define LOCAL_RAND |
1 |
/* use random number generator */ |
|
|
/* in magic.c */ |
#define LB_XOVER |
1 |
/* cross 2 loopback lines for test */ |
#define MSCHAP_SUPPORT |
1 |
/* enable Microsoft CHAP */ |
|
|
/* authentication */ |
Each of these compile switches is described below:
VJC |
Enables the use of Van Jacobson Compression (VJC) to compress TCP/IP |
|
headers. VJC is a simple compression algorithm for TCP/IP headers. It is |
|
based on the principle that most of the information in the 40-byte TCP |
|
and IP headers does not vary on a PPP link from frame to frame. The |
|
40-byte header is replaced with a much smaller header containing only |
|
the variable information. |
|
Because many TCP/IP packets contain only the headers, this can reduce |
|
the byte traffic on a PPP link by over 50% before any data compression |
|
is applied to the data portion of the packet. The drawback to VJC is that |
|
the code is one of the larger modules of PPP. See SLCOMPRE in Table |
|
1-3 on page 1-14. |
|
Disabling VJC does not prevent your system from operating with any |
|
other PPP. It causes both systems to disable the feature and slows |
|
performance. |
CHAP_SUPPORT
Includes the code for CHAP and MD5. CHAP must be configured with a secret by the end user and negotiated when LCP connects. If this feature is disabled, you do not need to provide the get_secret() function.
3-6 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |

PPP Porting
MSCHAP_SUPPORT
Includes the code for MS-CHAP, using DES and MD4. If this feature is enabled, you must also enable CHAP_SUPPORT.
PAP_SUPPORT
Includes the code for UPAP. UPAP must be configured by the end user and negotiated when LCP connects.
LOCAL_RAND
This includes code to provide a pseudo-random number generator that is used as part of the compression code. On most target systems, the standard C library calls rand() and srand() are supported. This option must be enabled to provide these calls on systems that do not already have them.
LB_XOVER This option applies only if the PPP line loopback driver is used. It configures the loopback driver code to crossover two logical PPP units to each other. Bytes sent on either unit are received on the other crossed-over unit. This provides a testing environment for emulating PPP client/server conditions.
This option is normally used only for development and testing and is not needed in the final product. You must define the two unit numbers to be connected. See the loopback example project (loopback on page 12-5).
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
3-7 |