]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd-network/dhcp6-network.c
b794d8858cb43c4f25d13506ccb5697995b15c62
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 Copyright © 2014 Intel Corporation. All rights reserved.
6 #include <netinet/in.h>
10 #include "dhcp6-internal.h"
11 #include "dhcp6-protocol.h"
13 #include "socket-util.h"
15 int dhcp6_network_bind_udp_socket(int ifindex
, const struct in6_addr
*local_address
) {
16 union sockaddr_union src
= {
17 .in6
.sin6_family
= AF_INET6
,
18 .in6
.sin6_addr
= *ASSERT_PTR(local_address
),
19 .in6
.sin6_port
= htobe16(DHCP6_PORT_CLIENT
),
20 .in6
.sin6_scope_id
= ifindex
,
22 _cleanup_close_
int s
= -EBADF
;
27 s
= socket(AF_INET6
, SOCK_DGRAM
| SOCK_CLOEXEC
| SOCK_NONBLOCK
, IPPROTO_UDP
);
31 r
= setsockopt_int(s
, IPPROTO_IPV6
, IPV6_V6ONLY
, true);
35 r
= setsockopt_int(s
, IPPROTO_IPV6
, IPV6_MULTICAST_LOOP
, false);
39 r
= setsockopt_int(s
, SOL_SOCKET
, SO_REUSEADDR
, true);
43 r
= setsockopt_int(s
, SOL_SOCKET
, SO_TIMESTAMP
, true);
47 r
= bind(s
, &src
.sa
, sizeof(src
.in6
));
54 int dhcp6_network_send_udp_socket(int s
, const struct in6_addr
*server_address
, const void *packet
, size_t len
) {
55 union sockaddr_union dest
= {
56 .in6
.sin6_family
= AF_INET6
,
57 .in6
.sin6_addr
= *ASSERT_PTR(server_address
),
58 .in6
.sin6_port
= htobe16(DHCP6_PORT_SERVER
),
61 if (sendto(s
, packet
, len
, 0, &dest
.sa
, sizeof(dest
.in6
)) < 0)