Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / include / ipxe / neighbour.h
1 #ifndef _IPXE_NEIGHBOUR_H
2 #define _IPXE_NEIGHBOUR_H
3
4 /** @file
5  *
6  * Neighbour discovery
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER );
11
12 #include <stdint.h>
13 #include <ipxe/refcnt.h>
14 #include <ipxe/list.h>
15 #include <ipxe/netdevice.h>
16 #include <ipxe/retry.h>
17
18 /** A neighbour discovery protocol */
19 struct neighbour_discovery {
20         /** Name */
21         const char *name;
22         /**
23          * Transmit neighbour discovery request
24          *
25          * @v netdev            Network device
26          * @v net_protocol      Network-layer protocol
27          * @v net_dest          Destination network-layer address
28          * @v net_source        Source network-layer address
29          * @ret rc              Return status code
30          */
31         int ( * tx_request ) ( struct net_device *netdev,
32                                struct net_protocol *net_protocol,
33                                const void *net_dest, const void *net_source );
34 };
35
36 /** A neighbour cache entry */
37 struct neighbour {
38         /** Reference count */
39         struct refcnt refcnt;
40         /** List of neighbour cache entries */
41         struct list_head list;
42
43         /** Network device */
44         struct net_device *netdev;
45         /** Network-layer protocol */
46         struct net_protocol *net_protocol;
47         /** Network-layer destination address */
48         uint8_t net_dest[MAX_NET_ADDR_LEN];
49         /** Link-layer destination address */
50         uint8_t ll_dest[MAX_LL_ADDR_LEN];
51
52         /** Neighbour discovery protocol (if any) */
53         struct neighbour_discovery *discovery;
54         /** Network-layer source address (if any) */
55         uint8_t net_source[MAX_NET_ADDR_LEN];
56         /** Retransmission timer */
57         struct retry_timer timer;
58
59         /** Pending I/O buffers */
60         struct list_head tx_queue;
61 };
62
63 /**
64  * Test if neighbour cache entry has a valid link-layer address
65  *
66  * @v neighbour         Neighbour cache entry
67  * @ret has_ll_dest     Neighbour cache entry has a valid link-layer address
68  */
69 static inline __attribute__ (( always_inline )) int
70 neighbour_has_ll_dest ( struct neighbour *neighbour ) {
71         return ( ! timer_running ( &neighbour->timer ) );
72 }
73
74 extern struct list_head neighbours;
75
76 extern int neighbour_tx ( struct io_buffer *iobuf, struct net_device *netdev,
77                           struct net_protocol *net_protocol,
78                           const void *net_dest,
79                           struct neighbour_discovery *discovery,
80                           const void *net_source, const void *ll_source );
81 extern int neighbour_update ( struct net_device *netdev,
82                               struct net_protocol *net_protocol,
83                               const void *net_dest, const void *ll_dest );
84 extern int neighbour_define ( struct net_device *netdev,
85                               struct net_protocol *net_protocol,
86                               const void *net_dest, const void *ll_dest );
87
88 #endif /* _IPXE_NEIGHBOUR_H */