- •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
TCP/IP API Functions
4.3.2n_close()
This function performs the tasks required to shutdown the device and its associated driver software prior to exiting the application. Any resources allocated to accommodate multiple packet types, for example, 0x0800 for IP and 0x0806 for ARP, should be released here. On embedded systems that start their devices at power up and do not shut them down, this function is not required.
Syntax
int n_close(int if_number)
where:
if_number is an index into the nets[ ] array of the interface to be closed.
Return value
Returns one of the following:
0 |
if successful. |
ENP_Code if not successful (see ENP_ error codes on page A-2).
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
4-19 |
TCP/IP API Functions
4.3.3n_init()
This function prepares the device to send and receive packets. It is called during system startup after prep_ifaces() has been called, and before any of the other network interface functions are invoked.
Syntax
int n_init(int if_number)
where:
if_number is an index into the nets[ ] array of the interface to be initialized.
Return value
Returns one of the following:
0 |
if successful. |
ENP_Code if not successful (see ENP_ error codes on page A-2).
Usage
When this function returns, the device should be set up as follows:
•the network hardware should be ready to send and receive packets
•all required fields of the nets[ ] structure should be filled in
•the MIB-II structure of the interface should be filled in, as shown in Example 4-2 on page 4-21
•IP addressing information should be set before this function returns unless DHCP or BOOTP is to be used (see Specifying IP addresses on page 2-14).
This function typically includes hardware operations, such as initializing the device and enabling interrupts. It does not include setting protocol types. This is handled by n_reg_type().
On returning from this function, it is safe for your hardware interrupt or receive functions to start queuing received packets in the rvcdq queue. Packets that are not IP or ARP are discarded by the stack.
4-20 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |
TCP/IP API Functions
The nets[ ] structure should be completely filled in when this function returns. The structure is defined in \inet\net.h. The work of filling this structure is shared between prep_ifaces() and n_init(). If all your nets[ ] structure setup was done in prep_ifaces() (see prep_ifaces() on page 4-12), there may be no additional work.
Example 4-2 shows example code for setting up the MIB structure for a 10MB Ethernet interface. The n_mib field points to a structure that has already been statically allocated by the calling code. See RFC 1213 for detailed descriptions of the MIB fields.
Most of the MIB fields are used only for debugging and statistical information and are not critical unless your device is managed by SNMP. The ifPhysAddress field is an exception. It is used by ARP to obtain the MAC address of the hardware and must be set up correctly for the IP stack to work over Ethernet.
Although ifPhysAddress is a pointer, it does not point to valid memory when the MIB structure is created. You must make sure it points to a static buffer containing the MAC address before n_init() returns. The size of this address is determined by the media (6 bytes for Ethernet) and should be set in the nets[ ] structure member n_hal (hardware address length).
Example 4-2
nets[if_number]->nmib->ifDescr = "Ethernet Packet Driver"; nets[if_number]->nmib->ifType = ETHERNET;
/*SNMP Ethernet type */ nets[if_number]->nmib->ifMtu = ET_MAXLEN; nets[if_number]->nmib->ifSpeed = 10000000;
/* 10 megabits per second */ nets[if_number]->nmib->ifAdminStatus = 1; nets[if_number]->nmib->ifOperStatus = 1; nets[if_number]->nmib->ifPhysAddress = &macaddress[0];
/* example */
See the example Olicom driver interface in \pid7tdm\olicom.c.
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
4-21 |
TCP/IP API Functions
4.3.4n_reg_type()
This function registers with lower level drivers to receive a MAC type, such as 0x0800 for IP and 0x0806 for ARP.
Syntax
int n_reg_type(unsigned short type, NET net) where:
type |
is the MAC type to be registered. |
net |
is a pointer to the NET structure corresponding to this interface. |
Return value
Returns one of the following:
0 |
if successful. |
ENP_Code if not successful (see ENP_ error codes on page A-2).
Usage
On most embedded systems with Ethernet, the ARM stack does not share the hardware with other network stacks, so no action is required. The stack gets all the packets and n_reg_type() can return an OK status without doing anything. However, you should make sure that all received packets are passed to the stack. On some driver subsystems, a type must be registered with the driver. On other drivers, an intermediate layer must be notified that the application is interested in the packets.
On SLIP links, all packets are IP, so you need not modify n_reg_type().
On PPP links, PPP processes the packets, so you need not modify n_reg_type().
4-22 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |