rtmsg.c (216226) | rtmsg.c (246143) |
---|---|
1/* 2 * Copyright (c) 1984, 1993 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (c) 1994 5 * Geoffrey M. Rehmet, All rights reserved. 6 * 7 * This code is derived from software which forms part of the 4.4-Lite 8 * Berkeley software distribution, which was in derived from software --- 28 unchanged lines hidden (view full) --- 37 * SUCH DAMAGE. 38 */ 39 40/* 41 * from arp.c 8.2 (Berkeley) 1/2/94 42 */ 43 44#include <sys/cdefs.h> | 1/* 2 * Copyright (c) 1984, 1993 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (c) 1994 5 * Geoffrey M. Rehmet, All rights reserved. 6 * 7 * This code is derived from software which forms part of the 4.4-Lite 8 * Berkeley software distribution, which was in derived from software --- 28 unchanged lines hidden (view full) --- 37 * SUCH DAMAGE. 38 */ 39 40/* 41 * from arp.c 8.2 (Berkeley) 1/2/94 42 */ 43 44#include <sys/cdefs.h> |
45__FBSDID("$FreeBSD: head/libexec/bootpd/rtmsg.c 216226 2010-12-06 09:39:36Z glebius $"); | 45__FBSDID("$FreeBSD: head/libexec/bootpd/rtmsg.c 246143 2013-01-31 08:55:21Z glebius $"); |
46 47#include <sys/param.h> 48/* 49 * Verify that we are at least 4.4 BSD 50 */ 51#if defined(BSD) 52#if BSD >= 199306 53 --- 47 unchanged lines hidden (view full) --- 101 while (n > 0) { 102 read(s, buf, sizeof buf); 103 ioctl(s, FIONREAD, &n); 104 } 105 } 106} 107 108static struct sockaddr_in so_mask = {8, 0, 0, { 0xffffffff}}; | 46 47#include <sys/param.h> 48/* 49 * Verify that we are at least 4.4 BSD 50 */ 51#if defined(BSD) 52#if BSD >= 199306 53 --- 47 unchanged lines hidden (view full) --- 101 while (n > 0) { 102 read(s, buf, sizeof buf); 103 ioctl(s, FIONREAD, &n); 104 } 105 } 106} 107 108static struct sockaddr_in so_mask = {8, 0, 0, { 0xffffffff}}; |
109static struct sockaddr_inarp blank_sin = {sizeof(blank_sin), AF_INET }, sin_m; | 109static struct sockaddr_in blank_sin = {sizeof(blank_sin), AF_INET }, sin_m; |
110static struct sockaddr_dl blank_sdl = {sizeof(blank_sdl), AF_LINK }, sdl_m; | 110static struct sockaddr_dl blank_sdl = {sizeof(blank_sdl), AF_LINK }, sdl_m; |
111static int expire_time, flags, export_only, doing_proxy; | 111static int expire_time, flags, doing_proxy; |
112static struct { 113 struct rt_msghdr m_rtm; 114 char m_space[512]; 115} m_rtmsg; 116 117/* 118 * Set an individual arp entry 119 */ 120int bsd_arp_set(ia, eaddr, len) 121 struct in_addr *ia; 122 char *eaddr; 123 int len; 124{ | 112static struct { 113 struct rt_msghdr m_rtm; 114 char m_space[512]; 115} m_rtmsg; 116 117/* 118 * Set an individual arp entry 119 */ 120int bsd_arp_set(ia, eaddr, len) 121 struct in_addr *ia; 122 char *eaddr; 123 int len; 124{ |
125 register struct sockaddr_inarp *sin = &sin_m; | 125 register struct sockaddr_in *sin = &sin_m; |
126 register struct sockaddr_dl *sdl; 127 register struct rt_msghdr *rtm = &(m_rtmsg.m_rtm); 128 u_char *ea; 129 struct timespec tp; 130 int op = RTM_ADD; 131 132 getsocket(); 133 sdl_m = blank_sdl; 134 sin_m = blank_sin; 135 sin->sin_addr = *ia; 136 137 ea = (u_char *)LLADDR(&sdl_m); 138 bcopy(eaddr, ea, len); 139 sdl_m.sdl_alen = len; | 126 register struct sockaddr_dl *sdl; 127 register struct rt_msghdr *rtm = &(m_rtmsg.m_rtm); 128 u_char *ea; 129 struct timespec tp; 130 int op = RTM_ADD; 131 132 getsocket(); 133 sdl_m = blank_sdl; 134 sin_m = blank_sin; 135 sin->sin_addr = *ia; 136 137 ea = (u_char *)LLADDR(&sdl_m); 138 bcopy(eaddr, ea, len); 139 sdl_m.sdl_alen = len; |
140 doing_proxy = flags = export_only = expire_time = 0; | 140 doing_proxy = flags = expire_time = 0; |
141 142 /* make arp entry temporary */ 143 clock_gettime(CLOCK_MONOTONIC, &tp); 144 expire_time = tp.tv_sec + 20 * 60; 145 146tryagain: 147 if (rtmsg(RTM_GET) < 0) { 148 report(LOG_WARNING, "rtmget: %s", strerror(errno)); 149 return (1); 150 } | 141 142 /* make arp entry temporary */ 143 clock_gettime(CLOCK_MONOTONIC, &tp); 144 expire_time = tp.tv_sec + 20 * 60; 145 146tryagain: 147 if (rtmsg(RTM_GET) < 0) { 148 report(LOG_WARNING, "rtmget: %s", strerror(errno)); 149 return (1); 150 } |
151 sin = (struct sockaddr_inarp *)(rtm + 1); | 151 sin = (struct sockaddr_in *)(rtm + 1); |
152 sdl = (struct sockaddr_dl *)(sin->sin_len + (char *)sin); 153 if (sin->sin_addr.s_addr == sin_m.sin_addr.s_addr) { 154 if (sdl->sdl_family == AF_LINK && 155 !(rtm->rtm_flags & RTF_GATEWAY)) switch (sdl->sdl_type) { 156 case IFT_ETHER: case IFT_FDDI: case IFT_ISO88023: 157 case IFT_ISO88024: case IFT_ISO88025: 158 op = RTM_CHANGE; 159 goto overwrite; 160 } 161 if (doing_proxy == 0) { 162 report(LOG_WARNING, "set: can only proxy for %s\n", 163 inet_ntoa(sin->sin_addr)); 164 return (1); 165 } | 152 sdl = (struct sockaddr_dl *)(sin->sin_len + (char *)sin); 153 if (sin->sin_addr.s_addr == sin_m.sin_addr.s_addr) { 154 if (sdl->sdl_family == AF_LINK && 155 !(rtm->rtm_flags & RTF_GATEWAY)) switch (sdl->sdl_type) { 156 case IFT_ETHER: case IFT_FDDI: case IFT_ISO88023: 157 case IFT_ISO88024: case IFT_ISO88025: 158 op = RTM_CHANGE; 159 goto overwrite; 160 } 161 if (doing_proxy == 0) { 162 report(LOG_WARNING, "set: can only proxy for %s\n", 163 inet_ntoa(sin->sin_addr)); 164 return (1); 165 } |
166 if (sin_m.sin_other & SIN_PROXY) { 167 report(LOG_WARNING, 168 "set: proxy entry exists for non 802 device\n"); 169 return(1); 170 } 171 sin_m.sin_other = SIN_PROXY; 172 export_only = 1; | |
173 goto tryagain; 174 } 175overwrite: 176 if (sdl->sdl_family != AF_LINK) { 177 report(LOG_WARNING, 178 "cannot intuit interface index and type for %s\n", 179 inet_ntoa(sin->sin_addr)); 180 return (1); --- 23 unchanged lines hidden (view full) --- 204 report(LOG_ERR, "set_arp: internal wrong cmd - exiting"); 205 exit(1); 206 case RTM_ADD: 207 case RTM_CHANGE: 208 rtm->rtm_addrs |= RTA_GATEWAY; 209 rtm->rtm_rmx.rmx_expire = expire_time; 210 rtm->rtm_inits = RTV_EXPIRE; 211 rtm->rtm_flags |= (RTF_HOST | RTF_STATIC | RTF_LLDATA); | 166 goto tryagain; 167 } 168overwrite: 169 if (sdl->sdl_family != AF_LINK) { 170 report(LOG_WARNING, 171 "cannot intuit interface index and type for %s\n", 172 inet_ntoa(sin->sin_addr)); 173 return (1); --- 23 unchanged lines hidden (view full) --- 197 report(LOG_ERR, "set_arp: internal wrong cmd - exiting"); 198 exit(1); 199 case RTM_ADD: 200 case RTM_CHANGE: 201 rtm->rtm_addrs |= RTA_GATEWAY; 202 rtm->rtm_rmx.rmx_expire = expire_time; 203 rtm->rtm_inits = RTV_EXPIRE; 204 rtm->rtm_flags |= (RTF_HOST | RTF_STATIC | RTF_LLDATA); |
212 sin_m.sin_other = 0; | |
213 if (doing_proxy) { | 205 if (doing_proxy) { |
214 if (export_only) 215 sin_m.sin_other = SIN_PROXY; 216 else { 217 rtm->rtm_addrs |= RTA_NETMASK; 218 rtm->rtm_flags &= ~RTF_HOST; 219 } | 206 rtm->rtm_addrs |= RTA_NETMASK; 207 rtm->rtm_flags &= ~RTF_HOST; |
220 } 221 /* FALLTHROUGH */ 222 case RTM_GET: 223 rtm->rtm_addrs |= RTA_DST; 224 } 225#define NEXTADDR(w, s) \ 226 if (rtm->rtm_addrs & (w)) { \ 227 bcopy((char *)&s, cp, sizeof(s)); cp += sizeof(s);} --- 28 unchanged lines hidden --- | 208 } 209 /* FALLTHROUGH */ 210 case RTM_GET: 211 rtm->rtm_addrs |= RTA_DST; 212 } 213#define NEXTADDR(w, s) \ 214 if (rtm->rtm_addrs & (w)) { \ 215 bcopy((char *)&s, cp, sizeof(s)); cp += sizeof(s);} --- 28 unchanged lines hidden --- |