- •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.4t_errno()
This function is used to retrieve the current value of the error flag associated with a socket. The error status is not reset by this call.
Syntax
int t_errno (long s)
where:
s |
is a socket descriptor. |
Return value
The current error value associated with this socket (see Socket error codes on page A-3).
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
9-7 |
Sockets
9.2.5t_getpeername()
This function returns the IP addressing information of the connected host.
Syntax
int t_getpeername(long socket, struct sockaddr *name)
where:
socket is the socket on which addressing information for the remote, connected host is returned.
name |
is the returned IP address and port information. |
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(). |
9-8 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |
Sockets
9.2.6t_getsockname()
This function returns the current name for the specified socket.
Syntax
int t_getsockname(long socket, struct sockaddr *name)
where: |
|
socket |
is the identifier of the socket to be named. |
name |
is the name of the specified socket. On return from |
|
t_getsocketname(), this parameter contains IP address and port |
|
number information for socket. |
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(). |
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
9-9 |
Sockets
9.2.7t_getsockopt()
This function returns the options associated with a socket.
Syntax
int t_getsockopt(long socket, int optname, void *optval)
where:
socket is the socket for which the option values are returned.
optname is the name of the option to be examined. The options are discussed in more detail below.
optval is a pointer to a location where the value of the requested option is to be stored. If no option value is to be returned, optval can be supplied as NULL. Other than SO_LINGER, most socket-level options take a pointer to an int parameter for optval.
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(). |
Options
The following options are available:
SO_BIO This returns the value 1 if the socket is currently set to be blocking.
SO_BROADCAST
If nonzero, this requests permission to send broadcast datagrams on the socket. Broadcast was a privileged operation in earlier implementations of sockets.
SO_DONTROUTE
If nonzero, this indicates that outgoing messages must bypass the standard routing facilities. Instead, messages are directed to the appropriate network interface according to the network portion of the destination address.
9-10 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |
Sockets
SO_ERROR This returns any pending error on the socket and clears the error status. It can be used to check for asynchronous errors on connected datagram sockets or for other asynchronous errors.
SO_KEEPALIVE
If nonzero, this enables the periodic transmission of messages on a connected socket. If the connected party fails to respond to these messages, the connection is considered broken.
SO_LINGER
This controls the action taken when unsent messages are queued on socket and a t_socketclose() is performed. If the socket promises reliable delivery of data and SO_LINGER is set, the system blocks the process on the t_socketclose() attempt until it is able to transmit the data or until it decides it is unable to deliver the information. A timeout period, known as the linger interval, is specified in the t_setsockopt() call when SO_LINGER is requested.
If SO_LINGER is disabled and a t_socketclose() is issued, the system processes the close in a manner that allows the process to continue as quickly as possible.
SO_LINGER uses a pointer to a struct linger parameter, defined in socket.h, that specifies the desired state of the option and the linger interval.
SO_MAXMSG This returns the TCP maximum segment size (TCP_MSS) as defined in tcpport.h.
SO_MYADDR This returns the IP address of the primary network interface for this host.
SO_NBIO This returns the value 1 if the socket is currently set to be nonblocking.
SO_OOBINLINE
If nonzero, this option requests that out-of-band data be placed in the normal data input queue as received. It is then accessible through t_recv() calls without the MSG_OOB flag. This is valid with protocols that support out-of-band data.
SO_REUSEADDR
If nonzero, SO_REUSADDR indicates that the rules used in validating addresses supplied in a t_bind() call should allow reuse of local addresses.
SO_RXDATA This returns the number of characters currently available for reading from the socket.
ARM DUI 0079B |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
9-11 |
Sockets
SO_SNDBUF and SO_RCVBUF
These return the buffer sizes allocated for output and input buffers, respectively.
SO_TYPE This returns the type of the socket, such as SOCK_STREAM. It is useful for servers that inherit sockets on startup.
9-12 |
Copyright © 1998 and 1999 ARM Limited. All rights reserved. |
ARM DUI 0079B |