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