1 1.31 msaitoh /* $NetBSD: if_dl.h,v 1.31 2022/11/07 08:32:35 msaitoh Exp $ */ 2 1.5 cgd 3 1.1 cgd /* 4 1.4 mycroft * Copyright (c) 1990, 1993 5 1.4 mycroft * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.12 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd * 31 1.5 cgd * @(#)if_dl.h 8.1 (Berkeley) 6/10/93 32 1.1 cgd */ 33 1.1 cgd 34 1.14 perry /* 35 1.1 cgd * A Link-Level Sockaddr may specify the interface in one of two 36 1.1 cgd * ways: either by means of a system-provided index number (computed 37 1.1 cgd * anew and possibly differently on every reboot), or by a human-readable 38 1.1 cgd * string such as "il0" (for managerial convenience). 39 1.14 perry * 40 1.1 cgd * Census taking actions, such as something akin to SIOCGCONF would return 41 1.1 cgd * both the index and the human name. 42 1.14 perry * 43 1.1 cgd * High volume transactions (such as giving a link-level ``from'' address 44 1.1 cgd * in a recvfrom or recvmsg call) may be likely only to provide the indexed 45 1.1 cgd * form, (which requires fewer copy operations and less space). 46 1.14 perry * 47 1.1 cgd * The form and interpretation of the link-level address is purely a matter 48 1.1 cgd * of convention between the device driver and its consumers; however, it is 49 1.1 cgd * expected that all drivers for an interface of a given if_type will agree. 50 1.1 cgd */ 51 1.1 cgd 52 1.9 perry #ifndef _NET_IF_DL_H_ 53 1.9 perry #define _NET_IF_DL_H_ 54 1.9 perry 55 1.10 kleink #include <sys/ansi.h> 56 1.10 kleink 57 1.10 kleink #ifndef sa_family_t 58 1.10 kleink typedef __sa_family_t sa_family_t; 59 1.11 kleink #define sa_family_t __sa_family_t 60 1.10 kleink #endif 61 1.24 christos #ifndef socklen_t 62 1.24 christos typedef __socklen_t socklen_t; 63 1.24 christos #define socklen_t __socklen_t 64 1.24 christos #endif 65 1.24 christos 66 1.25 christos struct dl_addr { 67 1.24 christos uint8_t dl_type; /* interface type */ 68 1.24 christos uint8_t dl_nlen; /* interface name length, no trailing 0 reqd. */ 69 1.24 christos uint8_t dl_alen; /* link level address length */ 70 1.24 christos uint8_t dl_slen; /* link layer selector length */ 71 1.31 msaitoh char dl_data[24]; /* 72 1.31 msaitoh * minimum work area, can be larger; contains 73 1.31 msaitoh * both if name and ll address; big enough for 74 1.31 msaitoh * IFNAMSIZ plus 8byte ll addr. 75 1.31 msaitoh */ 76 1.24 christos }; 77 1.10 kleink 78 1.1 cgd /* 79 1.1 cgd * Structure of a Link-Level sockaddr: 80 1.1 cgd */ 81 1.1 cgd struct sockaddr_dl { 82 1.22 matt uint8_t sdl_len; /* Total length of sockaddr */ 83 1.13 wiz sa_family_t sdl_family; /* AF_LINK */ 84 1.24 christos uint16_t sdl_index; /* if != 0, system given index for interface */ 85 1.25 christos struct dl_addr sdl_addr; 86 1.24 christos #define sdl_type sdl_addr.dl_type 87 1.24 christos #define sdl_nlen sdl_addr.dl_nlen 88 1.24 christos #define sdl_alen sdl_addr.dl_alen 89 1.24 christos #define sdl_slen sdl_addr.dl_slen 90 1.24 christos #define sdl_data sdl_addr.dl_data 91 1.1 cgd }; 92 1.1 cgd 93 1.19 dyoung #define satosdl(__sa) ((struct sockaddr_dl *)(__sa)) 94 1.19 dyoung #define satocsdl(__sa) ((const struct sockaddr_dl *)(__sa)) 95 1.19 dyoung 96 1.16 christos /* We do arithmetic directly with these, so keep them char instead of void */ 97 1.16 christos #define LLADDR(s) ((char *)((s)->sdl_data + (s)->sdl_nlen)) 98 1.16 christos #define CLLADDR(s) ((const char *)((s)->sdl_data + (s)->sdl_nlen)) 99 1.1 cgd 100 1.19 dyoung #ifdef _KERNEL 101 1.19 dyoung uint8_t sockaddr_dl_measure(uint8_t, uint8_t); 102 1.21 dyoung struct sockaddr *sockaddr_dl_alloc(uint16_t, uint8_t, 103 1.21 dyoung const void *, uint8_t, const void *, uint8_t, int); 104 1.21 dyoung struct sockaddr_dl *sockaddr_dl_init(struct sockaddr_dl *, socklen_t, uint16_t, 105 1.21 dyoung uint8_t, const void *, uint8_t, const void *, uint8_t); 106 1.21 dyoung struct sockaddr_dl *sockaddr_dl_setaddr(struct sockaddr_dl *, socklen_t, 107 1.21 dyoung const void *, uint8_t); 108 1.19 dyoung #else 109 1.1 cgd 110 1.1 cgd #include <sys/cdefs.h> 111 1.1 cgd 112 1.1 cgd __BEGIN_DECLS 113 1.18 thorpej void link_addr(const char *, struct sockaddr_dl *); 114 1.18 thorpej char *link_ntoa(const struct sockaddr_dl *); 115 1.1 cgd __END_DECLS 116 1.1 cgd 117 1.8 jtc #endif /* !_KERNEL */ 118 1.9 perry 119 1.24 christos #if defined(_KERNEL) || defined(_TEST) 120 1.24 christos // 255 xx: + 255 'a' + / + # + 3 digits + NUL 121 1.24 christos #define LINK_ADDRSTRLEN ((255 * 4) + 5) 122 1.28 kre #define LLA_ADDRSTRLEN (16 * 3) 123 1.24 christos 124 1.27 roy char *lla_snprintf(char *, size_t, const void *, size_t); 125 1.25 christos int dl_print(char *, size_t, const struct dl_addr *); 126 1.26 christos #define DL_PRINT(b, a) (dl_print((b), sizeof(b), (a)), (b)) 127 1.24 christos int sdl_print(char *, size_t, const void *); 128 1.24 christos #endif 129 1.24 christos 130 1.17 elad #endif /* !_NET_IF_DL_H_ */ 131