]>
git.proxmox.com Git - mirror_frr.git/blob - nhrpd/linux.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* NHRP daemon Linux specific glue
3 * Copyright (c) 2014-2015 Timo Teräs
9 #include <linux/if_packet.h>
11 #include "nhrp_protocol.h"
15 size_t strlcpy(char *__restrict dest
,
16 const char *__restrict src
, size_t destsize
);
19 static int nhrp_socket_fd
= -1;
23 if (nhrp_socket_fd
< 0)
25 socket(PF_PACKET
, SOCK_DGRAM
, htons(ETH_P_NHRP
));
26 return nhrp_socket_fd
;
29 int os_sendmsg(const uint8_t *buf
, size_t len
, int ifindex
, const uint8_t *addr
,
30 size_t addrlen
, uint16_t protocol
)
32 struct sockaddr_ll lladdr
;
34 .iov_base
= (void *)buf
, .iov_len
= len
,
38 .msg_namelen
= sizeof(lladdr
),
44 if (addrlen
> sizeof(lladdr
.sll_addr
))
47 memset(&lladdr
, 0, sizeof(lladdr
));
48 lladdr
.sll_family
= AF_PACKET
;
49 lladdr
.sll_protocol
= htons(protocol
);
50 lladdr
.sll_ifindex
= ifindex
;
51 lladdr
.sll_halen
= addrlen
;
52 memcpy(lladdr
.sll_addr
, addr
, addrlen
);
58 status
= sendmsg(fd
, &msg
, 0);
65 int os_recvmsg(uint8_t *buf
, size_t *len
, int *ifindex
, uint8_t *addr
,
68 struct sockaddr_ll lladdr
;
70 .iov_base
= buf
, .iov_len
= *len
,
74 .msg_namelen
= sizeof(lladdr
),
80 r
= recvmsg(nhrp_socket_fd
, &msg
, MSG_DONTWAIT
);
85 *ifindex
= lladdr
.sll_ifindex
;
87 if (*addrlen
<= (size_t)lladdr
.sll_addr
) {
88 if (memcmp(lladdr
.sll_addr
, "\x00\x00\x00\x00", 4) != 0) {
89 memcpy(addr
, lladdr
.sll_addr
, lladdr
.sll_halen
);
90 *addrlen
= lladdr
.sll_halen
;
99 static int linux_configure_arp(const char *iface
, int on
)
103 strlcpy(ifr
.ifr_name
, iface
, IFNAMSIZ
);
104 if (ioctl(nhrp_socket_fd
, SIOCGIFFLAGS
, &ifr
))
108 ifr
.ifr_flags
&= ~IFF_NOARP
;
110 ifr
.ifr_flags
|= IFF_NOARP
;
112 if (ioctl(nhrp_socket_fd
, SIOCSIFFLAGS
, &ifr
))
118 static int linux_icmp_redirect_off(const char *iface
)
120 char fname
[PATH_MAX
];
123 snprintf(fname
, sizeof(fname
),
124 "/proc/sys/net/ipv4/conf/%s/send_redirects", iface
);
125 fd
= open(fname
, O_WRONLY
);
128 if (write(fd
, "0\n", 2) == 2)
135 int os_configure_dmvpn(unsigned int ifindex
, const char *ifname
, int af
)
141 ret
|= linux_icmp_redirect_off("all");
142 ret
|= linux_icmp_redirect_off(ifname
);
145 ret
|= linux_configure_arp(ifname
, 1);