~ubuntu-branches/ubuntu/trusty/ipxe/trusty

« back to all changes in this revision

Viewing changes to src/net/tcpip.c

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2013-11-26 17:50:47 UTC
  • mfrom: (1.1.5) (17.1.1 trusty-proposed)
  • Revision ID: package-import@ubuntu.com-20131126175047-8uf02a31ul9wpqgx
Tags: 1.0.0+git-20131111.c3d1e78-1ubuntu1
* Merge from Debian unstable, remaining changes:
  - d/p/enable-https.patch: Enable HTTPS support.
  - d/control,grub-ipxe*: Split grub integration from ipxe->grub-ipxe.
  - d/control: Transition kvm-ipxe->ipxe-qemu for LTS->LTS upgrade.
  - d/ipxe-qemu.links: Add compat links from /usr/share/qemu to
    /usr/lib/ipxe/qemu.
  - d/ipxe-qemu.install: Install ne.rom as pxe-ne2k_isa.rom.
* All other changes dropped in preference to upstream Debian
  packaging.
* d/control: Add libiberty-dev to BD's to fix FTBFS.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#include <stdint.h>
 
2
#include <stdlib.h>
2
3
#include <string.h>
3
4
#include <errno.h>
4
5
#include <byteswap.h>
19
20
/** Process a received TCP/IP packet
20
21
 *
21
22
 * @v iobuf             I/O buffer
 
23
 * @v netdev            Network device
22
24
 * @v tcpip_proto       Transport-layer protocol number
23
25
 * @v st_src            Partially-filled source address
24
26
 * @v st_dest           Partially-filled destination address
31
33
 * address family and the network-layer addresses, but leave the ports
32
34
 * and the rest of the structures as zero).
33
35
 */
34
 
int tcpip_rx ( struct io_buffer *iobuf, uint8_t tcpip_proto, 
35
 
               struct sockaddr_tcpip *st_src,
 
36
int tcpip_rx ( struct io_buffer *iobuf, struct net_device *netdev,
 
37
               uint8_t tcpip_proto, struct sockaddr_tcpip *st_src,
36
38
               struct sockaddr_tcpip *st_dest,
37
39
               uint16_t pshdr_csum ) {
38
40
        struct tcpip_protocol *tcpip;
41
43
        for_each_table_entry ( tcpip, TCPIP_PROTOCOLS ) {
42
44
                if ( tcpip->tcpip_proto == tcpip_proto ) {
43
45
                        DBG ( "TCP/IP received %s packet\n", tcpip->name );
44
 
                        return tcpip->rx ( iobuf, st_src, st_dest, pshdr_csum );
 
46
                        return tcpip->rx ( iobuf, netdev, st_src, st_dest,
 
47
                                           pshdr_csum );
45
48
                }
46
49
        }
47
50
 
133
136
uint16_t tcpip_chksum ( const void *data, size_t len ) {
134
137
        return tcpip_continue_chksum ( TCPIP_EMPTY_CSUM, data, len );
135
138
}
 
139
 
 
140
/**
 
141
 * Bind to local TCP/IP port
 
142
 *
 
143
 * @v st_local          Local TCP/IP socket address, or NULL
 
144
 * @v available         Function to check port availability
 
145
 * @ret port            Local port number, or negative error
 
146
 */
 
147
int tcpip_bind ( struct sockaddr_tcpip *st_local,
 
148
                 int ( * available ) ( int port ) ) {
 
149
        uint16_t flags = 0;
 
150
        uint16_t try_port = 0;
 
151
        uint16_t min_port;
 
152
        uint16_t max_port;
 
153
        unsigned int offset;
 
154
        unsigned int i;
 
155
 
 
156
        /* Extract parameters from local socket address */
 
157
        if ( st_local ) {
 
158
                flags = st_local->st_flags;
 
159
                try_port = ntohs ( st_local->st_port );
 
160
        }
 
161
 
 
162
        /* If an explicit port is specified, check its availability */
 
163
        if ( try_port )
 
164
                return available ( try_port );
 
165
 
 
166
        /* Otherwise, find an available port in the range [1,1023] or
 
167
         * [1025,65535] as appropriate.
 
168
         */
 
169
        min_port = ( ( ( ! flags ) & TCPIP_BIND_PRIVILEGED ) + 1 );
 
170
        max_port = ( ( flags & TCPIP_BIND_PRIVILEGED ) - 1 );
 
171
        offset = random();
 
172
        for ( i = 0 ; i <= max_port ; i++ ) {
 
173
                try_port = ( ( i + offset ) & max_port );
 
174
                if ( try_port < min_port )
 
175
                        continue;
 
176
                if ( available ( try_port ) < 0 )
 
177
                        continue;
 
178
                return try_port;
 
179
        }
 
180
        return -EADDRINUSE;
 
181
}