ifvxlan.c (f53d97231b13165a114ec7f991bccc6567d50b57) ifvxlan.c (33e0d8f057cf6eda187f09c76ea968c19e176b74)
1/*-
2 * Copyright (c) 2014, Bryan Venteicher <bryanv@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 222 unchanged lines hidden (view full) ---

231 errx(1, "error in parsing local address string: %s",
232 gai_strerror(error));
233
234 sa = ai->ai_addr;
235
236 switch (ai->ai_family) {
237#ifdef INET
238 case AF_INET: {
1/*-
2 * Copyright (c) 2014, Bryan Venteicher <bryanv@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 222 unchanged lines hidden (view full) ---

231 errx(1, "error in parsing local address string: %s",
232 gai_strerror(error));
233
234 sa = ai->ai_addr;
235
236 switch (ai->ai_family) {
237#ifdef INET
238 case AF_INET: {
239 struct in_addr addr = ((struct sockaddr_in *) sa)->sin_addr;
239 struct sockaddr_in *sin = (struct sockaddr_in *)sa;
240
240
241 if (IN_MULTICAST(ntohl(addr.s_addr)))
241 if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr)))
242 errx(1, "local address cannot be multicast");
243
242 errx(1, "local address cannot be multicast");
243
244 cmd.vxlcmd_sa.in4.sin_family = AF_INET;
245 cmd.vxlcmd_sa.in4.sin_addr = addr;
244 cmd.vxlcmd_sa.in4 = *sin;
246 break;
247 }
248#endif
249#ifdef INET6
250 case AF_INET6: {
245 break;
246 }
247#endif
248#ifdef INET6
249 case AF_INET6: {
251 struct in6_addr *addr = &((struct sockaddr_in6 *)sa)->sin6_addr;
250 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
252
251
253 if (IN6_IS_ADDR_MULTICAST(addr))
252 if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
254 errx(1, "local address cannot be multicast");
255
253 errx(1, "local address cannot be multicast");
254
256 cmd.vxlcmd_sa.in6.sin6_family = AF_INET6;
257 cmd.vxlcmd_sa.in6.sin6_addr = *addr;
255 cmd.vxlcmd_sa.in6 = *sin6;
258 break;
259 }
260#endif
261 default:
262 errx(1, "local address %s not supported", addr);
263 }
264
265 freeaddrinfo(ai);
266
267 if (!vxlan_exists(s)) {
268 if (cmd.vxlcmd_sa.sa.sa_family == AF_INET) {
269 params.vxlp_with |= VXLAN_PARAM_WITH_LOCAL_ADDR4;
256 break;
257 }
258#endif
259 default:
260 errx(1, "local address %s not supported", addr);
261 }
262
263 freeaddrinfo(ai);
264
265 if (!vxlan_exists(s)) {
266 if (cmd.vxlcmd_sa.sa.sa_family == AF_INET) {
267 params.vxlp_with |= VXLAN_PARAM_WITH_LOCAL_ADDR4;
270 params.vxlp_local_in4 = cmd.vxlcmd_sa.in4.sin_addr;
268 params.vxlp_local_sa.in4 = cmd.vxlcmd_sa.in4;
271 } else {
272 params.vxlp_with |= VXLAN_PARAM_WITH_LOCAL_ADDR6;
269 } else {
270 params.vxlp_with |= VXLAN_PARAM_WITH_LOCAL_ADDR6;
273 params.vxlp_local_in6 = cmd.vxlcmd_sa.in6.sin6_addr;
271 params.vxlp_local_sa.in6 = cmd.vxlcmd_sa.in6;
274 }
275 return;
276 }
277
278 if (do_cmd(s, VXLAN_CMD_SET_LOCAL_ADDR, &cmd, sizeof(cmd), 1) < 0)
279 err(1, "VXLAN_CMD_SET_LOCAL_ADDR");
280}
281

--- 11 unchanged lines hidden (view full) ---

293 errx(1, "error in parsing remote address string: %s",
294 gai_strerror(error));
295
296 sa = ai->ai_addr;
297
298 switch (ai->ai_family) {
299#ifdef INET
300 case AF_INET: {
272 }
273 return;
274 }
275
276 if (do_cmd(s, VXLAN_CMD_SET_LOCAL_ADDR, &cmd, sizeof(cmd), 1) < 0)
277 err(1, "VXLAN_CMD_SET_LOCAL_ADDR");
278}
279

--- 11 unchanged lines hidden (view full) ---

291 errx(1, "error in parsing remote address string: %s",
292 gai_strerror(error));
293
294 sa = ai->ai_addr;
295
296 switch (ai->ai_family) {
297#ifdef INET
298 case AF_INET: {
301 struct in_addr addr = ((struct sockaddr_in *)sa)->sin_addr;
299 struct sockaddr_in *sin = (struct sockaddr_in *)sa;
302
300
303 if (IN_MULTICAST(ntohl(addr.s_addr)))
301 if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr)))
304 errx(1, "remote address cannot be multicast");
305
302 errx(1, "remote address cannot be multicast");
303
306 cmd.vxlcmd_sa.in4.sin_family = AF_INET;
307 cmd.vxlcmd_sa.in4.sin_addr = addr;
304 cmd.vxlcmd_sa.in4 = *sin;
308 break;
309 }
310#endif
311#ifdef INET6
312 case AF_INET6: {
305 break;
306 }
307#endif
308#ifdef INET6
309 case AF_INET6: {
313 struct in6_addr *addr = &((struct sockaddr_in6 *)sa)->sin6_addr;
310 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
314
311
315 if (IN6_IS_ADDR_MULTICAST(addr))
312 if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
316 errx(1, "remote address cannot be multicast");
317
313 errx(1, "remote address cannot be multicast");
314
318 cmd.vxlcmd_sa.in6.sin6_family = AF_INET6;
319 cmd.vxlcmd_sa.in6.sin6_addr = *addr;
315 cmd.vxlcmd_sa.in6 = *sin6;
320 break;
321 }
322#endif
323 default:
324 errx(1, "remote address %s not supported", addr);
325 }
326
327 freeaddrinfo(ai);
328
329 if (!vxlan_exists(s)) {
330 if (cmd.vxlcmd_sa.sa.sa_family == AF_INET) {
331 params.vxlp_with |= VXLAN_PARAM_WITH_REMOTE_ADDR4;
316 break;
317 }
318#endif
319 default:
320 errx(1, "remote address %s not supported", addr);
321 }
322
323 freeaddrinfo(ai);
324
325 if (!vxlan_exists(s)) {
326 if (cmd.vxlcmd_sa.sa.sa_family == AF_INET) {
327 params.vxlp_with |= VXLAN_PARAM_WITH_REMOTE_ADDR4;
332 params.vxlp_remote_in4 = cmd.vxlcmd_sa.in4.sin_addr;
328 params.vxlp_remote_sa.in4 = cmd.vxlcmd_sa.in4;
333 } else {
334 params.vxlp_with |= VXLAN_PARAM_WITH_REMOTE_ADDR6;
329 } else {
330 params.vxlp_with |= VXLAN_PARAM_WITH_REMOTE_ADDR6;
335 params.vxlp_remote_in6 = cmd.vxlcmd_sa.in6.sin6_addr;
331 params.vxlp_remote_sa.in6 = cmd.vxlcmd_sa.in6;
336 }
337 return;
338 }
339
340 if (do_cmd(s, VXLAN_CMD_SET_REMOTE_ADDR, &cmd, sizeof(cmd), 1) < 0)
341 err(1, "VXLAN_CMD_SET_REMOTE_ADDR");
342}
343

--- 11 unchanged lines hidden (view full) ---

355 errx(1, "error in parsing group address string: %s",
356 gai_strerror(error));
357
358 sa = ai->ai_addr;
359
360 switch (ai->ai_family) {
361#ifdef INET
362 case AF_INET: {
332 }
333 return;
334 }
335
336 if (do_cmd(s, VXLAN_CMD_SET_REMOTE_ADDR, &cmd, sizeof(cmd), 1) < 0)
337 err(1, "VXLAN_CMD_SET_REMOTE_ADDR");
338}
339

--- 11 unchanged lines hidden (view full) ---

351 errx(1, "error in parsing group address string: %s",
352 gai_strerror(error));
353
354 sa = ai->ai_addr;
355
356 switch (ai->ai_family) {
357#ifdef INET
358 case AF_INET: {
363 struct in_addr addr = ((struct sockaddr_in *)sa)->sin_addr;
359 struct sockaddr_in *sin = (struct sockaddr_in *)sa;
364
360
365 if (!IN_MULTICAST(ntohl(addr.s_addr)))
361 if (!IN_MULTICAST(ntohl(sin->sin_addr.s_addr)))
366 errx(1, "group address must be multicast");
367
362 errx(1, "group address must be multicast");
363
368 cmd.vxlcmd_sa.in4.sin_family = AF_INET;
369 cmd.vxlcmd_sa.in4.sin_addr = addr;
364 cmd.vxlcmd_sa.in4 = *sin;
370 break;
371 }
372#endif
373#ifdef INET6
374 case AF_INET6: {
365 break;
366 }
367#endif
368#ifdef INET6
369 case AF_INET6: {
375 struct in6_addr *addr = &((struct sockaddr_in6 *)sa)->sin6_addr;
370 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
376
371
377 if (!IN6_IS_ADDR_MULTICAST(addr))
372 if (!IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
378 errx(1, "group address must be multicast");
379
373 errx(1, "group address must be multicast");
374
380 cmd.vxlcmd_sa.in6.sin6_family = AF_INET6;
381 cmd.vxlcmd_sa.in6.sin6_addr = *addr;
375 cmd.vxlcmd_sa.in6 = *sin6;
382 break;
383 }
384#endif
385 default:
386 errx(1, "group address %s not supported", addr);
387 }
388
389 freeaddrinfo(ai);
390
391 if (!vxlan_exists(s)) {
392 if (cmd.vxlcmd_sa.sa.sa_family == AF_INET) {
393 params.vxlp_with |= VXLAN_PARAM_WITH_REMOTE_ADDR4;
376 break;
377 }
378#endif
379 default:
380 errx(1, "group address %s not supported", addr);
381 }
382
383 freeaddrinfo(ai);
384
385 if (!vxlan_exists(s)) {
386 if (cmd.vxlcmd_sa.sa.sa_family == AF_INET) {
387 params.vxlp_with |= VXLAN_PARAM_WITH_REMOTE_ADDR4;
394 params.vxlp_remote_in4 = cmd.vxlcmd_sa.in4.sin_addr;
388 params.vxlp_remote_sa.in4 = cmd.vxlcmd_sa.in4;
395 } else {
396 params.vxlp_with |= VXLAN_PARAM_WITH_REMOTE_ADDR6;
389 } else {
390 params.vxlp_with |= VXLAN_PARAM_WITH_REMOTE_ADDR6;
397 params.vxlp_remote_in6 = cmd.vxlcmd_sa.in6.sin6_addr;
391 params.vxlp_remote_sa.in6 = cmd.vxlcmd_sa.in6;
398 }
399 return;
400 }
401
402 if (do_cmd(s, VXLAN_CMD_SET_REMOTE_ADDR, &cmd, sizeof(cmd), 1) < 0)
403 err(1, "VXLAN_CMD_SET_REMOTE_ADDR");
404}
405

--- 242 unchanged lines hidden ---
392 }
393 return;
394 }
395
396 if (do_cmd(s, VXLAN_CMD_SET_REMOTE_ADDR, &cmd, sizeof(cmd), 1) < 0)
397 err(1, "VXLAN_CMD_SET_REMOTE_ADDR");
398}
399

--- 242 unchanged lines hidden ---