author | Mike Sullivan <Mike.Sullivan@Oracle.COM> |
Thu, 13 Oct 2016 17:44:49 -0700 | |
changeset 7105 | 60994030253b |
parent 6093 | 89cd363fa5c9 |
permissions | -rw-r--r-- |
6093
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
1 |
This patch adds a method to manage the resource limit which was |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
2 |
introduced by the fix for ISC-Bugs #41845. This patch was developed |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
3 |
in-house. ISC did not express any interest in incorporating this patch |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
4 |
into their code since they consider the limit to be a mitigating |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
5 |
solution. |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
6 |
|
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
7 |
--- old/includes/omapip/omapip.h Tue May 24 17:01:08 2016 |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
8 |
+++ new/includes/omapip/omapip.h Tue May 24 17:01:08 2016 |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
9 |
@@ -468,6 +468,9 @@ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
10 |
|
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
11 |
extern omapi_object_type_t *omapi_object_types; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
12 |
|
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
13 |
+#if defined (sun) |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
14 |
+void omapi_set_max_fd_value (void); |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
15 |
+#endif |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
16 |
void omapi_type_relinquish (void); |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
17 |
isc_result_t omapi_init (void); |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
18 |
isc_result_t omapi_object_type_register (omapi_object_type_t **, |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
19 |
--- old/omapip/listener.c Tue May 24 17:01:08 2016 |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
20 |
+++ new/omapip/listener.c Tue May 24 17:01:08 2016 |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
21 |
@@ -41,6 +41,10 @@ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
22 |
trace_type_t *trace_listener_accept; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
23 |
#endif |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
24 |
|
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
25 |
+#if defined (sun) |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
26 |
+static int conn_limit = MAX_FD_VALUE; /* max number of open sockets allowed */ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
27 |
+#endif |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
28 |
+ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
29 |
OMAPI_OBJECT_ALLOC (omapi_listener, |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
30 |
omapi_listener_object_t, omapi_type_listener) |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
31 |
|
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
32 |
@@ -210,6 +214,35 @@ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
33 |
return l -> socket; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
34 |
} |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
35 |
|
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
36 |
+#if defined (sun) |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
37 |
+/* If OMAPI_CONN_LIMIT environment variable is set, obtain value. */ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
38 |
+const char *fname = "omapi_set_max_fd_value"; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
39 |
+void omapi_set_max_fd_value (void) |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
40 |
+{ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
41 |
+ const char *env; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
42 |
+ char *end = NULL; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
43 |
+ int envval = conn_limit; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
44 |
+ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
45 |
+ env = getenv("OMAPI_CONN_LIMIT"); |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
46 |
+ if (env != NULL) { |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
47 |
+ errno = 0; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
48 |
+ envval = (int)strtol(env, &end, 10); |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
49 |
+ if (errno != 0 || env == end || *end != '\0' || envval < 0) { |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
50 |
+ (void) log_error("%s: \"%s\" is not a valid connection " |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
51 |
+ "limit value\n", fname, env); |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
52 |
+ errno = 0; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
53 |
+ } else { |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
54 |
+ conn_limit = envval; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
55 |
+ } |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
56 |
+ } |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
57 |
+ (void) log_debug("%s: conn_limit = %d%s\n", fname, conn_limit, |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
58 |
+ (conn_limit == MAX_FD_VALUE) ? " (default)" : |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
59 |
+ (conn_limit == 0) ? " (unlimited)" : ""); |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
60 |
+ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
61 |
+ return; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
62 |
+} |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
63 |
+#endif |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
64 |
+ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
65 |
/* Reader callback for a listener object. Accept an incoming connection. */ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
66 |
isc_result_t omapi_accept (omapi_object_t *h) |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
67 |
{ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
68 |
@@ -234,7 +267,13 @@ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
69 |
return ISC_R_UNEXPECTED; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
70 |
} |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
71 |
|
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
72 |
+#if !defined (sun) |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
73 |
if ((MAX_FD_VALUE != 0) && (socket > MAX_FD_VALUE)) { |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
74 |
+#else |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
75 |
+ if ((conn_limit != 0) && (socket > conn_limit)) { |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
76 |
+ (void) log_debug("omapi_accept: No more available " |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
77 |
+ "sockets - closing latest.\n"); |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
78 |
+#endif |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
79 |
close(socket); |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
80 |
return (ISC_R_NORESOURCES); |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
81 |
} |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
82 |
--- old/server/dhcpd.c Tue May 24 17:01:08 2016 |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
83 |
+++ new/server/dhcpd.c Tue May 24 17:01:08 2016 |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
84 |
@@ -363,6 +363,10 @@ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
85 |
path_dhcpd_conf = s; |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
86 |
} |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
87 |
|
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
88 |
+#if defined (sun) |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
89 |
+ omapi_set_max_fd_value (); |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
90 |
+#endif |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
91 |
+ |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
92 |
#ifdef DHCPv6 |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
93 |
if (local_family == AF_INET6) { |
89cd363fa5c9
22879627 problem in SERVICE/DHCP-SERVER
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff
changeset
|
94 |
/* DHCPv6: override DHCPv4 lease and pid filenames */ |