浏览代码

[syslog] Add support for IPv6 syslog server

Note that IANA has not yet assigned a DHCPv6 option code for the
syslog server.  When a code is assigned, the definition of
DHCPV6_LOG_SERVERS should be updated.  Until then, an IPv6 address of
a syslog server can be configured manually using e.g.

  set syslog6 3ffe:302:11:2::8309

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 10 年前
父节点
当前提交
44a0dc7848
共有 3 个文件被更改,包括 42 次插入17 次删除
  1. 7
    0
      src/include/ipxe/dhcpv6.h
  2. 0
    1
      src/net/tcp/syslogs.c
  3. 35
    16
      src/net/udp/syslog.c

+ 7
- 0
src/include/ipxe/dhcpv6.h 查看文件

152
 /** DHCPv6 domain search list option */
152
 /** DHCPv6 domain search list option */
153
 #define DHCPV6_DOMAIN_LIST 24
153
 #define DHCPV6_DOMAIN_LIST 24
154
 
154
 
155
+/** DHCPv6 syslog server option
156
+ *
157
+ * This option code has not yet been assigned by IANA.  Please update
158
+ * this definition once an option code has been assigned.
159
+ */
160
+#define DHCPV6_LOG_SERVERS 0xffffffffUL
161
+
155
 /**
162
 /**
156
  * Any DHCPv6 option
163
  * Any DHCPv6 option
157
  *
164
  *

+ 0
- 1
src/net/tcp/syslogs.c 查看文件

49
 
49
 
50
 /** The encrypted syslog server */
50
 /** The encrypted syslog server */
51
 static struct sockaddr_tcpip logserver = {
51
 static struct sockaddr_tcpip logserver = {
52
-	.st_family = AF_INET,
53
 	.st_port = htons ( SYSLOG_PORT ),
52
 	.st_port = htons ( SYSLOG_PORT ),
54
 };
53
 };
55
 
54
 

+ 35
- 16
src/net/udp/syslog.c 查看文件

32
 #include <ipxe/open.h>
32
 #include <ipxe/open.h>
33
 #include <ipxe/tcpip.h>
33
 #include <ipxe/tcpip.h>
34
 #include <ipxe/dhcp.h>
34
 #include <ipxe/dhcp.h>
35
+#include <ipxe/dhcpv6.h>
35
 #include <ipxe/settings.h>
36
 #include <ipxe/settings.h>
36
 #include <ipxe/console.h>
37
 #include <ipxe/console.h>
37
 #include <ipxe/lineconsole.h>
38
 #include <ipxe/lineconsole.h>
45
 #endif
46
 #endif
46
 
47
 
47
 /** The syslog server */
48
 /** The syslog server */
48
-static struct sockaddr_tcpip logserver = {
49
-	.st_family = AF_INET,
50
-	.st_port = htons ( SYSLOG_PORT ),
49
+static union {
50
+	struct sockaddr sa;
51
+	struct sockaddr_tcpip st;
52
+	struct sockaddr_in sin;
53
+	struct sockaddr_in6 sin6;
54
+} logserver = {
55
+	.st = {
56
+		.st_port = htons ( SYSLOG_PORT ),
57
+	},
51
 };
58
 };
52
 
59
 
53
 /** Syslog UDP interface operations */
60
 /** Syslog UDP interface operations */
187
  ******************************************************************************
194
  ******************************************************************************
188
  */
195
  */
189
 
196
 
190
-/** Syslog server setting */
197
+/** IPv4 syslog server setting */
191
 const struct setting syslog_setting __setting ( SETTING_MISC ) = {
198
 const struct setting syslog_setting __setting ( SETTING_MISC ) = {
192
 	.name = "syslog",
199
 	.name = "syslog",
193
 	.description = "Syslog server",
200
 	.description = "Syslog server",
195
 	.type = &setting_type_ipv4,
202
 	.type = &setting_type_ipv4,
196
 };
203
 };
197
 
204
 
205
+/** IPv6 syslog server setting */
206
+const struct setting syslog6_setting __setting ( SETTING_MISC ) = {
207
+	.name = "syslog6",
208
+	.description = "Syslog server",
209
+	.tag = DHCPV6_LOG_SERVERS,
210
+	.type = &setting_type_ipv6,
211
+	.scope = &ipv6_scope,
212
+};
213
+
198
 /**
214
 /**
199
  * Apply syslog settings
215
  * Apply syslog settings
200
  *
216
  *
201
  * @ret rc		Return status code
217
  * @ret rc		Return status code
202
  */
218
  */
203
 static int apply_syslog_settings ( void ) {
219
 static int apply_syslog_settings ( void ) {
204
-	struct sockaddr_in *sin_logserver =
205
-		( struct sockaddr_in * ) &logserver;
206
-	struct in_addr old_addr;
207
-	int len;
220
+	struct sockaddr old_logserver;
208
 	int rc;
221
 	int rc;
209
 
222
 
210
 	/* Fetch hostname and domain name */
223
 	/* Fetch hostname and domain name */
215
 
228
 
216
 	/* Fetch log server */
229
 	/* Fetch log server */
217
 	syslog_console.disabled = CONSOLE_DISABLED;
230
 	syslog_console.disabled = CONSOLE_DISABLED;
218
-	old_addr.s_addr = sin_logserver->sin_addr.s_addr;
219
-	if ( ( len = fetch_ipv4_setting ( NULL, &syslog_setting,
220
-					  &sin_logserver->sin_addr ) ) >= 0 ) {
231
+	memcpy ( &old_logserver, &logserver, sizeof ( old_logserver ) );
232
+	logserver.sa.sa_family = 0;
233
+	if ( fetch_ipv6_setting ( NULL, &syslog6_setting,
234
+				  &logserver.sin6.sin6_addr ) >= 0 ) {
235
+		logserver.sin6.sin6_family = AF_INET6;
236
+	} else if ( fetch_ipv4_setting ( NULL, &syslog_setting,
237
+					 &logserver.sin.sin_addr ) >= 0 ) {
238
+		logserver.sin.sin_family = AF_INET;
239
+	}
240
+	if ( logserver.sa.sa_family ) {
221
 		syslog_console.disabled = 0;
241
 		syslog_console.disabled = 0;
242
+		DBG ( "SYSLOG using log server %s\n",
243
+		      sock_ntoa ( &logserver.sa ) );
222
 	}
244
 	}
223
 
245
 
224
 	/* Do nothing unless log server has changed */
246
 	/* Do nothing unless log server has changed */
225
-	if ( sin_logserver->sin_addr.s_addr == old_addr.s_addr )
247
+	if ( memcmp ( &logserver, &old_logserver, sizeof ( logserver ) ) == 0 )
226
 		return 0;
248
 		return 0;
227
 
249
 
228
 	/* Reset syslog connection */
250
 	/* Reset syslog connection */
236
 
258
 
237
 	/* Connect to log server */
259
 	/* Connect to log server */
238
 	if ( ( rc = xfer_open_socket ( &syslogger, SOCK_DGRAM,
260
 	if ( ( rc = xfer_open_socket ( &syslogger, SOCK_DGRAM,
239
-				       ( ( struct sockaddr * ) &logserver ),
240
-				       NULL ) ) != 0 ) {
261
+				       &logserver.sa, NULL ) ) != 0 ) {
241
 		DBG ( "SYSLOG cannot connect to log server: %s\n",
262
 		DBG ( "SYSLOG cannot connect to log server: %s\n",
242
 		      strerror ( rc ) );
263
 		      strerror ( rc ) );
243
 		return rc;
264
 		return rc;
244
 	}
265
 	}
245
-	DBG ( "SYSLOG using log server %s\n",
246
-	      inet_ntoa ( sin_logserver->sin_addr ) );
247
 
266
 
248
 	return 0;
267
 	return 0;
249
 }
268
 }

正在加载...
取消
保存