summaryrefslogtreecommitdiffhomepage
path: root/src/event/ngx_event_udp.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/event/ngx_event_udp.h')
-rw-r--r--src/event/ngx_event_udp.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/event/ngx_event_udp.h b/src/event/ngx_event_udp.h
new file mode 100644
index 000000000..31d46b7df
--- /dev/null
+++ b/src/event/ngx_event_udp.h
@@ -0,0 +1,76 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#ifndef _NGX_EVENT_UDP_H_INCLUDED_
+#define _NGX_EVENT_UDP_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+#if !(NGX_WIN32)
+
+#if ((NGX_HAVE_MSGHDR_MSG_CONTROL) \
+ && (NGX_HAVE_IP_SENDSRCADDR || NGX_HAVE_IP_RECVDSTADDR \
+ || NGX_HAVE_IP_PKTINFO \
+ || (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)))
+#define NGX_HAVE_ADDRINFO_CMSG 1
+#endif
+
+
+typedef struct {
+ ngx_buf_t *buffer;
+ struct sockaddr *sockaddr;
+ socklen_t socklen;
+} ngx_udp_dgram_t;
+
+
+struct ngx_udp_connection_s {
+ ngx_rbtree_node_t node;
+ ngx_connection_t *connection;
+ ngx_str_t key;
+ ngx_udp_dgram_t *dgram;
+};
+
+
+#if (NGX_HAVE_ADDRINFO_CMSG)
+
+typedef union {
+#if (NGX_HAVE_IP_SENDSRCADDR || NGX_HAVE_IP_RECVDSTADDR)
+ struct in_addr addr;
+#endif
+
+#if (NGX_HAVE_IP_PKTINFO)
+ struct in_pktinfo pkt;
+#endif
+
+#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)
+ struct in6_pktinfo pkt6;
+#endif
+} ngx_addrinfo_t;
+
+size_t ngx_set_srcaddr_cmsg(struct cmsghdr *cmsg,
+ struct sockaddr *local_sockaddr);
+ngx_int_t ngx_get_srcaddr_cmsg(struct cmsghdr *cmsg,
+ struct sockaddr *local_sockaddr);
+
+#endif
+
+
+void ngx_event_recvmsg(ngx_event_t *ev);
+ssize_t ngx_sendmsg(ngx_connection_t *c, struct msghdr *msg, int flags);
+void ngx_udp_rbtree_insert_value(ngx_rbtree_node_t *temp,
+ ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
+void ngx_insert_udp_connection(ngx_connection_t *c, ngx_udp_connection_t *udp,
+ ngx_str_t *key);
+
+#endif
+
+void ngx_delete_udp_connection(void *data);
+
+
+#endif /* _NGX_EVENT_UDP_H_INCLUDED_ */