]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd-network/dhcp-network.c
2 This file is part of systemd.
4 Copyright (C) 2013 Intel Corporation. All rights reserved.
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21 #include <sys/types.h>
22 #include <sys/socket.h>
24 #include <linux/if_packet.h>
25 #include <net/ethernet.h>
29 #include "socket-util.h"
31 #include "dhcp-internal.h"
33 int dhcp_network_bind_raw_socket(int index
, union sockaddr_union
*link
)
40 s
= socket(AF_PACKET
, SOCK_DGRAM
| SOCK_CLOEXEC
| SOCK_NONBLOCK
,
45 link
->ll
.sll_family
= AF_PACKET
;
46 link
->ll
.sll_protocol
= htons(ETH_P_IP
);
47 link
->ll
.sll_ifindex
= index
;
48 link
->ll
.sll_halen
= ETH_ALEN
;
49 memset(link
->ll
.sll_addr
, 0xff, ETH_ALEN
);
51 if (setsockopt (s
, SOL_PACKET
, PACKET_AUXDATA
, &one
, sizeof(one
)) < 0)
54 if (bind(s
, &link
->sa
, sizeof(link
->ll
)) < 0) {
62 int dhcp_network_bind_udp_socket(int index
, be32_t address
, uint16_t port
)
65 union sockaddr_union src
= {
66 .in
.sin_family
= AF_INET
,
67 .in
.sin_port
= htobe16(port
),
68 .in
.sin_addr
.s_addr
= address
,
71 s
= socket(AF_INET
, SOCK_DGRAM
| SOCK_CLOEXEC
| SOCK_NONBLOCK
, 0);
75 if (bind(s
, &src
.sa
, sizeof(src
.in
)) < 0) {
83 int dhcp_network_send_raw_socket(int s
, const union sockaddr_union
*link
,
84 const void *packet
, size_t len
)
90 if (sendto(s
, packet
, len
, 0, &link
->sa
, sizeof(link
->ll
)) < 0)
96 int dhcp_network_send_udp_socket(int s
, be32_t address
, uint16_t port
,
97 const void *packet
, size_t len
)
99 union sockaddr_union dest
= {
100 .in
.sin_family
= AF_INET
,
101 .in
.sin_port
= htobe16(port
),
102 .in
.sin_addr
.s_addr
= address
,
105 if (sendto(s
, packet
, len
, 0, &dest
.sa
, sizeof(dest
.in
)) < 0)