Socket infrastructure change and basic udp send.
[akaros.git] / kern / include / net / udp.h
1 #ifndef ROS_KERN_UDP_H
2 #define ROS_KERN_UDP_H
3 #include <net/pbuf.h>
4 #include <net.h>
5 #include <bits/netinet.h>
6 #include <socket.h>
7
8 #define UDP_HLEN 8
9 #define UDP_TTL 255
10
11 struct udp_pcb {
12     struct in_addr local_ip;
13     struct in_addr remote_ip;
14     /** ports are in host byte order */
15     uint16_t local_port, remote_port;
16     uint8_t ttl;
17     uint8_t flags;
18     /* Protocol specific PCB members */
19     struct udp_pcb *next;
20 #if 0
21   /** receive callback function */
22   udp_recv_fn recv;
23   /** user-supplied argument for the recv callback */
24   void *recv_arg;  
25 #endif
26 };
27
28 extern struct udp_pcb *udp_pcbs;
29 #define GLOBAL_IP 0x0A000001 // 10.0.0.1
30 struct udp_pcb * udp_new(void);
31 int udp_send(struct udp_pcb *pcb, struct pbuf *p);
32 int udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
33                     struct in_addr *dst_ip, uint16_t dst_port);
34 int udp_bind(struct udp_pcb *pcb, struct in_addr *ip, uint16_t port);
35 #if 0
36 #define UDP_FLAGS_NOCHKSUM       0x01U
37 #define UDP_FLAGS_UDPLITE        0x02U
38 #define UDP_FLAGS_CONNECTED      0x04U
39 #define UDP_FLAGS_MULTICAST_LOOP 0x08U
40
41
42 /** Function prototype for udp pcb receive callback functions
43  * addr and port are in same byte order as in the pcb
44  * The callback is responsible for freeing the pbuf
45  * if it's not used any more.
46  *
47  * ATTENTION: Be aware that 'addr' points into the pbuf 'p' so freeing this pbuf
48  *            makes 'addr' invalid, too.
49  *
50  * @param arg user supplied argument (udp_pcb.recv_arg)
51  * @param pcb the udp_pcb which received data
52  * @param p the packet buffer that was received
53  * @param addr the remote IP address from which the packet was received
54  * @param port the remote port from which the packet was received
55  */
56 typedef void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p,
57     ip_addr_t *addr, u16_t port);
58
59
60 /* udp_pcbs export for exernal reference (e.g. SNMP agent) */
61 extern struct udp_pcb *udp_pcbs;
62
63 /* The following functions is the application layer interface to the
64    UDP code. */
65 void             udp_remove     (struct udp_pcb *pcb);
66 err_t            udp_bind       (struct udp_pcb *pcb, ip_addr_t *ipaddr,
67                                  u16_t port);
68 err_t            udp_connect    (struct udp_pcb *pcb, ip_addr_t *ipaddr,
69                                  u16_t port);
70 void             udp_disconnect (struct udp_pcb *pcb);
71 void             udp_recv       (struct udp_pcb *pcb, udp_recv_fn recv,
72                                  void *recv_arg);
73 err_t            udp_sendto_if  (struct udp_pcb *pcb, struct pbuf *p,
74                                  ip_addr_t *dst_ip, u16_t dst_port,
75                                  struct netif *netif);
76 err_t            udp_sendto     (struct udp_pcb *pcb, struct pbuf *p,
77                                  ip_addr_t *dst_ip, u16_t dst_port);
78 err_t            udp_send       (struct udp_pcb *pcb, struct pbuf *p);
79
80 #if LWIP_CHECKSUM_ON_COPY
81 err_t            udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p,
82                                  ip_addr_t *dst_ip, u16_t dst_port,
83                                  struct netif *netif, u8_t have_chksum,
84                                  u16_t chksum);
85 err_t            udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p,
86                                  ip_addr_t *dst_ip, u16_t dst_port,
87                                  u8_t have_chksum, u16_t chksum);
88 err_t            udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p,
89                                  u8_t have_chksum, u16_t chksum);
90 #endif /* LWIP_CHECKSUM_ON_COPY */
91
92 #define          udp_flags(pcb) ((pcb)->flags)
93 #define          udp_setflags(pcb, f)  ((pcb)->flags = (f))
94
95 /* The following functions are the lower layer interface to UDP. */
96 void             udp_input      (struct pbuf *p, struct netif *inp);
97
98 #define udp_init() /* Compatibility define, not init needed. */
99
100 #if UDP_DEBUG
101 void udp_debug_print(struct udp_hdr *udphdr);
102 #else
103 #define udp_debug_print(udphdr)
104 #endif
105
106 #ifdef __cplusplus
107 }
108 #endif
109
110 #endif /* LWIP_UDP */
111
112 //#endif /* if 0 , comment out */
113 #endif /* __LWIP_UDP_H__ */