18d36e1dfSRoy Marples /* SPDX-License-Identifier: BSD-2-Clause */ 27827cba2SAaron LI /* 37827cba2SAaron LI * dhcpcd - DHCP client daemon 4*80aa9461SRoy Marples * Copyright (c) 2006-2023 Roy Marples <roy@marples.name> 57827cba2SAaron LI * All rights reserved 67827cba2SAaron LI 77827cba2SAaron LI * Redistribution and use in source and binary forms, with or without 87827cba2SAaron LI * modification, are permitted provided that the following conditions 97827cba2SAaron LI * are met: 107827cba2SAaron LI * 1. Redistributions of source code must retain the above copyright 117827cba2SAaron LI * notice, this list of conditions and the following disclaimer. 127827cba2SAaron LI * 2. Redistributions in binary form must reproduce the above copyright 137827cba2SAaron LI * notice, this list of conditions and the following disclaimer in the 147827cba2SAaron LI * documentation and/or other materials provided with the distribution. 157827cba2SAaron LI * 167827cba2SAaron LI * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 177827cba2SAaron LI * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 187827cba2SAaron LI * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 197827cba2SAaron LI * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 207827cba2SAaron LI * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 217827cba2SAaron LI * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 227827cba2SAaron LI * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 237827cba2SAaron LI * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 247827cba2SAaron LI * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 257827cba2SAaron LI * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 267827cba2SAaron LI * SUCH DAMAGE. 277827cba2SAaron LI */ 287827cba2SAaron LI 297827cba2SAaron LI #ifndef ARP_H 307827cba2SAaron LI #define ARP_H 317827cba2SAaron LI 327827cba2SAaron LI /* ARP timings from RFC5227 */ 337827cba2SAaron LI #define PROBE_WAIT 1 347827cba2SAaron LI #define PROBE_NUM 3 357827cba2SAaron LI #define PROBE_MIN 1 367827cba2SAaron LI #define PROBE_MAX 2 377827cba2SAaron LI #define ANNOUNCE_WAIT 2 387827cba2SAaron LI #define ANNOUNCE_NUM 2 397827cba2SAaron LI #define ANNOUNCE_INTERVAL 2 407827cba2SAaron LI #define MAX_CONFLICTS 10 417827cba2SAaron LI #define RATE_LIMIT_INTERVAL 60 427827cba2SAaron LI #define DEFEND_INTERVAL 10 437827cba2SAaron LI 44d4fb1e02SRoy Marples #include "bpf.h" 457827cba2SAaron LI #include "dhcpcd.h" 467827cba2SAaron LI #include "if.h" 477827cba2SAaron LI 487827cba2SAaron LI #ifdef IN_IFF_DUPLICATED 497827cba2SAaron LI /* NetBSD gained RFC 5227 support in the kernel. 50d4fb1e02SRoy Marples * This means dhcpcd doesn't need ARP except for ARPing support 51d4fb1e02SRoy Marples * and ARP announcing an address. */ 527827cba2SAaron LI #if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 799003900 537827cba2SAaron LI #define KERNEL_RFC5227 547827cba2SAaron LI #endif 557827cba2SAaron LI #endif 567827cba2SAaron LI 577827cba2SAaron LI struct arp_msg { 587827cba2SAaron LI uint16_t op; 596e63cc1fSRoy Marples uint8_t sha[HWADDR_LEN]; 607827cba2SAaron LI struct in_addr sip; 616e63cc1fSRoy Marples uint8_t tha[HWADDR_LEN]; 627827cba2SAaron LI struct in_addr tip; 636e63cc1fSRoy Marples /* Frame header and sender to diagnose failures */ 646e63cc1fSRoy Marples uint8_t fsha[HWADDR_LEN]; 656e63cc1fSRoy Marples uint8_t ftha[HWADDR_LEN]; 667827cba2SAaron LI }; 677827cba2SAaron LI 687827cba2SAaron LI struct arp_state { 697827cba2SAaron LI TAILQ_ENTRY(arp_state) next; 707827cba2SAaron LI struct interface *iface; 71d4fb1e02SRoy Marples struct in_addr addr; 72d4fb1e02SRoy Marples struct bpf *bpf; 73d4fb1e02SRoy Marples 74d4fb1e02SRoy Marples int probes; 75d4fb1e02SRoy Marples int claims; 76d4fb1e02SRoy Marples struct timespec defend; 777827cba2SAaron LI 788d36e1dfSRoy Marples void (*found_cb)(struct arp_state *, const struct arp_msg *); 798d36e1dfSRoy Marples void (*not_found_cb)(struct arp_state *); 807827cba2SAaron LI void (*announced_cb)(struct arp_state *); 818d36e1dfSRoy Marples void (*defend_failed_cb)(struct arp_state *); 827827cba2SAaron LI void (*free_cb)(struct arp_state *); 837827cba2SAaron LI }; 847827cba2SAaron LI TAILQ_HEAD(arp_statehead, arp_state); 857827cba2SAaron LI 867827cba2SAaron LI struct iarp_state { 877827cba2SAaron LI struct arp_statehead arp_states; 887827cba2SAaron LI }; 897827cba2SAaron LI 907827cba2SAaron LI #define ARP_STATE(ifp) \ 917827cba2SAaron LI ((struct iarp_state *)(ifp)->if_data[IF_DATA_ARP]) 927827cba2SAaron LI #define ARP_CSTATE(ifp) \ 937827cba2SAaron LI ((const struct iarp_state *)(ifp)->if_data[IF_DATA_ARP]) 947827cba2SAaron LI 957827cba2SAaron LI #ifdef ARP 96d4fb1e02SRoy Marples void arp_packet(struct interface *, uint8_t *, size_t, unsigned int); 977827cba2SAaron LI struct arp_state *arp_new(struct interface *, const struct in_addr *); 988d36e1dfSRoy Marples void arp_probe(struct arp_state *); 99d4fb1e02SRoy Marples struct arp_state *arp_announceaddr(struct dhcpcd_ctx *, const struct in_addr *); 100d4fb1e02SRoy Marples struct arp_state *arp_ifannounceaddr(struct interface *, const struct in_addr *); 1016e63cc1fSRoy Marples struct arp_state * arp_find(struct interface *, const struct in_addr *); 1027827cba2SAaron LI void arp_free(struct arp_state *); 1038d36e1dfSRoy Marples void arp_freeaddr(struct interface *, const struct in_addr *); 1047827cba2SAaron LI void arp_drop(struct interface *); 1057827cba2SAaron LI #endif /* ARP */ 1067827cba2SAaron LI #endif /* ARP_H */ 107