tcp_info: more documentation on last_data_recv
[raindrops.git] / ext / raindrops / linux_tcp_info.c
blob1a2048cc8b2e853e47cf98cc66837a30445a49a5
1 #include <ruby.h>
2 #include <sys/socket.h>
3 #include <netinet/in.h>
4 #include <linux/tcp.h>
5 #ifdef TCP_INFO
6 #include "my_fileno.h"
8 #define TCPI_ATTR_READER(x) \
9 static VALUE tcp_info_##x(VALUE self) \
10 { \
11 struct tcp_info *info = DATA_PTR(self); \
12 return UINT2NUM((uint32_t)info->tcpi_##x); \
15 TCPI_ATTR_READER(state)
16 TCPI_ATTR_READER(ca_state)
17 TCPI_ATTR_READER(retransmits)
18 TCPI_ATTR_READER(probes)
19 TCPI_ATTR_READER(backoff)
20 TCPI_ATTR_READER(options)
21 TCPI_ATTR_READER(snd_wscale)
22 TCPI_ATTR_READER(rcv_wscale)
23 TCPI_ATTR_READER(rto)
24 TCPI_ATTR_READER(ato)
25 TCPI_ATTR_READER(snd_mss)
26 TCPI_ATTR_READER(rcv_mss)
27 TCPI_ATTR_READER(unacked)
28 TCPI_ATTR_READER(sacked)
29 TCPI_ATTR_READER(lost)
30 TCPI_ATTR_READER(retrans)
31 TCPI_ATTR_READER(fackets)
32 TCPI_ATTR_READER(last_data_sent)
33 TCPI_ATTR_READER(last_ack_sent)
34 TCPI_ATTR_READER(last_data_recv)
35 TCPI_ATTR_READER(last_ack_recv)
36 TCPI_ATTR_READER(pmtu)
37 TCPI_ATTR_READER(rcv_ssthresh)
38 TCPI_ATTR_READER(rtt)
39 TCPI_ATTR_READER(rttvar)
40 TCPI_ATTR_READER(snd_ssthresh)
41 TCPI_ATTR_READER(snd_cwnd)
42 TCPI_ATTR_READER(advmss)
43 TCPI_ATTR_READER(reordering)
44 TCPI_ATTR_READER(rcv_rtt)
45 TCPI_ATTR_READER(rcv_space)
46 TCPI_ATTR_READER(total_retrans)
48 static VALUE alloc(VALUE klass)
50 struct tcp_info *info = xmalloc(sizeof(struct tcp_info));
52 /* Data_Make_Struct has an extra memset 0 which is so wasteful */
53 return Data_Wrap_Struct(klass, NULL, -1, info);
57 * call-seq:
59 * Raindrops::TCP_Info.new(tcp_socket) -> TCP_Info object
61 * Reads a TCP_Info object from any given +tcp_socket+. See the tcp(7)
62 * manpage and /usr/include/linux/tcp.h for more details.
64 static VALUE init(VALUE self, VALUE io)
66 int fd = my_fileno(io);
67 struct tcp_info *info = DATA_PTR(self);
68 socklen_t len = (socklen_t)sizeof(struct tcp_info);
69 int rc = getsockopt(fd, IPPROTO_TCP, TCP_INFO, info, &len);
71 if (rc != 0)
72 rb_sys_fail("getsockopt");
74 return self;
77 void Init_raindrops_linux_tcp_info(void)
79 VALUE cRaindrops = rb_const_get(rb_cObject, rb_intern("Raindrops"));
80 VALUE cTCP_Info;
83 * Document-class: Raindrops::TCP_Info
85 * This is used to wrap "struct tcp_info" as described in tcp(7)
86 * and /usr/include/linux/tcp.h. The following readers methods
87 * are defined corresponding to the "tcpi_" fields in the
88 * tcp_info struct.
90 * In particular, the +last_data_recv+ field is useful for measuring
91 * the amount of time a client spent in the listen queue before
92 * +accept()+, but only if +TCP_DEFER_ACCEPT+ is used with the
93 * listen socket (it is on by default in Unicorn).
95 * - state
96 * - ca_state
97 * - retransmits
98 * - probes
99 * - backoff
100 * - options
101 * - snd_wscale
102 * - rcv_wscale
103 * - rto
104 * - ato
105 * - snd_mss
106 * - rcv_mss
107 * - unacked
108 * - sacked
109 * - lost
110 * - retrans
111 * - fackets
112 * - last_data_sent
113 * - last_ack_sent
114 * - last_data_recv
115 * - last_ack_recv
116 * - pmtu
117 * - rcv_ssthresh
118 * - rtt
119 * - rttvar
120 * - snd_ssthresh
121 * - snd_cwnd
122 * - advmss
123 * - reordering
124 * - rcv_rtt
125 * - rcv_space
126 * - total_retrans
128 * http://kernel.org/doc/man-pages/online/pages/man7/tcp.7.html
130 cTCP_Info = rb_define_class_under(cRaindrops, "TCP_Info", rb_cObject);
131 rb_define_alloc_func(cTCP_Info, alloc);
132 rb_define_private_method(cTCP_Info, "initialize", init, 1);
134 #define TCPI_DEFINE_METHOD(x) \
135 rb_define_method(cTCP_Info, #x, tcp_info_##x, 0)
137 TCPI_DEFINE_METHOD(state);
138 TCPI_DEFINE_METHOD(ca_state);
139 TCPI_DEFINE_METHOD(retransmits);
140 TCPI_DEFINE_METHOD(probes);
141 TCPI_DEFINE_METHOD(backoff);
142 TCPI_DEFINE_METHOD(options);
143 TCPI_DEFINE_METHOD(snd_wscale);
144 TCPI_DEFINE_METHOD(rcv_wscale);
145 TCPI_DEFINE_METHOD(rto);
146 TCPI_DEFINE_METHOD(ato);
147 TCPI_DEFINE_METHOD(snd_mss);
148 TCPI_DEFINE_METHOD(rcv_mss);
149 TCPI_DEFINE_METHOD(unacked);
150 TCPI_DEFINE_METHOD(sacked);
151 TCPI_DEFINE_METHOD(lost);
152 TCPI_DEFINE_METHOD(retrans);
153 TCPI_DEFINE_METHOD(fackets);
154 TCPI_DEFINE_METHOD(last_data_sent);
155 TCPI_DEFINE_METHOD(last_ack_sent);
156 TCPI_DEFINE_METHOD(last_data_recv);
157 TCPI_DEFINE_METHOD(last_ack_recv);
158 TCPI_DEFINE_METHOD(pmtu);
159 TCPI_DEFINE_METHOD(rcv_ssthresh);
160 TCPI_DEFINE_METHOD(rtt);
161 TCPI_DEFINE_METHOD(rttvar);
162 TCPI_DEFINE_METHOD(snd_ssthresh);
163 TCPI_DEFINE_METHOD(snd_cwnd);
164 TCPI_DEFINE_METHOD(advmss);
165 TCPI_DEFINE_METHOD(reordering);
166 TCPI_DEFINE_METHOD(rcv_rtt);
167 TCPI_DEFINE_METHOD(rcv_space);
168 TCPI_DEFINE_METHOD(total_retrans);
170 #endif /* TCP_INFO */