1*9f20bfa6SDavid van Moolenbroek /* $NetBSD: arp.h,v 1.11 2015/07/09 10:15:34 roy Exp $ */ 2*9f20bfa6SDavid van Moolenbroek 3*9f20bfa6SDavid van Moolenbroek /* 4*9f20bfa6SDavid van Moolenbroek * dhcpcd - DHCP client daemon 5*9f20bfa6SDavid van Moolenbroek * Copyright (c) 2006-2015 Roy Marples <roy@marples.name> 6*9f20bfa6SDavid van Moolenbroek * All rights reserved 7*9f20bfa6SDavid van Moolenbroek 8*9f20bfa6SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without 9*9f20bfa6SDavid van Moolenbroek * modification, are permitted provided that the following conditions 10*9f20bfa6SDavid van Moolenbroek * are met: 11*9f20bfa6SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright 12*9f20bfa6SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer. 13*9f20bfa6SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright 14*9f20bfa6SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the 15*9f20bfa6SDavid van Moolenbroek * documentation and/or other materials provided with the distribution. 16*9f20bfa6SDavid van Moolenbroek * 17*9f20bfa6SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*9f20bfa6SDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*9f20bfa6SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*9f20bfa6SDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*9f20bfa6SDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*9f20bfa6SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*9f20bfa6SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*9f20bfa6SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*9f20bfa6SDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*9f20bfa6SDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*9f20bfa6SDavid van Moolenbroek * SUCH DAMAGE. 28*9f20bfa6SDavid van Moolenbroek */ 29*9f20bfa6SDavid van Moolenbroek 30*9f20bfa6SDavid van Moolenbroek #ifndef ARP_H 31*9f20bfa6SDavid van Moolenbroek #define ARP_H 32*9f20bfa6SDavid van Moolenbroek 33*9f20bfa6SDavid van Moolenbroek /* ARP timings from RFC5227 */ 34*9f20bfa6SDavid van Moolenbroek #define PROBE_WAIT 1 35*9f20bfa6SDavid van Moolenbroek #define PROBE_NUM 3 36*9f20bfa6SDavid van Moolenbroek #define PROBE_MIN 1 37*9f20bfa6SDavid van Moolenbroek #define PROBE_MAX 2 38*9f20bfa6SDavid van Moolenbroek #define ANNOUNCE_WAIT 2 39*9f20bfa6SDavid van Moolenbroek #define ANNOUNCE_NUM 2 40*9f20bfa6SDavid van Moolenbroek #define ANNOUNCE_INTERVAL 2 41*9f20bfa6SDavid van Moolenbroek #define MAX_CONFLICTS 10 42*9f20bfa6SDavid van Moolenbroek #define RATE_LIMIT_INTERVAL 60 43*9f20bfa6SDavid van Moolenbroek #define DEFEND_INTERVAL 10 44*9f20bfa6SDavid van Moolenbroek 45*9f20bfa6SDavid van Moolenbroek #include "dhcpcd.h" 46*9f20bfa6SDavid van Moolenbroek 47*9f20bfa6SDavid van Moolenbroek struct arp_msg { 48*9f20bfa6SDavid van Moolenbroek uint16_t op; 49*9f20bfa6SDavid van Moolenbroek unsigned char sha[HWADDR_LEN]; 50*9f20bfa6SDavid van Moolenbroek struct in_addr sip; 51*9f20bfa6SDavid van Moolenbroek unsigned char tha[HWADDR_LEN]; 52*9f20bfa6SDavid van Moolenbroek struct in_addr tip; 53*9f20bfa6SDavid van Moolenbroek }; 54*9f20bfa6SDavid van Moolenbroek 55*9f20bfa6SDavid van Moolenbroek struct arp_state { 56*9f20bfa6SDavid van Moolenbroek TAILQ_ENTRY(arp_state) next; 57*9f20bfa6SDavid van Moolenbroek struct interface *iface; 58*9f20bfa6SDavid van Moolenbroek 59*9f20bfa6SDavid van Moolenbroek void (*probed_cb)(struct arp_state *); 60*9f20bfa6SDavid van Moolenbroek void (*announced_cb)(struct arp_state *); 61*9f20bfa6SDavid van Moolenbroek void (*conflicted_cb)(struct arp_state *, const struct arp_msg *); 62*9f20bfa6SDavid van Moolenbroek void (*free_cb)(struct arp_state *); 63*9f20bfa6SDavid van Moolenbroek 64*9f20bfa6SDavid van Moolenbroek struct in_addr addr; 65*9f20bfa6SDavid van Moolenbroek int probes; 66*9f20bfa6SDavid van Moolenbroek int claims; 67*9f20bfa6SDavid van Moolenbroek struct in_addr failed; 68*9f20bfa6SDavid van Moolenbroek }; 69*9f20bfa6SDavid van Moolenbroek TAILQ_HEAD(arp_statehead, arp_state); 70*9f20bfa6SDavid van Moolenbroek 71*9f20bfa6SDavid van Moolenbroek struct iarp_state { 72*9f20bfa6SDavid van Moolenbroek int fd; 73*9f20bfa6SDavid van Moolenbroek struct arp_statehead arp_states; 74*9f20bfa6SDavid van Moolenbroek }; 75*9f20bfa6SDavid van Moolenbroek 76*9f20bfa6SDavid van Moolenbroek #define ARP_STATE(ifp) \ 77*9f20bfa6SDavid van Moolenbroek ((struct iarp_state *)(ifp)->if_data[IF_DATA_ARP]) 78*9f20bfa6SDavid van Moolenbroek #define ARP_CSTATE(ifp) \ 79*9f20bfa6SDavid van Moolenbroek ((const struct iarp_state *)(ifp)->if_data[IF_DATA_ARP]) 80*9f20bfa6SDavid van Moolenbroek 81*9f20bfa6SDavid van Moolenbroek #ifdef INET 82*9f20bfa6SDavid van Moolenbroek void arp_report_conflicted(const struct arp_state *, const struct arp_msg *); 83*9f20bfa6SDavid van Moolenbroek void arp_announce(struct arp_state *); 84*9f20bfa6SDavid van Moolenbroek void arp_probe(struct arp_state *); 85*9f20bfa6SDavid van Moolenbroek struct arp_state *arp_new(struct interface *, const struct in_addr *); 86*9f20bfa6SDavid van Moolenbroek void arp_cancel(struct arp_state *); 87*9f20bfa6SDavid van Moolenbroek void arp_free(struct arp_state *); 88*9f20bfa6SDavid van Moolenbroek void arp_free_but(struct arp_state *); 89*9f20bfa6SDavid van Moolenbroek struct arp_state *arp_find(struct interface *, const struct in_addr *); 90*9f20bfa6SDavid van Moolenbroek void arp_close(struct interface *); 91*9f20bfa6SDavid van Moolenbroek 92*9f20bfa6SDavid van Moolenbroek void arp_handleifa(int, struct interface *, const struct in_addr *, int); 93*9f20bfa6SDavid van Moolenbroek #else 94*9f20bfa6SDavid van Moolenbroek #define arp_close(a) {} 95*9f20bfa6SDavid van Moolenbroek #endif 96*9f20bfa6SDavid van Moolenbroek #endif 97