ip_write() simply gets an ip packet from a higher layer and then calls ip_send().
For example, after assembling an ip packet and placing the packet in the write queue of the appropriate udp port, udp's restart_write_fd() calls ip_write(), which then calls udp_get_data() to get the packet from the queue.
For a write to a udp file descriptor, ip_write()'s position in the big picture is as follows:
It is important to note that ip_write() ALWAYS RETURNS NW_OK! In previous versions of the network service, ip_write() returned other values (including NW_SUSPEND).