]>
Commit | Line | Data |
---|---|---|
1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ | |
2 | /*** | |
3 | Copyright © 2014 Intel Corporation. All rights reserved. | |
4 | ***/ | |
5 | ||
6 | #include <netinet/in.h> | |
7 | #include <stdio.h> | |
8 | #include <string.h> | |
9 | ||
10 | #include "dhcp6-internal.h" | |
11 | #include "dhcp6-protocol.h" | |
12 | #include "fd-util.h" | |
13 | #include "socket-util.h" | |
14 | ||
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, | |
21 | }; | |
22 | _cleanup_close_ int s = -EBADF; | |
23 | int r; | |
24 | ||
25 | assert(ifindex > 0); | |
26 | ||
27 | s = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, IPPROTO_UDP); | |
28 | if (s < 0) | |
29 | return -errno; | |
30 | ||
31 | r = setsockopt_int(s, IPPROTO_IPV6, IPV6_V6ONLY, true); | |
32 | if (r < 0) | |
33 | return r; | |
34 | ||
35 | r = setsockopt_int(s, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, false); | |
36 | if (r < 0) | |
37 | return r; | |
38 | ||
39 | r = setsockopt_int(s, SOL_SOCKET, SO_REUSEADDR, true); | |
40 | if (r < 0) | |
41 | return r; | |
42 | ||
43 | r = setsockopt_int(s, SOL_SOCKET, SO_TIMESTAMP, true); | |
44 | if (r < 0) | |
45 | return r; | |
46 | ||
47 | r = bind(s, &src.sa, sizeof(src.in6)); | |
48 | if (r < 0) | |
49 | return -errno; | |
50 | ||
51 | return TAKE_FD(s); | |
52 | } | |
53 | ||
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), | |
59 | }; | |
60 | ||
61 | if (sendto(s, packet, len, 0, &dest.sa, sizeof(dest.in6)) < 0) | |
62 | return -errno; | |
63 | ||
64 | return 0; | |
65 | } |