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

Sockets
9.2.8t_listen()
This function tells the socket library that socket is going to be used for accepting connections from other hosts.
Syntax
extern long t_listen(long socket, int backlog)
where:
socket is the socket to be used for accepting connections.
backlog defines the maximum length to which the queue of pending connections can grow. If a connection request arrives when the queue is full, the client receives the error message ECONNREFUSED.
Return value
Returns one of the following:
0 |
if successful. |
–1 |
if not successful. The internal socket variable errno is set to one of the |
|
errors listed in ipport.h. The value of errno can be retrieved by a call |
|
to t_errno(). |
Usage
To accept connections:
1.A socket is created with t_socket().
2.A backlog for incoming connections is specified with t_listen().
3.The connections are then accepted with t_accept().
The t_listen() call applies only to SOCK_STREAM sockets.
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
9-13 |

Sockets
9.2.9t_recv() and t_recvfrom()
These functions are used to receive messages from another socket.
Syntax
int t_recv(long socket, char *buffer, int length, int flags)
int t_recvfrom(long socket, char *buffer, int length, int flags, struct sockaddr *from)
where: |
|
socket |
is the identifier of the socket from which the messages are received. The |
|
socket is created with t_socket(). |
buffer |
is the received message. If a message is too long to fit in buffer, excess |
|
bytes may be discarded depending on the type of socket from which the |
|
message is received. |
length |
is the length of buffer in bytes. |
flags |
is formed by ORing zero or more of the following: |
|
MSG_OOB |
|
Read any out-of-band data present on the socket, rather than |
|
the regular in-band data. |
|
MSG_PEEK |
|
Look at the data present on the socket. The data is returned, but |
|
not consumed, so a subsequent receive operation will see the |
|
same data. |
from |
is either NULL, or points to a struct sockaddr that will be filled in by |
|
t_recvfrom() with the source address of the message. |
Return value
Returns one of the following:
the number of bytes received
|
if successful. |
–1 |
if not successful. The internal socket variable errno is set to one of the |
|
errors listed in ipport.h. The value of errno can be retrieved by a call |
|
to t_errno(). |
9-14 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |

Sockets
Usage
The t_recv() function can be used only on a connected socket (see t_connect()). The t_recvfrom() function can be used to receive data on a socket, whether it is in a connected state or not.
If no messages are available at the socket, the receive call waits for a message to arrive. If the socket is nonblocking (see t_setsockopt() on page 9-20), –1 is returned, with the external socket errno set to EWOULDBLOCK.
The t_select() function can be used to determine when more data arrives.
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
9-15 |

Sockets
9.2.10t_select()
This function examines the input/output descriptor sets (whose addresses are passed in readfds, writefds, and exceptfds) to see if some of their descriptors are ready for reading, ready for writing, or have an exceptional condition pending. On return, t_select() replaces the given descriptor sets with subsets consisting of the descriptors that are ready for the requested operation. The total number of ready descriptors in all the sets is returned.
Syntax
int t_select(fd_set *readfds, fd_set *writefds, fd_set *exceptfds, long timeout)
readfds is the set of socket descriptors to be tested for available data to be read.
writefds is the set of socket descriptors to be tested for available buffer space for write operations.
exceptfds is the set of socket descriptors to be tested for pending exceptional conditions (if out-of-band data is available to be read).
timeout is the wait interval in TPS. If timeout is neither 0 nor –1, it specifies the maximum number of clock ticks (at TPS ticks per second) to wait for the selection to complete. If timeout is zero, t_select() modifies the descriptor sets to indicate which are ready for the requested operation, and returns immediately. If timeout is –1, t_select() blocks until at least one of the requested operations is ready, and there is no timeout.
Return value
Returns one of the following: positive value
|
indicates the number of ready descriptors in the descriptor sets. |
0 |
indicates that the time limit referred to by timeout has expired. |
–1 |
if not successful. |
Usage
The parameters readfds, writefds, and exceptfds can be given as NULL pointers if no descriptors are of interest.
9-16 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |

Sockets
To determine if a call to t_accept() will return immediately, call t_select(), passing the socket as a member of the readfds set.
Note
Under rare circumstances, t_select() may indicate that a descriptor is ready for writing when, in fact, an attempt to write would block. This can happen if system resources necessary for a write are subsequently exhausted after the select has returned or are otherwise unavailable. If an application deems it critical that writes to a socket descriptor do not block, it should set the descriptor for nonblocking input/output using the SO_NBIO request to t_setsockopt().
The descriptors are stored within the fd_set structures as opaque objects. The macros below are provided for manipulating such structures.
The behavior of these macros is undefined if an invalid descriptor value is passed.
FD_ZERO FD_ZERO(fd_set *fdset)
This macro initializes a descriptor set fdset to the null set.
FD_SET FD_SET(long fd, fd_set *fdset)
This macro includes a particular socket descriptor fd in fdset.
FD_CLR FD_CLR(long fd, fd_set *fdset)
This macro removes fd from fdset.
FD_ISSET FD_ISSET(long fd, fd_set *fdset)
This macro is nonzero if fd is a member of fdset, and zero otherwise.
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
9-17 |