]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd-network/dhcp6-network.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright © 2014 Intel Corporation. All rights reserved.
7 #include <netinet/in.h>
8 #include <netinet/ip6.h>
11 #include <sys/types.h>
13 #include <linux/if_packet.h>
15 #include "dhcp6-internal.h"
16 #include "dhcp6-protocol.h"
18 #include "socket-util.h"
20 int dhcp6_network_bind_udp_socket(int ifindex
, struct in6_addr
*local_address
) {
21 union sockaddr_union src
= {
22 .in6
.sin6_family
= AF_INET6
,
23 .in6
.sin6_port
= htobe16(DHCP6_PORT_CLIENT
),
24 .in6
.sin6_scope_id
= ifindex
,
26 _cleanup_close_
int s
= -1;
30 assert(local_address
);
32 src
.in6
.sin6_addr
= *local_address
;
34 s
= socket(AF_INET6
, SOCK_DGRAM
| SOCK_CLOEXEC
| SOCK_NONBLOCK
, IPPROTO_UDP
);
38 r
= setsockopt_int(s
, IPPROTO_IPV6
, IPV6_V6ONLY
, true);
42 r
= setsockopt_int(s
, IPPROTO_IPV6
, IPV6_MULTICAST_LOOP
, false);
46 r
= setsockopt_int(s
, SOL_SOCKET
, SO_REUSEADDR
, true);
50 r
= bind(s
, &src
.sa
, sizeof(src
.in6
));
57 int dhcp6_network_send_udp_socket(int s
, struct in6_addr
*server_address
,
58 const void *packet
, size_t len
) {
59 union sockaddr_union dest
= {
60 .in6
.sin6_family
= AF_INET6
,
61 .in6
.sin6_port
= htobe16(DHCP6_PORT_SERVER
),
65 assert(server_address
);
67 memcpy(&dest
.in6
.sin6_addr
, server_address
, sizeof(dest
.in6
.sin6_addr
));
69 r
= sendto(s
, packet
, len
, 0, &dest
.sa
, sizeof(dest
.in6
));