# NDK Change Log

## Table of Contents

## NDK 3.61

### Bugs

ID | Summary
--- | ---
NDK-392 | General documentation updates
NDK-390 | TI toolchain versions in release notes are incorrect
NDK-387 | NDK's general syscfg module does not pass configuration to stack init hook
NDK-382 | NDK services create memory leak when exiting their tasks
NDK-381 | Broken link in ConfigDoc.html's DHCP.dhcpClientPcbServer description
NDK-380 | Users cannot rebuild A53 libraries

### Enhancements

ID | Summary
--- | ---
NDK-353 | Add M33F (TICLANG) library support

## NDK 3.60

### Bugs

ID | Summary
--- | ---
NDK-322 | Rename NDK_RegisterHook and NDK_getsockctx to conform to naming conventions
NDK-319 | Possible double free if TLS handshake fails
NDK-318 | SlNetIfNDK should use POSIX sem's rather than pthread_mutexes
NDK-316 | Remove SysConfig-generated code's dependency on Display
NDK-315 | Sockets do not remove themselves from the fd table if not closed through slnetifndk
NDK-314 | Changing SysConfig IP addr config from static to dynamic causes build failure
NDK-92 | return value of NIMU registered init function not checked
NDK-29 | Remove the need for Telnet users to supply VerStr symbol

### Enhancements

ID | Summary
--- | ---
NDK-309 | Enable NIMU drivers to offload IPv4 Checksums to hardware
NDK-297 | Provide SysConfig support for configuring the NDK's DHCP Server Module
NDK-296 | Provide SysConfig support for configuring the NDK's NAT Module
NDK-295 | Provide SysConfig support for configuring the NDK's DNS Module
NDK-294 | Update docs with info on Selective Acknowledgement feature
NDK-270 | Extend C-ROV NDK socket support
NDK-238 | Provide SysConfig support for configuring the NDK's Telnet Module

### Compatibility Notes

NDK 3.60 is mostly compatible with 3.50, with the following exceptions:

- To address NDK-322, the following functions have been renamed: `NDK_getsockctx()` became `NDK_getSockCtx()`, and `NDK_RegisterHook()` became `NDK_registerHook()`. We expect very few users will be impacted, as both of these functions were introduced in NDK 3.50.
- For SimpleLink devices, the SysConfig feature is still in ‘preview’ and the NDK is not yet ensuring compatibility from release to release. Some NDK configuration variables have changed, and as a result, existing .syscfg scripts that configure the NDK may not load, and users may have to restart from an existing example.

## NDK 3.50

### Bugs

ID | Summary
--- | ---
NDK-290 | Shallow copy of deep object in ti_ndk_config_ip_init()
NDK-289 | Fix return codes in slnetifndk sockopt translation
NDK-284 | Update ti.ndk.config package to load POSIX Settings module
NDK-275 | SlNetSock_getLocalName() broken when using NDK
NDK-274 | Broken links in API Guide's Table of Contents
NDK-268 | Access to ti_ndk_socket_fdtable must be atomic
NDK-251 | NDK_socket/accept needs to honor config parameter maxSockFileDesc
NDK-228 | Release notes link to benchmarks broken
NDK-218 | Update TcpPrSetOption() to allow SACK to be disabled

### Enhancements

ID | Summary
--- | ---
NDK-283 | Add NDK 2.x to 3.x Migration Guide
NDK-276 | SysConfig - Place NDK's Modules in their own category
NDK-269 | Update docs to improve IPv6 usability
NDK-263 | Minor documentation clarifications

## NDK 3.40

### Bugs

ID | Summary
--- | ---
NDK-262 | Translate TCP options in SlNetIfNDK
NDK-261 | Add NDK prefix to TCP constants
NDK-260 | Error codes in serrno.h need to be prefixed with NDK_
NDK-259 | Add support for ENETDOWN in SlNetIfNDK
NDK-257 | Remove documentation for APIs no longer present in NDK
NDK-252 | Add support for MSG_PEEK and other missing flags in SlNetIfNDK_recv
NDK-240 | Update DNS macros to have NDK_ prefix
NDK-233 | Add support into SlNetIfNDK for SO_BROADCAST option
NDK-135 | check for NULL pointer before deref in IPv6 route code

### Enhancements

ID | Summary
--- | ---
NDK-242 | Move inet_ntop and inet_pton functions from NDK and into NS
NDK-199 | Add C-ROV support into NDK
NDK-121 | Add A53F gcc support
NDK-105 | Remove support for several legacy targets (non-gcc A8, M3, non-TI M4)

### Compatibility Notes

This release contains several compatibility breaks, which may require users to update and rebuild their source code.

- To address NDK-261, the following TCP macro names were changed. If your code contains references to any previous macro name, it must be updated to prepend `NDK_` to the name:

Previous Name | New Name
--- | ---
TCP_NODELAY | NDK_TCP_NODELAY
TCP_MAXSEG | NDK_TCP_MAXSEG
TCP_NOPUSH | NDK_TCP_NOPUSH
TCP_NOOPT | NDK_TCP_NOOPT
TCP_SACKPERMITTED | NDK_TCP_SACKPERMITTED
TCP_MAXRTT | NDK_TCP_MAXRTT

- To address NDK-240, the following DNS macro names were changed. If your code contains references to any previous macro name, it must be updated to prepend `NDK_DNS_E` to the name, with the exception of `NOERROR`. `NOERROR` is prepended with `NDK_DNS_`:

Previous Name | New Name
--- | ---
NOERROR | NDK_DNS_NOERROR
FORMERR | NDK_DNS_EFORMERR
SERVFAIL | NDK_DNS_ESERVFAIL
NXDOMAIN | NDK_DNS_ENXDOMAIN
NOTIMP | NDK_DNS_ENOTIMP
REFUSED | NDK_DNS_EREFUSED
OVERFLOW | NDK_DNS_EOVERFLOW
MEMERROR | NDK_DNS_EMEMERROR
SOCKETERROR | NDK_DNS_ESOCKETERROR
NODNSREPLY | NDK_DNS_ENODNSREPLY

- To address NDK-260, all of the error code macros found in ti/ndk/inc/serrno.h have been renamed to have `NDK_` prepended to them.
  - For example, `EINVAL` has been renamed and is now `NDK_EINVAL`.
  - Similar for all other error macros found in serrno.h
  - If your code contains references to any of these macros, you must update your code to use the new names and rebuild.
  - Refer to ti/ndk/inc/serrno.h for further details.
- To address NDK-242, the following APIs were moved out of the NDK and into the Network Services product:
  - `inet_pton`
  - `inet_ntop`
  - If your code contains references to these functions, you may not have to change the actual calls to these functions in your code (since these BSD/POSIX APIs are identically defined by the BSD/POSIX headers in Network Services). However, you may need to update include path and link libraries of your application build, so that Network Services header files and libraries are pulled in. Additionally (if not already being done), it may be necessary to add the appropriate Network Services runtime initialization calls into your application. Please refer to the Network Services documentation and examples for more details.

## NDK 3.30

### Bugs

ID | Summary
--- | ---
NDK-244 | Translate address family in SlNetIfNDK
NDK-243 | Allow servers to request client authentication
NDK-237 | TLS handshake fails when the server requests a local certificate but none is provided
NDK-234 | inet_ntop() does not null terminate strings correctly for IPv6
NDK-232 | Call Sock6CleanPcb() when an IPv6 address is removed and/or IPv6 is deinitialized
NDK-230 | Potential crash if client on a closed, lingering socket sends TCP_RST
NDK-225 | Potential crash when sockets linger and the stack is shut down
NDK-221 | Broken links in Users and API Guides
NDK-205 | Add NDK_ prefix to BIGENDIAN macro
NDK-200 | Add NDK_ prefix to global stats variables
NDK-36 | add llEnter/llExit around calls to SockCleanPcb()

### Enhancements

ID | Summary
--- | ---
NDK-206 | Update preprocessor big endian detection for all supported compilers
NDK-127 | Move getaddrinfo and freeaddrinfo into NS

### Compatibility Notes

- `getaddrinfo()` and `freeaddrinfo()` have been migrated to the Network Services Component (ti/net namespace).
  - As part of this migration, the values of the associated error code macros have changed (e.g. `EAI_FAMILY`, `EAI_NONAME`, etc.)
  - Therefore, any user application code that’s referencing the `EAI_*` macros must be rebuilt.
  - The signatures of these functions remain unchanged, so there is no break in compatibility regarding the APIs themselves.
- Some NDK global variables and macros have been renamed to have a namespace prefix
  - Any code that’s referencing the NDK global statistics variables (e.g. `tcps`, `udps`, etc.) will need to be updated ito add the `NDK_` prefix to those macros (e.g. `NDK_tcps`, `NDK_udps`) and rebuilt.
  - Similarly, any code that references the NDK macro `BIGENDIAN` will need to be updated to have the prefix (`NDK_BIGENDIAN`) and rebuilt.

## NDK 3.20

### Bugs

ID | Summary
--- | ---
NDK-208 | Change incorrect use of pthread_self() API in example code of documentation
NDK-71 | NDK BSD fd_set type overridden by sys/types.h shipped with BIOS

### Enhancements

ID | Summary
--- | ---
NDK-216 | Handle big endian detection properly for new tool chains
NDK-190 | NDK documentation updates
NDK-184 | Support SlNetIfNDK_getConnectionStatus()
NDK-175 | Make NDK callable from any thread
NDK-171 | Update NIMU IOCTL to support query of driver/interface link status
NDK-55 | Convert NDK Users Guides from pdf to html (via markdown)

### Compatibility Notes

- NDK + SYS/BIOS applications must define a BIOS Task hook set and register function
  - The NDK requires the following function to be registered in the SYS/BIOS *.cfg file:
    - `NDK_hookInit()`

  - This can be done using the following configuration code in the *.cfg file:

          var Task = xdc.useModule('ti.sysbios.knl.Task');
          var ndkHooks = new Task.HookSet();
          ndkHooks.registerFxn = '&NDK_hookInit';
          Task.addHookSet(ndkHooks);

  - This Task hook set and registration is handled automatically for application configurations that use the ti.ndk.config.Global module

- A special note to SimpleLink SDK users building non-NDK applications with SYS/BIOS:
  - If your application is using the default kernel configuration file, it will already have the previously mentioned configuration code to register the `NDK_hookInit()` function. This will result in undefined symbol errors for non-NDK applications.
  - There are three ways to work around this problem in a non-NDK SYS/BIOS application:
    1. Use a different SYS/BIOS kernel configuration (*.cfg) file
       - By default, the kernel configuration used in the examples contains the above code. You can create a new kernel configuration file which does not register the `NDK_hookInit()` function (hence removing the unwanted dependency) and build your application against it.
    2. Link the appropriate NDK OSAL library (which contains the `NDK_hookInit()` function definition) into your application.
       - Although your application doesn’t need the NDK, this will resolve the undefined symbol error.

    3. Provide an empty `NDK_hookInit()` stub. This could be done using a weak symbol as follows:

           /*
            * The following function is only used in applications that use the NDK TCP/IP
            * stack
            */
           #if defined(__IAR_SYSTEMS_ICC__)
           __weak void NDK_hookInit(int32_t id) {}
           #elif defined(__GNUC__) && !defined(__ti__)
           void __attribute__((weak)) NDK_hookInit(int32_t id) {}
           #else
           #pragma WEAK (NDK_hookInit)
           void NDK_hookInit(int32_t id) {}
           #endif

## NDK 3.10

### Bugs

ID | Summary
--- | ---
NDK-201 | udpecho does not receive correct payload
NDK-197 | accept() must support NULL address and address_len params
NDK-192 | NDK_bind needs to check for NULL arguments passed
NDK-183 | Race condition in SlNetIfNDK_startSec

### Enhancements

ID | Summary
--- | ---
NDK-198 | SlNetIfNDK should return more specific error codes when possible
NDK-196 | Add NDK_ prefix to all network byte order macros
NDK-189 | SlNetSock-using apps shouldn't require mbedtls footprint if they don't use it

### Compatibility Notes

- To address NDK-196, any code intending to use the NDK-provided “network byte order macros” (e.g. `htonl()`) will need to add the `NDK_` prefix to those macros (e.g. `NDK_htonl()`). In most cases, users intend to use the BSD/POSIX-defined macros (rather than those in the NDK), and should 1) continue using the BSD/POSIX-defined macros (e.g. `htonl()`), and obtain those definitions from the BSD/POSIX headers (e.g. `#include <arpa/inet.h>`), found along the BSD/POSIX include path (i.e. source/ti/net/bsd).

## NDK 3.00

### Bugs

ID | Summary
--- | ---
NDK-181 | NDK timeval struct conflicts with definition in GCC 6.x tool chain
NDK-167 | Fix memory leak in socket clean up code
NDK-130 | Remove conflicting bzero and bcopy definitions from the NDK
NDK-120 | NDK should support/use actual integer file descriptors for socket APIs
NDK-119 | Freeing invalid sockets causes crash
NDK-67 | Various NDK definitions (pipe and fd macros) conflict with the same ones that are shipped in the compiler
NDK-61 | possible race condition in TcpPrDetach causes NULL ptr dereference
NDK-41 | NDK interrupt module creates a 256 byte array to store a single interrupt
NDK-17 | Must update NDK list_* APIs to have a function pre-fix

### Enhancements

ID | Summary
--- | ---
NDK-169 | Remove NDK's (light) ROV support
NDK-168 | Remove C66 big endian libraries
NDK-155 | Enable FreeRTOS support in NDK
NDK-151 | Add mbedtls support to NDK
NDK-142 | Add MSP432E support to NDK
NDK-140 | Add support for 32-bit and 64-bit Linux targets in NDK
NDK-138 | Remove SNTP from NDK (as it is moving to Network Services)
NDK-128 | mmBulkAlloc should call malloc() NOT Memory_alloc()
NDK-126 | Remove NDK local typedefs (e.g. UINT32) and use C99 standard types
NDK-124 | NDK should use system wide errno
NDK-115 | MSG_NOSIGNAL is undefined
NDK-103 | Update OS layer to use POSIX APIs
NDK-73 | use GNUC preprocessor constant, not default #else, for GNU compiler specific code
NDK-70 | ARP table behavior implemented by SDOCM00107816 should be default behavior in NDK
NDK-20 | remove Interrupt_add() and related APIs

### Compatibility Notes

NDK 3.x has undergone significant changes from NDK 2.x, and as such, anyone upgrading from a previous NDK 2.x release will require user changes. A brief summary of these changes include:

- Restructuring of the OSAL to support FreeRTOS as well as SYS/BIOS
- Alignment on common C99 data types
- Gradual migration of BSD support from stack-specific NDK (ti/ndk namespace) into stack-agnostic Network Services (ti/net namespace).