TCP/IP Library

Introduction

The D.SignT TCP/IP stack for the D.Module2.DM642 has been specifically tailored for DSP systems. No underlying RTOS (real-time operating system) is required, but the software can nevertheless be executed as a task in any RTOS.

The "working horse" of the TCP/IP stack is function net_isq(). This function handles all the background tasks, e.g. ARP requests, IP fragmentation, TCP-handshake, etc. net_isq() must be called regularly in your program - either as a part of your main program loop, a timer-initiated periodic call, or as a periodic task. This allows to grant your signal-processing tasks as much CPU time as required, and leave the remainder to network communications.

network_workflow_emac.jpg

top




Zero Copy

Special care has been taken to minimize memory transfer operations. Whereas most TCP/IP stacks use so-called netbuffers for intermediate data storage, the D.SignT TCP/IP stack transmits and receives data directly from and to user-provided buffers, avoiding additional memory copy operations.

This approach guarantees optimum performance, but programmers used to the Berkeley socket architecture for TCP/IP stacks must observe some differences in the receive and transmit functions and in establishing a TCP connection.

Zero Copy Receive
emac_receive.jpg
Zero Copy Transmit
emac_send.jpg

top




Basics

The maximum number of connections is only limited by the available memory. Whereas an operating-system based TCP/IP stack will create child processes to handle multiple network connections virtually simultaneous, the D.SignT TCP/IP stack processes multiple connections sequentially. This involves slightly increased connection times, but since DSP applications do not need to handle hundreds of simultaneous connections in parallel (like a PC web server for example) no adverse side effects will be noticeable.

To use the D.SignT TCP/IP library with ARP, ICMP, IP, UDP, TCP, DHCP and DNS support in your program, include file net.h and link the library net.lib to your project.

In addition to this required basis protocols, the following libraries must be included if necessary to enable higher protocols

top




Version History

Version History:
- 2.91.03 2019-05-22 CH
- embedded filesystem fsys: second level subdirectories not working
(images, css and js directory for HTTP server)
- HTTP server: http_send_websocket() with and without copy
- F2837x: websocket support
- F2837x: Modbus support
- tcp_send_window_update(): additional event status for callback
signalling
- F2837x HTTP server: webpages located in FLASH
- 2.91 2018-09-12 CH
- UniDAQ2 supported
- DSK6416: shorter DHCP request time
- embedded filesystem fsys: new function fsys_add_dir() to expand efs
- embedded filesystem fsys: HTTP page transmission from FLASH was
missing HTTP header
- embedded filesystem fsys: improved read function
- HTTP server: websocket support
- HTTP server: improved header creation
- HTTP server: header parsing case insensitive
- HTTP server: http_send_user_page() always returned 0
- HTTP server/embedded filesystem: file transfer too slow from
SPI-drive
- 2.90 2018-03-20 CH
- DHCP: re-transmit timeout too short
- New supported module: Unidaq2
- 2.89 2017-03-24 CH
- TCP net_recv()/receive callback returned received length 0 during
socket event SO_WINDOW_ERR
- Incoming IP Header Checksum RFC971, RFC1071 and RFC1624 tolerant
- Outgoing IP Header Checksum RFC1624 compliant
- DM648 and C6747: timeout for Intel Hex uploads too short
- FTP server: subdirectories on FAT file system were ignored in
absolute paths
- TCP: connect() increased local port regardless if it was a well
known port or not.
- FTP client: reasonable timeout and keep alive timer values if
running on SYS/BIOS.
- VC33/91c111: SMSC91c111 Configuration Register bit12 (no delay) set
- DHCP on C5x: transaction ID never changed
- D.Module2.C6657: 2-pair downshift feature supported. Auto-Negotiate
with another Gigabit link partner using cable pairs 1,2 and 3,6 to
downshift and link at 10 Mbps or 100 Mbps.
- KSZ8851: tx complete interrupt disabled to avoid endless loop
if interrupt was missed.
- 2.88 2016-09-06 CH
- DHCP client: unblocking in net_init(); consecutive net_isq() calls
required to obtain IP address.
- DHCP client: retrigger-able after link loss
- TCP: keep alive counter inactive; fixed
- DNS: DNS server address 0.0.0.0 could cause memory leak in case of
link local address assignment
- new: send packet to directed broadcast
- 2.87 2015-12-23 CH
- ARP table overflow due to incoming multicast packets from outside
of local subnet: fixed
- D.Module.C6657 supported
- EMAC: SO_SEND_PENDING error caused by concurrent net_send() calls
reset faster
- C674x OEM lib with EABI format available
- unused TCP code was not eliminated by linker due to remaining references
- EMAC: global array packet_buffer[] changed to label pbuffer_base and
pbuffer_end in linker command file. New define for packet buffer size
- 2.86 2015-01-15 CH
- new flag for gzip compressed HTTP contents
- DM9016: noise on the bus could cause wrong VLAN/BW control
settings of integrated switch device - fixed by switch reset
- 2.85 2014-10-09 CH
- data_type, data_shift and outgoing protocol information accessible
- TCP probe packets with different size caused a wrong buffer offset
calculation.
- IP: zero checksum caused dropped packets
- 2.84 2014-08-05 CH
- eZdsp5502: tx FIFO overrun caused by wrong type cast fixed
- F28xx: random MSB content of unmasked scratch register caused
wrong data content.
- 2.83 2014-02-20 CH
- SMSC91c111: if last ACK-FIN packet was lost, retransmitted packet
had wrong sequence number
- HTTP server: shorter delay for "GET" response
- TCP: last ACK after shutdown caused keep alive packet
- TCP: if incoming ACK-PUSH-FIN packet with data was retransmitted
due to packet loss, new data was not signalled to user
- TCP: CWR flag disabled on ACK-FIN packet. some stacks could delay
the last ACK-FIN packet when CWR flag was set
- ARP: gratuitous ARP delayed to overcome slow router link detect
- direntry_type: put_byte() parameter offset changed to unsigned
- direntry_type: new block read function read_block()
- FTP: long timeout when last data packet lacks FIN: fixed
- 2.82 2014-01-13 CH
- TCP: old TCP sequence with different data length was discarded
- all SMSC91c111 boards: missing auto-negotiation enable bit in
PHY control register caused link fail on certain switches even
when no auto-negotiation was requested.
- 2.81 2013-11-08 CH
- net_init(): new parameter for subnet mask and gateway
- F28335: wrong data size for DATATYPE_SHORT sockets
- 2.80 2013-10-24 CH
- eZdspF28335: timing issues
- eZdspF28335: wrong TCP checksum was caused by a wrong 16bit cast
operator
- TCP: additional RST packet for dangling connection
- 2.79 2013-09-18 CH
- TCP: retransmitted FIN flag could be counted twice
- TCP transmit: lost FIN, SYN and RST packets are now retransmitted
- TCP receive: lost FIN packet handled by sending additional
ACK or (ACK | FIN) packet
- FTP Server: fast retransmits disabled
- HTTP: fast retransmits disabled
- HTTP: early free of dynamic memory for finished connection to
save memory
- HTTP: new state machine for monitoring connections
- HTTP: timeouts for detecting dangling connection changed
- HTTP: new functions http_set_up_page() and http_send_page() for
delayed transmission
- 2.78 2013-06-28 CH
- TI compiler tools updated
- parameter types verified
- 2.77 2013-04-11 CH
- TCP: FIN-packet during delayed ACK could cause final data packet
lost. SOCKET structure member res_align2 used to store last packet
length
- FTP Client: data socket timeout increased when file transmission
complete was signalled on control socket to receive delayed packets.
- 2.76 2013-03-07 CH
- F28XX: wrong checksum generation for keep alive packets
- 2.75 2013-02-26 CH
- TCP: Error code SO_TIMED_OUT set when pending SO_WINDOW_ERR and
ARP cache clear occurred. ARP cache clear occurs only after no
packets were received for some time.
- socket_struct extended with member "proto" for used protocol
- error code SO_BUFFER_TOO_SMALL was not reset
- 2.74 2012-07-18 CH
- random start-up time from init to established link is used as seed
value for srand() function
- DHCP: received DHCP answer re-triggers DHCP request timeout
- DHCP: random delay between re-transmits
- DHCP/Auto-IP: failed DHCP request caused endless Auto-IP loop
- 2.73 2012-06-11 CH
- TCP connect caused ARP flood if destination was unreachable
- TCP connect(): parameter retry and timeout not working correctly
- check_arp_address(): freeing NULL pointer as ARP address caused
ARP cache overrun
- 2.72 2012-05-30 CH
- DHCP: multiple DNS IP addresses could cause endless loop;
- DHCP: invalid option field and data length in incoming DHCP message ignored;
- VC33+ADSP21065: net_recv() and callback function returned wrong data size for
DATATYPE_INT TCP sockets
- FTP server: adoption to new dFAT filesystem rev. 2.0; RAM-disc and
SD/MM-card > 2GB supported.
- DM2DM642: TCP retransmit time increased
- new Ethernet controller Davicom DM9016 supported
- DHCP: transaction ID now derived from MAC address
- DM9016+LXT971: MD interrupt assigned to GPIO19
- 2.68 2011-09-15 CH
- FSYS: missing end condition could cause endless loop.
- FSYS, HTTP, F28xx: missing header packet for Java source
- DHCP: several enhancements
- ARP: RARP requests disabled
- behaviour of gateway changed, level 2/3 router supported
- new socket option SO_USE_PROXY to access a router doing NAT
- ARP: if a destination was unreachable for hours, a new ARP request
could take a long time due to wrong backoff algorithm. fixed
- ARP: timed out addresses are deleted from ARP table, not only
invalidated
- 2.63 2011-05-12 CH
- Interrupt combiner activated for DM648
- new socket error SO_NO_TCP_MEM instead of endless loop in case of
out of sequence number error
- TCP option SACK could cause wrong MSS. fixed
- callback function call could cause data pointer NULL when send was
in progress. fixed.
- DNS databuffer never freed. fixed
- wrong subnet mask for auto-IP link-local address. fixed
- FTP server: sporadic hanging data transmission due to connection
status not reset. fixed
- 2.59 2010-12-23 CH
- connect() returned error without error code
- TCP: missing ACK for old packets
- SMSC91c111: wrong padding byte caused oversized packet
- SMSC91C111: error message SO_IN_USE wrongly set during TCP ACK
- TCP: unexpected packet flood stopped with zero window packet
- TCP: reassembling of missed packets after retransmit
- 2.57 2010-10-13 CH
- performance issues for giga bit
- HTTP: illegal pointer could cause malfunction
- TCP: ACK-FIN and RST could cause illegal socket pointer during
retransmit
- FSYS: ASCII and binary file upload revised and simplified
- SMSC91c111: new timeout and MMU reset during wait for allocation
interrupt
- HTTP: new webpage generator makewebpage generates an entire webpage
with subpages and subdirectories
- HTTP: changed limits: MAX_DIR = 200, MAX_NAME_LEN = 60
- ARP: wrong timeout could block ARP request
- DM648: shorter delay in TCP state TCP_STATE_WAIT
- DM648: wrong ALE clear bit definition caused random address filter
- 2.53 2010-05-06 CH
- TCP: non-volatile variable could cause a missing re-transmit
- SMC91c111: additional MMU reset after timeout in smc_write_packet_data()
- HTTP: transmitting a large page could cause connection timeout
- FTP client: double FTP_free_data call could cause DSP hang
- FSYS: Transmit error flag could terminate TCP connection
- HTTP: new socket ageing. Older sockets are closed and freed faster
- VC33: incoming MAC address word 0000 caused address FFFF.
- FSYS: file size algorithm improved
- FTP Server: data socket in passive mode with wrong port number
- TCP: Remote Window update could cause wrong input length
- SMSC91c111: link detection timeout increased
- VC33: optimizer caused wrong integer arithmetic
- 2.47 2010-02-10 CH
- SMSC91c111: reliability improvements
- TCP: remote window size estimated during receive faults
- DHCP: new Auto IP configuration, when DHCP server is not available
- Multicast: packets with a zero checksum were ignored when socket
option SO_UDP_NO_CHECKSUM was used
- pserver/TCP: new TCP state TIME_WAIT to prevent accidental
connection
- HTTP: TCP retransmits activated
- HTTP: insufficient HEAP could lead to dangling connection
- UDP broadcast caused checksum error
- EMAC: uninitialized variable could cause socket mismatch in seldom cases
- UDP: receiving and sending broadcast messages
- HTTP: improved transfers for elements located in RAM
- 2.39 2009-10-02 CH
- SMSC91c111: RX overrun with MMU reset instead of processing
receive
- SMSC91c111: Receiver and transmitter disabled during RX
overrun
- SMSC91c111: Re-allocate TX packet during RX overrun when
allocation is in progress
- SMSC91c111: wait for TX complete during RX overrun
- TCP: transmit of acknowledge could cause recursion during
receive
- SMSC91c111: TX FIFO empty flag in PTR register checked
instead of TX complete interrupt flag
- TCP: received packet during retransmit lost
- TCP: tcp_tx_complete() triggers retransmit if necessary
- 2.37 2009-09-11 CH
- TCP: ACK-FIN sometimes with wrong sequence number. fixed
- TCP: new transmit complete function tcp_tx_complete()
- netlib: internal string functions replaced by rts
- C6x: early keep alive packet after connect() could cause
confusion in certain clients
- SMC91C111: timeout for emergency reset too short
- new error code SO_DNS_ERR for pending DNS requests
- SMC91C111: temporary socket could cause receive problems
- F28xx: Write-Followed-by-Read Pipeline conflict fixed (SPRU067.pdf)
- TCP: ACK-FIN after retransmit with wrong sequence number
- 2.31 2009-08-11 CH
- TCP:missing delayed acknowledge could cause wrong receive window
- EVM6747 supported
- DM642: additional cache write back for 32bit wide SDRAM
- socket structure and multicast overlay structure concatenated
- UDP: new socket error SO_NO_ARP_ADDRESS for unresolved addresses
- Socket option SO_UDP_NO_CHECKSUM caused wrong checksum error
- dual Ethernet bug: net_send() blocked forever when link not
established
- dual Ethernet bug: net_isq() processed always three smsc91c111
- SMSC91c111 bug: rx overrun error not handled. fixed
- TCP: missing fast retransmit after rx overrun error
- TCP: new dynamic sequence number administration
- SMC91c111: old rx buffer re-use for transmit FIFO improved
chip internal memory allocation
- 2.22 2009-02-05 CH
- TCP: duplicate retransmit packet with wrong sequence number
- new meaning of net_send() return value
- TCP: improved TCP flow control, new internal timing
parameter for retransmit and timeout
- connect() with timeout value 0 returns immediately
- DHCP client: missing retransmit
- EMAC: missing isr loop could cause UDP checksum error
- single multicast address with different ports
- EVM6437 supported
- net_recv() extension for fragmented IP packets
- new keep alive timer for TCP
- C6x: uninitialized function pointer could cause DSP/BIOS reset
- second parameter of dhcp_func() changed to u_int16_t
- EMAC: missing cache write back caused problems when heap
was linked to external memory
- 2.15 2008-04-09 CH
- FTP server supports absolute paths
- FTP server supports passive transfer mode
- Fragmented UDP packet caused checksum error
- DSK5509, DSK5510: wrong byte ordering in FLASH write/read.
- DM642, DSK6455: erroneous link detect. fixed
- new socket option SO_TCP_ACK_KEEPALIVE: a TCP keep alive
packet is acknowledged
- DM642, DSK6455: TCP option length > 8 bytes ignored, new
- option length up to 24 bytes allowed.
- embedded filesystem: small ASCII files (<1460 bytes) in RAM
with wrong file length. fixed
- FTP server with new return structure for a detailed result
- FTP server command DELE for erasing a FLASH sector
- eZdsp TMS320F28335 supported
- incremental checksum update error (RFC1624)
- 2.11 2007-12-07 CH
- DSK6455 MEZZANINE supported with 1000 MBit full duplex mode
- F2812: Linear address space for file upload
- DSK91c111: external PHY Intel LXT971 with fiber support
- F2812: wrong data length in callback function for data type short
- F2812: wrong data length in net_send function for data type short
- DSK91c111: missing status word in transmit could lead to lost packets
- new HTTP authentication method.
- FTP server support for F2812
- TCP: low TCP data throughput after retransmit; fixed
- TCP: new TCP option TCP_UNA_SEG for setting the unacknowledged
segment size.
- DSK91c111: new initialization function dsk_init()
- DSK91c111: new link status callback function
- IP: wrong receive data size for DATATYPE_INT
- Embedded file system: a static local length information
caused an upload error 2 when a file was uploaded twice.
- Sockets: wrong internal buffer pointer during delayed
acknowledge could cause error2 error after hex file upload.
- 2.00 22 Feb 2007 CH
- FSYS: fsys_ascii_bin_upload() could block; fixed
- FSYS: wrong file buffer initialization could lead to free(NULL)
- New supported TI DSP's: F2812, DM642, C6455
- FTP server: wrong case for D.FAT and Flash File System
- 1.97 1 Feb 2007 CH
- TCP: wrong acknowledge sequence number when ACK | FIN is
received with data > 0
- FTP client: far section of FTPclient.lib could not be linked
into external memory
- missing 0xffff mask caused a non-working TCP in VDSP3.5
- TCP: ST_TCP_WIN_FLAG was not reset after window error clear
- net_send_ready(): new timeout calculation
- 1.96 29 May 2006 CH
- Packet driver: smc_release_packet could cause endless loop.
- FTP server: memory leak in PORT command
- TI C6x: some bugfixes for activated cache
- new error code in TCP: net_recv() returns -1 with error_code
SO_CONNECTION_ESTABLISHED when a new connection is established.
- Packet driver: packet header cached in socket structure
- TI C6x: Some structure alignments for cache line fitting
- DSK C6711, C6713 and C6416: no timer is used for initialization
- 1.95 14 Dec 2005 CH
- static TCP sequence numbers
- IP TOS field accessible
- static ARP table
- FTP Client: no 64K buffer limitation
- TCP: Uninitialized retransmit timer could cause unwanted
retransmits and sequence number mismatch. Fixed
- new FTP to FAT interface for D.FAT or external filesystem
- TCP: some improvements for stability
- Packet driver smsc91c111: wrong bank select could cause a
dead lock. fixed
- Wrong interrupt handling and a silicon bug on smsc19c111
could cause lost packets. fixed
- 1.9 14 Apr 2005 CH
- IP: on some IP packets the carry flag caused a checksum error on Sharc
- UDP: ignore checksum zero
- CCS 3.0 new structure alignment
- TCP-Sockets: wrong buffersize check caused a constant delay. fixed
- TCP: small buffer size lead to slow connection. fixed
- HTTP: java class names case insensitive. fixed
- Embedded file system: directory names case insensitive. fixed
- Wrong MAC address in ARP table on gateway multicast packets. fixed
- HTTP: interrupted transmission could lead to HTTP-404 not found error. fixed
- FSYS: fsys_init_file(): dynamic file buffer pointer could be
overwritten. Fixed
- TCP bug: Early ACK could cause recursion. Fixed
- New Library for FTP client support
- First level of Multicast Address support
- 1.8 21 Jun 2004 CH
- socket_define_callback() - new user callback function
definition for receiving packets.
- new memory management on 91C111.
- fsys_intelhex_download() wrong flash read function caused
malfunction on D.Module.C6713.
- malformed intel-hex download fixed.
- Intel-hex upload with zero delimited lines possible (
useful for some telnet connections).
- TCP bug: send_tcp_option():during window error no retransmit
possible
- TCP bug: internal destination window size was decreased on
retransmit
- WinXP TCP Transmission problems: new sequence number cache
architecture for retransmits
- 1.7 17 Dec 2004 CH
- TCP Bug: Wrong TCP Option in SYN Packets in sockets with
- New 10/100MBit Ethernet D.Module.91C111 adapted
- RARP- reverse ARP implemented
- When IP-address 0.0.0.0 configured, RARP request is sent and new
- IP-address is assigned on RARP-reply or valid ICMP-packet.
- Bug in net_send_ready(): Wrong data length for data type int
- new function get_ip_address(), set_ip_address()
- TCP bugfix: some TCP-packets caused a checksum error
- 1.6 3 Jun 2003 CH
- TCP state closed added. Use with new socket option
- SO_TCP_STATE_CLOSED and tcp_listen() function.
- TCP: Ack is sent immediately after receiving ( and not in
- Visual DSP++ 1.0 bug: arithmetic overflow interrupt
occurred on msb-test.
- TCP: maximum receive-packet-size increased from 536 to 1460 Bytes.
- TCP: wrong sequence number comparison on acknowledge-packet in
established mode.
- New Hardware DSK-91C111 adapted.
- Support for DSK C5510, C6711 and C6416
- 1.5 12 Nov 2002 CH
- HTTP Support for http.lib
- fsys.c - simple file support functions for d.modules
- pserver.c - parallel server support
- UDP bug fixed: checksum error for fragmented packets fixed
- TCP bug fixed: wrong TCP-checksum on delayed packets
- pragma CODE_SECTION .nettestfast and .nettestslow
- Gateway implemented
- net_recv_ready() bug: wrong length on connection closed
- TCP bug fixed: RST-flag in TCP_FIN_WAIT_1 & _2 not recognized
- ST_NEW_DATA_FLAG was not reset after connection close or reset
- TCP & UDP bug fixed: carry flag lost in 32 bit pseudo checksum
- 1.4 23 Mai 2002 CH:
- TCP bug: wrong socket option for MSS in SYN packet
(effect: a socket DATATYPE_INT could not be connected)
- SO_CONNECTION_RESET was not reported to user
- accept() implemented
- net_send_string() implemented
- net_send_ready(): no limitation of bytes to send
- FTP Support for ftp.lib
- 1.3 30 Apr 2002 CH:
- TCP: duplicate packet rejection
- complete DHCP sequence (DHCPDISCOVER - DHCPOFFER - DHCPREQUEST - DHCPACK ) implemented
- DMA transfer for TMS320 6x
- connect(): wrong max retry value
- TCP: FIN -flag sometimes not reset
- TCP: received ACK,PSH,FIN was not recognized in net_recv()
- TCP: senders window size was ignored; new error
message: SO_WINDOW_ERR.
- 1.2 23 Jan 2002 CH:
- DHCP: initialization bug fixed
- new blocking receive function: net_recv_ready()
- new timeouts and retransmit values for connect() and shutdown()
- 1.1 11 Dec 2001 CH:
- socket_open() changed:
- parameter protocol removed, init_func is
sufficient to determine protocol
- net_init() changed:
- if DHCP and DNS are both enabled
DNS Server IP may be set to NULL
to use the DHCP server machine for
name resolution
- net_init() waits for DHCP server response
- TCP: sequence number bug fixed
- 1.0 22 Oct 2001 by CH :
initial release



top


RFC1122 feature compliance:

Refer to RFC1122 for feature details

      IP Layer
      =====================================================
      FEATURE                                          | |
      -------------------------------------------------| |-
                                                       | |
      Implement IP and ICMP                            |x|
      Handle remote multihoming in application layer   | |
      Support local multihoming                        | |
      Meet gateway specs if forward datagrams          |x|
      Configuration switch for embedded gateway        |x|
         Config switch default to non-gateway          |x|
         Auto-config based on number of interfaces     |x|
      Able to log discarded datagrams                  | |
         Record in counter                             | |
                                                       | |
      Silently discard Version != 4                    |x|
      Verify IP checksum, silently discard bad dgram   |x|
      Addressing:                                      | |
        Subnet addressing (RFC-950)                    |x|
        Src address must be host's own IP address      |x|
        Silently discard datagram with bad dest addr   |x|
        Silently discard datagram with bad src addr    |x|
      Support reassembly                               |x|
      Retain same Id field in identical datagram       |x|
                                                       | |
      TOS:                                             | |
        Allow transport layer to set TOS               |x|
        Pass received TOS up to transport layer        |x|
        Use RFC-795 link-layer mappings for TOS        | |
      TTL:                                             | |
        Send packet with TTL of 0                      | |
        Discard received packets with TTL < 2          | |
        Allow transport layer to set TTL               | |
        Fixed TTL is configurable                      |x|
                                                       | |
      IP Options:                                      | |
        Allow transport layer to send IP options       | |
        Pass all IP options rcvd to higher layer       | |
        IP layer silently ignore unknown options       |x|
        Security option                                | |
        Send Stream Identifier option                  | |
        Silently ignore Stream Identifer option        |x|
        Record Route option                            | |
        Timestamp option                               | |
      Source Route Option:                             | |
        Originate & terminate Source Route options     | |
        Datagram with completed SR passed up to TL     | |
        Build correct (non-redundant) return route     | |
        Send multiple SR options in one header         | |
                                                       | |
      ICMP:                                            | |
        Silently discard ICMP msg with unknown type    |x|
        Include more than 8 octets of orig datagram    | |
            Included octets same as received           | |
        Demux ICMP Error to transport protocol         | |
        Send ICMP error message with TOS=0             | |
        Send ICMP error message for:                   | |
         - ICMP error msg                              | |
         - IP b'cast or IP m'cast                      | |
         - Link-layer b'cast                           | |
         - Non-initial fragment                        | |
         - Datagram with non-unique src address        | |
        Return ICMP error msgs (when not prohibited)   | |
                                                       | |
        Dest Unreachable:                              | |
          Generate Dest Unreachable (code 2/3)         | |
          Pass ICMP Dest Unreachable to higher layer   | |
          Higher layer act on Dest Unreach             | |
            Interpret Dest Unreach as only hint        | |
        Redirect:                                      | |
          Host send Redirect                           | |
          Update route cache when recv Redirect        | |
          Handle both Host and Net Redirects           | |
          Discard illegal Redirect                     | |
        Source Quench:                                 | |
          Send Source Quench if buffering exceeded     | |
          Pass Source Quench to higher layer           | |
          Higher layer act on Source Quench            | |
        Time Exceeded: pass to higher layer            | |
        Parameter Problem:                             | |
          Send Parameter Problem messages              | |
          Pass Parameter Problem to higher layer       | |
          Report Parameter Problem to user             | |
                                                       | |
        ICMP Echo Request or Reply:                    |x|
          Echo server and Echo client                  |x|
          Echo client                                  |x|
          Discard Echo Request to broadcast address    | |
          Discard Echo Request to multicast address    | |
          Use specific-dest addr as Echo Reply src     | |
          Send same data in Echo Reply                 |x|
          Pass Echo Reply to higher layer              |x|
          Reflect Record Route, Time Stamp options     | |
          Reverse and reflect Source Route option      | |
                                                       | |
        ICMP Information Request or Reply:             | |
        ICMP Timestamp and Timestamp Reply:            | |
          Minimize delay variability                   | |
          Silently discard b'cast Timestamp            | |
          Silently discard m'cast Timestamp            | |
          Use specific-dest addr as TS Reply src       | |
          Reflect Record Route, Time Stamp options     | |
          Reverse and reflect Source Route option      | |
          Pass Timestamp Reply to higher layer         | |
          Obey rules for "standard value"              | |
                                                       | |
        ICMP Address Mask Request and Reply:           | |
          Addr Mask source configurable                | |
          Support static configuration of addr mask    | |
          Get addr mask dynamically during booting     | |
          Get addr via ICMP Addr Mask Request/Reply    | |
            Retransmit Addr Mask Req if no Reply       | |
            Assume default mask if no Reply            | |
            Update address mask from first Reply only  | |
          Reasonableness check on Addr Mask            | |
          Send unauthorized Addr Mask Reply msgs       | |
            Explicitly configured to be agent          | |
          Static config=> Addr-Mask-Authoritative flag | |
            Broadcast Addr Mask Reply when init.       | |
                                                       | |
      ROUTING OUTBOUND DATAGRAMS:                      | |
        Use address mask in local/remote decision      | |
        Operate with no gateways on conn network       | |
        Maintain "route cache" of next-hop gateways    | |
        Treat Host and Net Redirect the same           | |
        If no cache entry, use default gateway         |x|
          Support multiple default gateways            | |
        Provide table of static routes                 | |
          Flag: route overridable by Redirects         | |
        Key route cache on host, not net address       | |
        Include TOS in route cache                     | |
                                                       | |
        Able to detect failure of next-hop gateway     | |
        Assume route is good forever                   | |
        Ping gateways continuously                     | |
        Ping only when traffic being sent              | |
        Ping only when no positive indication          | |
        Higher and lower layers give advice            | |
        Switch from failed default g'way to another    | |
        Manual method of entering config info          | |
                                                       | |
      REASSEMBLY and FRAGMENTATION:                    | |
        Able to reassemble incoming datagrams          |x|
          At least 576 byte datagrams                  |x|
          EMTU_R configurable or indefinite            | |
        Transport layer able to learn MMS_R            | |
        Send ICMP Time Exceeded on reassembly timeout  | |
          Fixed reassembly timeout value               |x|
                                                       | |
        Pass MMS_S to higher layers                    | |
        Local fragmentation of outgoing packets        |x|
           Else don't send bigger than MMS_S           | |
        Send max 576 to off-net destination            | |
        All-Subnets-MTU configuration flag             | |
                                                       | |
      MULTIHOMING:                                     | |
        Reply with same addr as spec-dest addr         | |
        Allow application to choose local IP addr      | |
        Silently discard d'gram in "wrong" interface   | |
        Only send d'gram through "right" interface     | |
                                                       | |
      SOURCE-ROUTE FORWARDING:                         | |
        Forward datagram with Source Route option      | |
          Obey corresponding gateway rules             | |
            Update TTL by gateway rules                | |
            Able to generate ICMP err code 4, 5        | |
            IP src addr not local host                 | |
            Update Timestamp, Record Route options     | |
          Configurable switch for non-local SRing      | |
            Defaults to OFF                            | |
          Satisfy gwy access rules for non-local SRing | |
          If not forward, send Dest Unreach (cd 5)     | |
                                                       | |
      BROADCAST:                                       | |
        Broadcast addr as IP source addr               |x|
        Receive 0 or -1 broadcast formats OK           | |
        Config'ble option to send 0 or -1 b'cast       | |
          Default to -1 broadcast                      |x|
        Recognize all broadcast address formats        |x|
        Use IP b'cast/m'cast addr in link-layer b'cast | |
        Silently discard link-layer-only b'cast dg's   | |
        Use Limited Broadcast addr for connected net   | |
                                                       | |
      MULTICAST:                                       | |
        Support local IP multicasting (RFC-1112)       |x|
        Support IGMP (RFC-1112)                        | |
        Join all-hosts group at startup                | |
        Higher layers learn i'face m'cast capability   | |
                                                       | |
      INTERFACE:                                       | |
        Allow transport layer to use all IP mechanisms | |
        Pass interface ident up to transport layer     |x|
        Pass all IP options up to transport layer      | |
        Transport layer can send certain ICMP messages | |
        Pass spec'd ICMP messages up to transp. layer  | |
           Include IP hdr+8 octets or more from orig.  | |
        Able to leap tall buildings at a single bound  | |



      UDP Layer
      =====================================================
      FEATURE                                          | |
      -------------------------------------------------| |-
                                                       | |
      UDP send Port Unreachable                        |x|
                                                       | |
      IP Options in UDP                                | |
       - Pass rcv'd IP options to applic layer         |x|
       - Applic layer can specify IP options in Send   |x|
       - UDP passes IP options down to IP layer        |x|
                                                       | |
      Pass ICMP msgs up to applic layer                |x|
                                                       | |
      UDP checksums:                                   | |
       - Able to generate/check checksum               |x|
       - Silently discard bad checksum                 |x|
       - Sender Option to not generate checksum        |x|
         - Default is to checksum                      |x|
       - Receiver Option to require checksum           |x|
                                                       | |
      UDP Multihoming                                  | |
       - Pass spec-dest addr to application            | |
       - Applic layer can specify Local IP addr        | |
       - Applic layer specify wild Local IP addr       | |
       - Applic layer notified of Local IP addr used   | |
                                                       | |
      Bad IP src addr silently discarded by UDP/IP     |x|
      Only send valid IP source address                |x|
      UDP Application Interface Services               | |
      Full IP interface of 3.4 for application         |x|
       - Able to spec TTL, TOS, IP opts when send dg   |x|
       - Pass received TOS up to applic layer          |x|



      TCP Layer
      =====================================================
      FEATURE                                          | |
      -------------------------------------------------| |-
                                                       | |
      Push flag                                        | |
        Aggregate or queue un-pushed data              |x|
        Sender collapse successive PSH flags           |x|
        SEND call can specify PUSH                     | |
          If cannot: sender buffer indefinitely        | |
          If cannot: PSH last segment                  |x|
        Notify receiving ALP of PSH                    |x|
        Send max size segment when possible            |x|
                                                       | |
      Window                                           | |
        Treat as unsigned number                       |x|
        Handle as 32-bit number                        | |
        Shrink window from right                       | |
        Robust against shrinking window                |x|
        Receiver's window closed indefinitely          | |
        Sender probe zero window                       |x|
          First probe after RTO                        |x|
          Exponential backoff                          |x|
        Allow window stay zero indefinitely            |x|
        Sender timeout OK conn with zero wind          | |
                                                       | |
      Urgent Data                                      | |
        Pointer points to last octet                   | |
        Arbitrary length urgent data sequence          | |
        Inform ALP asynchronously of urgent data       | |
        ALP can learn if/how much urgent data Q'd      | |
                                                       | |
      TCP Options                                      | |
        Receive TCP option in any segment              |x|
        Ignore unsupported options                     |x|
        Cope with illegal option length                |x|
        Implement sending & receiving MSS option       |x|
        Send MSS option unless 536                     | |
        Send MSS option always                         |x|
        Send-MSS default is 536                        | |
        Calculate effective send seg size              | |
                                                       | |
      TCP Checksums                                    | |
        Sender compute checksum                        |x|
        Receiver check checksum                        |x|
                                                       | |
      Use clock-driven ISN selection                   |x|
                                                       | |
      Opening Connections                              | |
        Support simultaneous open attempts             |x|
        SYN-RCVD remembers last state                  |x|
        Passive Open call interfere with others        |x|
        Function: simultan. LISTENs for same port      |x|
        Ask IP for src address for SYN if necc.        |x|
          Otherwise, use local addr of conn.           |x|
        OPEN to broadcast/multicast IP Address         | |
        Silently discard seg to bcast/mcast addr       |x|
                                                       | |
      Closing Connections                              | |
        RST can contain data                           |x|
        Inform application of aborted conn             |x|
        Half-duplex close connections                  | |
          Send RST to indicate data lost               |x|
        In TIME-WAIT state for 2xMSL seconds           |x|
          Accept SYN from TIME-WAIT state              | |
                                                       | |
      Retransmissions                                  | |
        Jacobson Slow Start algorithm                  |x|
        Jacobson Congestion-Avoidance algorithm        |x|
        Retransmit with same IP ident                  |x|
        Karn's algorithm                               | |
        Jacobson's RTO estimation alg.                 | |
        Exponential backoff                            |x|
        SYN RTO calc same as data                      |x|
        Recommended initial values and bounds          |x|
                                                       | |
      Generating ACK's:                                | |
        Queue out-of-order segments                    | |
        Process all Q'd before send ACK                |x|
        Send ACK for out-of-order segment              |x|
        Delayed ACK's                                  |x|
          Delay < 0.5 seconds                          |x|
          Every 2nd full-sized segment ACK'd           |x|
        Receiver SWS-Avoidance Algorithm               |x|
                                                       | |
      Sending data                                     | |
        Configurable TTL                               |x|
        Sender SWS-Avoidance Algorithm                 |x|
        Nagle algorithm                                |x|
          Application can disable Nagle algorithm      |x|
                                                       | |
      Connection Failures:                             | |
        Negative advice to IP on R1 retxs              |x|
        Close connection on R2 retxs                   |x|
        ALP can set R2                                 |x|
        Inform ALP of  R1<=retxs<R2                    |x|
        Recommended values for R1, R2                  |x|
        Same mechanism for SYNs                        |x|
          R2 at least 3 minutes for SYN                | |
                                                       | |
      Send Keep-alive Packets:                         |x|
        - Application can request                      |x|
        - Default is "off"                             | |
        - Only send if idle for interval               |x|
        - Interval configurable                        |x|
        - Default at least 2 hrs.                      | |
        - Tolerant of lost ACK's                       |x|
                                                       | |
      IP Options                                       | |
        Ignore options TCP doesn't understand          |x|
        Time Stamp support                             | |
        Record Route support                           | |
        Source Route:                                  | |
          ALP can specify                              | |
            Overrides src rt in datagram               | |
          Build return route from src rt               | |
          Later src route overrides                    | |
                                                       | |
      Receiving ICMP Messages from IP                  | |
        Dest. Unreach (0,1,5) => inform ALP            | |
        Dest. Unreach (0,1,5) => abort conn            | |
        Dest. Unreach (2-4) => abort conn              | |
        Source Quench => slow start                    | |
        Time Exceeded => tell ALP, don't abort         | |
        Param Problem => tell ALP, don't abort         | |
                                                       | |
      Address Validation                               | |
        Reject OPEN call to invalid IP address         | |
        Reject SYN from invalid IP address             |x|
        Silently discard SYN to bcast/mcast addr       |x|
                                                       | |
      TCP/ALP Interface Services                       | |
        Error Report mechanism                         |x|
        ALP can disable Error Report Routine           |x|
        ALP can specify TOS for sending                |x|
          Passed unchanged to IP                       |x|
        ALP can change TOS during connection           |x|
        Pass received TOS up to ALP                    |x|
        FLUSH call                                     | |
        Optional local IP addr parm. in OPEN           | |

top