@@ -66,57 +66,75 @@ static void fd_set_nonblock (int fd)
66
66
perror ("fcntl O_NONBLOCK" );
67
67
}
68
68
69
- static void sk_set (int fd , const char * name , const void * val , socklen_t len )
69
+ enum sk_opt {
70
+ sk_nodelay ,
71
+ sk_reuseaddr ,
72
+ sk_keepalive ,
73
+ sk_keepcnt ,
74
+ sk_keepidle ,
75
+ sk_keepintvl ,
76
+ sk_congestion ,
77
+ sk_defer_accept ,
78
+ };
79
+
80
+ static void sk_set (int fd , enum sk_opt opt , const void * val , socklen_t len )
70
81
{
71
- if (!name || ! val || len <=0 )
82
+ if (!val || len <=0 )
72
83
return ;
73
84
74
85
struct {
75
86
const char * name ;
87
+ const int present ;
76
88
const int level ;
77
89
const int option ;
78
- } ops [] = {
79
- { "TCP_NODELAY" , IPPROTO_TCP , TCP_NODELAY },
80
- { "SO_REUSEADDR" , SOL_SOCKET , SO_REUSEADDR },
81
- { "SO_KEEPALIVE" , SOL_SOCKET , SO_KEEPALIVE },
90
+ } opts [] = {
91
+ [sk_nodelay ] = { "TCP_NODELAY" , 1 , IPPROTO_TCP , TCP_NODELAY , },
92
+ [sk_reuseaddr ] = { "SO_REUSEADDR" , 1 , SOL_SOCKET , SO_REUSEADDR , },
93
+ [sk_keepalive ] = { "SO_KEEPALIVE" , 1 , SOL_SOCKET , SO_KEEPALIVE , },
94
+ [sk_keepcnt ] = { "TCP_KEEPCNT" ,
82
95
#ifdef TCP_KEEPCNT
83
- { "TCP_KEEPCNT" , IPPROTO_TCP , TCP_KEEPCNT } ,
96
+ 1 , IPPROTO_TCP , TCP_KEEPCNT ,
84
97
#endif
98
+ },
99
+ [sk_keepidle ] = { "TCP_KEEPIDLE" ,
85
100
#ifdef TCP_KEEPIDLE
86
- { "TCP_KEEPIDLE" , IPPROTO_TCP , TCP_KEEPIDLE } ,
101
+ 1 , IPPROTO_TCP , TCP_KEEPIDLE ,
87
102
#endif
103
+ },
104
+ [sk_keepintvl ] = { "TCP_KEEPINTVL" ,
88
105
#ifdef TCP_KEEPINTVL
89
- { "TCP_KEEPINTVL" , IPPROTO_TCP , TCP_KEEPINTVL } ,
106
+ 1 , IPPROTO_TCP , TCP_KEEPINTVL ,
90
107
#endif
108
+ },
109
+ [sk_congestion ] = { "TCP_CONGESTION" ,
91
110
#ifdef TCP_CONGESTION
92
- { "TCP_CONGESTION" , IPPROTO_TCP , TCP_CONGESTION } ,
111
+ 1 , IPPROTO_TCP , TCP_CONGESTION ,
93
112
#endif
113
+ },
114
+ [sk_defer_accept ] = { "TCP_DEFER_ACCEPT" ,
94
115
#ifdef TCP_DEFER_ACCEPT
95
- { "TCP_DEFER_ACCEPT" , IPPROTO_TCP , TCP_DEFER_ACCEPT } ,
116
+ 1 , IPPROTO_TCP , TCP_DEFER_ACCEPT ,
96
117
#endif
118
+ },
97
119
};
98
120
99
- for (int k = 0 ; k < COUNT (ops ); k ++ ) {
100
- if (str_cmp (ops [k ].name , name ))
101
- continue ;
102
-
103
- if (setsockopt (fd , ops [k ].level , ops [k ].option , val , len )== -1 )
104
- gt_log ("couldn't set socket option `%s'\n" , name );
105
-
121
+ if (!opts [opt ].present ) {
122
+ gt_na (opts [opt ].name );
106
123
return ;
107
124
}
108
125
109
- gt_na (name );
126
+ if (setsockopt (fd , opts [opt ].level , opts [opt ].option , val , len )== -1 )
127
+ gt_log ("couldn't set socket option `%s'\n" , opts [opt ].name );
110
128
}
111
129
112
- static void sk_set_int (int fd , const char * name , int val )
130
+ static void sk_set_int (int fd , enum sk_opt opt , int val )
113
131
{
114
- return sk_set (fd , name , & val , sizeof (val ));
132
+ return sk_set (fd , opt , & val , sizeof (val ));
115
133
}
116
134
117
135
static int sk_listen (int fd , struct addrinfo * ai )
118
136
{
119
- sk_set_int (fd , "SO_REUSEADDR" , 1 );
137
+ sk_set_int (fd , sk_reuseaddr , 1 );
120
138
121
139
int ret = bind (fd , ai -> ai_addr , ai -> ai_addrlen );
122
140
@@ -132,7 +150,7 @@ static int sk_listen (int fd, struct addrinfo *ai)
132
150
return -1 ;
133
151
}
134
152
135
- sk_set_int (fd , "TCP_DEFER_ACCEPT" , GT_TIMEOUT /1000 );
153
+ sk_set_int (fd , sk_defer_accept , GT_TIMEOUT /1000 );
136
154
137
155
return 0 ;
138
156
}
@@ -722,21 +740,21 @@ int main (int argc, char **argv)
722
740
723
741
fd_set_nonblock (sock .fd );
724
742
725
- sk_set_int (sock .fd , "TCP_NODELAY" , !delay );
726
- sk_set_int (sock .fd , "SO_KEEPALIVE" , keepalive );
743
+ sk_set_int (sock .fd , sk_nodelay , !delay );
744
+ sk_set_int (sock .fd , sk_keepalive , keepalive );
727
745
728
746
if (keepalive ) {
729
747
if (ka_count >=0 && ka_count <=INT_MAX )
730
- sk_set_int (sock .fd , "TCP_KEEPCNT" , ka_count );
748
+ sk_set_int (sock .fd , sk_keepcnt , ka_count );
731
749
732
750
if (ka_idle >=0 && ka_idle <=INT_MAX )
733
- sk_set_int (sock .fd , "TCP_KEEPIDLE" , ka_idle );
751
+ sk_set_int (sock .fd , sk_keepidle , ka_idle );
734
752
735
753
if (ka_interval >=0 && ka_interval <=INT_MAX )
736
- sk_set_int (sock .fd , "TCP_KEEPINTVL" , ka_interval );
754
+ sk_set_int (sock .fd , sk_keepintvl , ka_interval );
737
755
}
738
756
739
- sk_set (sock .fd , "TCP_CONGESTION" , congestion , str_len (congestion ));
757
+ sk_set (sock .fd , sk_congestion , congestion , str_len (congestion ));
740
758
741
759
switch (gt_setup_crypto (& ctx , sock .fd , listener )) {
742
760
case -2 : gt_log ("%s: key exchange could not be verified!\n" , sockname );
0 commit comments