本文整理汇总了C++中LLADDR函数的典型用法代码示例。如果您正苦于以下问题:C++ LLADDR函数的具体用法?C++ LLADDR怎么用?C++ LLADDR使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了LLADDR函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: bsd_get_mac
static int bsd_get_mac(const char ifname[], uint8_t eth_addr[])
{
struct ifreq *ifrp;
struct ifconf ifc;
char buffer[720];
int socketfd,error,len,space=0;
ifc.ifc_len=sizeof(buffer);
len=ifc.ifc_len;
ifc.ifc_buf=buffer;
socketfd=socket(AF_INET,SOCK_DGRAM,0);
if((error=ioctl(socketfd,SIOCGIFCONF,&ifc))<0)
{
perror("ioctl faild");
exit(1);
}
if(ifc.ifc_len<=len)
{
ifrp=ifc.ifc_req;
do
{
struct sockaddr *sa=&ifrp->ifr_addr;
if(((struct sockaddr_dl *)sa)->sdl_type==IFT_ETHER) {
if (strcmp(ifname, ifrp->ifr_name) == 0){
memcpy (eth_addr, LLADDR((struct sockaddr_dl *)&ifrp->ifr_addr), 6);
return 0;
}
}
ifrp=(struct ifreq*)(sa->sa_len+(caddr_t)&ifrp->ifr_addr);
space+=(int)sa->sa_len+sizeof(ifrp->ifr_name);
}
while(space<ifc.ifc_len);
}
return 1;
}
示例2: iso88025_ifattach
/*
* Perform common duties while attaching to interface list
*/
void
iso88025_ifattach(struct ifnet *ifp, const u_int8_t *lla, int bpf)
{
struct ifaddr *ifa;
struct sockaddr_dl *sdl;
ifa = NULL;
ifp->if_type = IFT_ISO88025;
ifp->if_addrlen = ISO88025_ADDR_LEN;
ifp->if_hdrlen = ISO88025_HDR_LEN;
if_attach(ifp); /* Must be called before additional assignments */
ifp->if_output = iso88025_output;
ifp->if_input = iso88025_input;
ifp->if_resolvemulti = iso88025_resolvemulti;
ifp->if_broadcastaddr = iso88025_broadcastaddr;
if (ifp->if_baudrate == 0)
ifp->if_baudrate = TR_16MBPS; /* 16Mbit should be a safe default */
if (ifp->if_mtu == 0)
ifp->if_mtu = ISO88025_DEFAULT_MTU;
ifa = ifp->if_addr;
KASSERT(ifa != NULL, ("%s: no lladdr!\n", __func__));
sdl = (struct sockaddr_dl *)ifa->ifa_addr;
sdl->sdl_type = IFT_ISO88025;
sdl->sdl_alen = ifp->if_addrlen;
bcopy(lla, LLADDR(sdl), ifp->if_addrlen);
if (bpf)
bpfattach(ifp, DLT_IEEE802, ISO88025_HDR_LEN);
return;
}
示例3: log_sockaddr
const char *
log_sockaddr(struct sockaddr *sa)
{
static char buf[NI_MAXHOST];
if (sa == NULL)
return "(none)";
if (sa->sa_family == AF_UNIX) {
if (strlen(((struct sockaddr_un *)sa)->sun_path))
return ((struct sockaddr_un *)sa)->sun_path;
else
return "(local user)";
} else if (sa->sa_family == AF_LINK) {
return ether_ntoa((struct ether_addr *)LLADDR((struct sockaddr_dl *)sa));
}
if (getnameinfo(sa, sa->sa_len, buf, sizeof(buf), NULL, 0,
NI_NUMERICHOST))
return "(unknown)";
else
return buf;
}
示例4: getGatewayMacAddress
bool getGatewayMacAddress(quint32 ipv4Host, QByteArray& mac)
{
std::vector<char> data(512 * 1024);
int mib[6];
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0;
mib[3] = AF_INET;
mib[4] = NET_RT_FLAGS;
mib[5] = RTF_LLINFO;
size_t cb = data.size();
if (sysctl(mib, 6, &data[0], &cb, NULL, 0) == 0) {
const char *p = &data[0];
const char *pe = p + cb;
const rt_msghdr *rtm;
for (; p != pe; p += rtm->rtm_msglen) {
rtm = reinterpret_cast<const rt_msghdr*>(p);
const sockaddr_inarp *sin = reinterpret_cast<const sockaddr_inarp*>(rtm + 1);
const sockaddr_dl *sdl = reinterpret_cast<const sockaddr_dl*>(sin + 1);
if (sdl->sdl_alen) {
if (ntohl(sin->sin_addr.s_addr) == ipv4Host) {
u_char *cp = (u_char*)LLADDR(sdl);
for (int i = 0; i < 6; i++) {
mac.push_back(cp[i]);
}
return true;
}
}
}
}
return false;
}
示例5: sifproxyarp
/*
* sifproxyarp - Make a proxy ARP entry for the peer.
*/
int
sifproxyarp(
int unit,
uint32_t hisaddr)
{
struct arpreq arpreq;
struct {
struct sockaddr_dl sdl;
char space[128];
} dls;
BZERO(&arpreq, sizeof(arpreq));
/*
* Get the hardware address of an interface on the same subnet
* as our local address.
*/
if (!get_ether_addr(hisaddr, &dls.sdl)) {
error("Cannot determine ethernet address for proxy ARP");
return 0;
}
arpreq.arp_ha.sa_len = sizeof(struct sockaddr);
arpreq.arp_ha.sa_family = AF_UNSPEC;
BCOPY(LLADDR(&dls.sdl), arpreq.arp_ha.sa_data, dls.sdl.sdl_alen);
SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = hisaddr;
arpreq.arp_flags = ATF_PERM | ATF_PUBL;
if (ioctl(sockfd, SIOCSARP, (caddr_t)&arpreq) < 0) {
error("Couldn't add proxy arp entry: %m");
return 0;
}
proxy_arp_addr = hisaddr;
return 1;
}
示例6: lladdropt_fill
void
lladdropt_fill(struct sockaddr_dl *sdl, struct nd_opt_hdr *ndopt)
{
char *addr;
ndopt->nd_opt_type = ND_OPT_SOURCE_LINKADDR; /* fixed */
switch (sdl->sdl_type) {
case IFT_ETHER:
#ifdef IFT_IEEE80211
case IFT_IEEE80211:
#endif
ndopt->nd_opt_len = (ROUNDUP8(ETHER_ADDR_LEN + 2)) >> 3;
addr = (char *)(ndopt + 1);
memcpy(addr, LLADDR(sdl), ETHER_ADDR_LEN);
break;
default:
warnmsg(LOG_ERR, __func__,
"unsupported link type(%d)", sdl->sdl_type);
exit(1);
}
return;
}
示例7: atm_ifattach
/*
* Perform common duties while attaching to interface list.
*/
void
atm_ifattach(struct ifnet *ifp)
{
struct ifaddr *ifa;
struct sockaddr_dl *sdl;
struct ifatm *ifatm = ifp->if_l2com;
ifp->if_addrlen = 0;
ifp->if_hdrlen = 0;
if_attach(ifp);
ifp->if_mtu = ATMMTU;
ifp->if_output = atm_output;
#if 0
ifp->if_input = atm_input;
#endif
ifp->if_snd.ifq_maxlen = 50; /* dummy */
TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
if (ifa->ifa_addr->sa_family == AF_LINK) {
sdl = (struct sockaddr_dl *)ifa->ifa_addr;
sdl->sdl_type = IFT_ATM;
sdl->sdl_alen = ifp->if_addrlen;
#ifdef notyet /* if using ATMARP, store hardware address using the next line */
bcopy(ifp->hw_addr, LLADDR(sdl), ifp->if_addrlen);
#endif
break;
}
ifp->if_linkmib = &ifatm->mib;
ifp->if_linkmiblen = sizeof(ifatm->mib);
if(ng_atm_attach_p)
(*ng_atm_attach_p)(ifp);
if (atm_harp_attach_p)
(*atm_harp_attach_p)(ifp);
}
示例8: createInterfaces
QT_BEGIN_INCLUDE_NAMESPACE
# include <net/if_dl.h>
QT_END_INCLUDE_NAMESPACE
static QList<QNetworkInterfacePrivate *> createInterfaces(ifaddrs *rawList)
{
QList<QNetworkInterfacePrivate *> interfaces;
// on NetBSD we use AF_LINK and sockaddr_dl
// scan the list for that family
for (ifaddrs *ptr = rawList; ptr; ptr = ptr->ifa_next)
if (ptr->ifa_addr && ptr->ifa_addr->sa_family == AF_LINK) {
QNetworkInterfacePrivate *iface = new QNetworkInterfacePrivate;
interfaces << iface;
sockaddr_dl *sdl = (sockaddr_dl *)ptr->ifa_addr;
iface->index = sdl->sdl_index;
iface->name = QString::fromLatin1(ptr->ifa_name);
iface->flags = convertFlags(ptr->ifa_flags);
iface->hardwareAddress = iface->makeHwAddress(sdl->sdl_alen, (uchar*)LLADDR(sdl));
}
return interfaces;
}
示例9: _system_hostid_lookup
static uint64_t _system_hostid_lookup( struct ifaddrs* ifaddr )
{
unsigned int j;
union
{
uint64_t id;
unsigned char ALIGN(8) buffer[8];
} hostid;
if( ifaddr->ifa_addr && ( ifaddr->ifa_addr->sa_family == AF_LINK ) )
{
struct sockaddr_dl* addr_dl = (struct sockaddr_dl*)ifaddr->ifa_addr;
FOUNDATION_ASSERT( addr_dl->sdl_alen == 6 );
hostid.id = 0;
for( j = 0; j < 6; ++j )
hostid.buffer[5-j] = LLADDR(addr_dl)[j];
return hostid.id;
}
return 0;
}
示例10: eth_get
static int eth_get(const char *device, u8 ea[ETH_ALEN])
{
struct if_msghdr *ifm;
struct sockaddr_dl *sdl;
u_char *p, *buf;
size_t len;
int mib[] = { CTL_NET, AF_ROUTE, 0, AF_LINK, NET_RT_IFLIST, 0 };
if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0)
return -1;
if ((buf = os_malloc(len)) == NULL)
return -1;
if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
os_free(buf);
return -1;
}
for (p = buf; p < buf + len; p += ifm->ifm_msglen) {
ifm = (struct if_msghdr *)p;
sdl = (struct sockaddr_dl *)(ifm + 1);
if (ifm->ifm_type != RTM_IFINFO ||
(ifm->ifm_addrs & RTA_IFP) == 0)
continue;
if (sdl->sdl_family != AF_LINK || sdl->sdl_nlen == 0 ||
os_memcmp(sdl->sdl_data, device, sdl->sdl_nlen) != 0)
continue;
os_memcpy(ea, LLADDR(sdl), sdl->sdl_alen);
break;
}
os_free(buf);
if (p >= buf + len) {
errno = ESRCH;
return -1;
}
return 0;
}
示例11: rtadv_send_packet
//.........这里部分代码省略.........
rtadv->nd_ra_curhoplimit = 64;
/* RFC4191: Default Router Preference is 0 if Router Lifetime is 0. */
rtadv->nd_ra_flags_reserved =
zif->rtadv.AdvDefaultLifetime == 0 ? 0 : zif->rtadv.DefaultPreference;
rtadv->nd_ra_flags_reserved <<= 3;
if (zif->rtadv.AdvManagedFlag)
rtadv->nd_ra_flags_reserved |= ND_RA_FLAG_MANAGED;
if (zif->rtadv.AdvOtherConfigFlag)
rtadv->nd_ra_flags_reserved |= ND_RA_FLAG_OTHER;
if (zif->rtadv.AdvHomeAgentFlag)
rtadv->nd_ra_flags_reserved |= ND_RA_FLAG_HOME_AGENT;
rtadv->nd_ra_router_lifetime = htons (zif->rtadv.AdvDefaultLifetime);
rtadv->nd_ra_reachable = htonl (zif->rtadv.AdvReachableTime);
rtadv->nd_ra_retransmit = htonl (0);
len = sizeof (struct nd_router_advert);
if (zif->rtadv.AdvHomeAgentFlag)
{
struct nd_opt_homeagent_info *ndopt_hai =
(struct nd_opt_homeagent_info *)(buf + len);
ndopt_hai->nd_opt_hai_type = ND_OPT_HA_INFORMATION;
ndopt_hai->nd_opt_hai_len = 1;
ndopt_hai->nd_opt_hai_reserved = 0;
ndopt_hai->nd_opt_hai_preference = htons(zif->rtadv.HomeAgentPreference);
ndopt_hai->nd_opt_hai_lifetime = htons(zif->rtadv.HomeAgentLifetime);
len += sizeof(struct nd_opt_homeagent_info);
}
if (zif->rtadv.AdvIntervalOption)
{
struct nd_opt_adv_interval *ndopt_adv =
(struct nd_opt_adv_interval *)(buf + len);
ndopt_adv->nd_opt_ai_type = ND_OPT_ADV_INTERVAL;
ndopt_adv->nd_opt_ai_len = 1;
ndopt_adv->nd_opt_ai_reserved = 0;
ndopt_adv->nd_opt_ai_interval = htonl(zif->rtadv.MaxRtrAdvInterval);
len += sizeof(struct nd_opt_adv_interval);
}
/* Fill in prefix. */
for (ALL_LIST_ELEMENTS_RO (zif->rtadv.AdvPrefixList, node, rprefix))
{
struct nd_opt_prefix_info *pinfo;
pinfo = (struct nd_opt_prefix_info *) (buf + len);
pinfo->nd_opt_pi_type = ND_OPT_PREFIX_INFORMATION;
pinfo->nd_opt_pi_len = 4;
pinfo->nd_opt_pi_prefix_len = rprefix->prefix.prefixlen;
pinfo->nd_opt_pi_flags_reserved = 0;
if (rprefix->AdvOnLinkFlag)
pinfo->nd_opt_pi_flags_reserved |= ND_OPT_PI_FLAG_ONLINK;
if (rprefix->AdvAutonomousFlag)
pinfo->nd_opt_pi_flags_reserved |= ND_OPT_PI_FLAG_AUTO;
if (rprefix->AdvRouterAddressFlag)
pinfo->nd_opt_pi_flags_reserved |= ND_OPT_PI_FLAG_RADDR;
pinfo->nd_opt_pi_valid_time = htonl (rprefix->AdvValidLifetime);
pinfo->nd_opt_pi_preferred_time = htonl (rprefix->AdvPreferredLifetime);
pinfo->nd_opt_pi_reserved2 = 0;
memcpy (&pinfo->nd_opt_pi_prefix, &rprefix->prefix.u.prefix6,
sizeof (struct in6_addr));
#ifdef DEBUG
{
u_char buf[INET6_ADDRSTRLEN];
zlog_debug ("DEBUG %s", inet_ntop (AF_INET6, &pinfo->nd_opt_pi_prefix,
buf, INET6_ADDRSTRLEN));
}
#endif /* DEBUG */
len += sizeof (struct nd_opt_prefix_info);
}
/* Hardware address. */
#ifdef HAVE_STRUCT_SOCKADDR_DL
sdl = &ifp->sdl;
if (sdl != NULL && sdl->sdl_alen != 0)
{
buf[len++] = ND_OPT_SOURCE_LINKADDR;
/* Option length should be rounded up to next octet if
the link address does not end on an octet boundary. */
buf[len++] = (sdl->sdl_alen + 9) >> 3;
memcpy (buf + len, LLADDR (sdl), sdl->sdl_alen);
len += sdl->sdl_alen;
/* Pad option to end on an octet boundary. */
memset (buf + len, 0, -(sdl->sdl_alen + 2) & 0x7);
len += -(sdl->sdl_alen + 2) & 0x7;
}
示例12: get_macaddr
int get_macaddr(const char *ifname, U8 *addr)
{
#if defined(__NBR_OSX__)
kern_return_t kernResult = KERN_SUCCESS;
io_iterator_t intfIterator;
UInt8 MACAddress[kIOEthernetAddressSize];
kernResult = FindEthernetInterfaces(&intfIterator);
if (KERN_SUCCESS != kernResult) {
//OSDEP_ERROUT(ERROR,SYSCALL,"FindEthernetInterfaces returned 0x%08x\n", kernResult);
return NBR_ESYSCALL;
}
else {
kernResult = GetMACAddress(intfIterator, addr, sizeof(MACAddress));
if (KERN_SUCCESS != kernResult) {
//OSDEP_ERROUT(ERROR,SYSCALL,"GetMACAddress returned 0x%08x\n", kernResult);
}
else {
TRACE("This system's built-in MAC address is %02x:%02x:%02x:%02x:%02x:%02x.\n",
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
}
}
(void) IOObjectRelease(intfIterator); // Release the iterator.
return kernResult == KERN_SUCCESS ? NBR_OK : NBR_ESYSCALL;
#elif defined(__NBR_IOS__)
int mib[6];
size_t len;
char *buf;
unsigned char *ptr;
struct if_msghdr *ifm;
struct sockaddr_dl *sdl;
mib[0] = CTL_NET;
mib[1] = AF_ROUTE;
mib[2] = 0;
mib[3] = AF_LINK;
mib[4] = NET_RT_IFLIST;
if ((mib[5] = if_nametoindex(ifname)) == 0) {
TRACE("Error: if_nametoindex error\n");
return NBR_ESYSCALL;
}
if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
TRACE("Error: sysctl, take 1\n");
return NBR_ESYSCALL;
}
if ((buf = (char *)util::mem::alloc(len)) == NULL) {
TRACE("Could not allocate memory. error!\n");
return NBR_EMALLOC;
}
if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
TRACE("Error: sysctl, take 2");
util::mem::free(buf);
return NBR_ESYSCALL;
}
ifm = (struct if_msghdr *)buf;
sdl = (struct sockaddr_dl *)(ifm + 1);
ptr = (unsigned char *)LLADDR(sdl);
util::mem::copy(addr, ptr, 6);
util::mem::free(buf);
TRACE("MAC ADDRESS (%s): [%02X:%02X:%02X:%02X:%02X:%02X]\n", ifname,
*addr, *(addr+1), *(addr+2), *(addr+3), *(addr+4), *(addr+5));
return NBR_OK;
#else
int soc, ret;
struct ifreq req;
if ((soc = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
TRACE("socket fail: ret=%d,errno=%d",soc,errno);
ret = soc;
goto error;
}
util::str::copy(req.ifr_name, ifname, sizeof(req.ifr_name));
req.ifr_addr.sa_family = AF_INET;
if ((ret = ioctl(soc, SIOCGIFHWADDR, &req)) < 0) {
TRACE("ioctl fail: soc=%d,ret=%d,errno=%d",soc,ret,errno);
goto error;
}
util::mem::copy(addr, &(req.ifr_addr.sa_data), 6);
ret = 0;
TRACE("MAC ADDRESS (%s): [%02X:%02X:%02X:%02X:%02X:%02X]\n", ifname,
*addr, *(addr+1), *(addr+2), *(addr+3), *(addr+4), *(addr+5));
error:
if (soc >= 0) {
close(soc);
}
return ret;
#endif
}
示例13: libnet_get_hwaddr
struct libnet_ether_addr *
libnet_get_hwaddr(libnet_t *l)
{
int mib[6];
size_t len;
int8_t *buf, *next, *end;
struct if_msghdr *ifm;
struct sockaddr_dl *sdl;
/* This implementation is not-reentrant. */
static struct libnet_ether_addr ea;
mib[0] = CTL_NET;
mib[1] = AF_ROUTE;
mib[2] = 0;
mib[3] = AF_LINK;
mib[4] = NET_RT_IFLIST;
mib[5] = 0;
if (l == NULL)
{
return (NULL);
}
if (l->device == NULL)
{
if (libnet_select_device(l) == -1)
{
/* err msg set in libnet_select_device */
return (NULL);
}
}
if (sysctl(mib, 6, NULL, &len, NULL, 0) == -1)
{
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, "%s(): sysctl(): %s",
__func__, strerror(errno));
return (NULL);
}
buf = (int8_t *)malloc(len);
if (buf == NULL)
{
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, "%s(): malloc(): %s",
__func__, strerror(errno));
return (NULL);
}
if (sysctl(mib, 6, buf, &len, NULL, 0) < 0)
{
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, "%s(): sysctl(): %s",
__func__, strerror(errno));
free(buf);
return (NULL);
}
end = buf + len;
for (next = buf ; next < end ; next += ifm->ifm_msglen)
{
ifm = (struct if_msghdr *)next;
if (ifm->ifm_version != RTM_VERSION)
continue;
if (ifm->ifm_type == RTM_IFINFO)
{
sdl = (struct sockaddr_dl *)(ifm + 1);
if (sdl->sdl_type != IFT_ETHER
&& sdl->sdl_type != IFT_FASTETHER
&& sdl->sdl_type != IFT_FASTETHERFX
&& sdl->sdl_type != IFT_GIGABITETHERNET
&& sdl->sdl_type != IFT_L2VLAN)
continue;
if (strncmp(&sdl->sdl_data[0], l->device, sdl->sdl_nlen) == 0)
{
memcpy(ea.ether_addr_octet, LLADDR(sdl), ETHER_ADDR_LEN);
break;
}
}
}
free(buf);
if (next == end) {
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
"%s(): interface %s of known type not found.",
__func__, l->device);
return NULL;
}
return (&ea);
}
示例14: get_iface_mac
char *
get_iface_mac(char *ifname)
{
#if defined(__linux__)
int r, s;
struct ifreq ifr;
char *hwaddr, mac[13];
strcpy(ifr.ifr_name, ifname);
s = socket(PF_INET, SOCK_DGRAM, 0);
if (-1 == s) {
debug(LOG_ERR, "get_iface_mac socket: %s", strerror(errno));
return NULL;
}
r = ioctl(s, SIOCGIFHWADDR, &ifr);
if (r == -1) {
debug(LOG_ERR, "get_iface_mac ioctl(SIOCGIFHWADDR): %s", strerror(errno));
close(s);
return NULL;
}
hwaddr = ifr.ifr_hwaddr.sa_data;
close(s);
snprintf(mac, sizeof(mac), "%02X%02X%02X%02X%02X%02X",
hwaddr[0] & 0xFF,
hwaddr[1] & 0xFF,
hwaddr[2] & 0xFF,
hwaddr[3] & 0xFF,
hwaddr[4] & 0xFF,
hwaddr[5] & 0xFF
);
return safe_strdup(mac);
#elif defined(__NetBSD__)
struct ifaddrs *ifa, *ifap;
const char *hwaddr;
char mac[13], *str = NULL;
struct sockaddr_dl *sdl;
if (getifaddrs(&ifap) == -1) {
debug(LOG_ERR, "getifaddrs(): %s", strerror(errno));
return NULL;
}
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
if (strcmp(ifa->ifa_name, ifname) == 0 &&
ifa->ifa_addr->sa_family == AF_LINK)
break;
}
if (ifa == NULL) {
debug(LOG_ERR, "%s: no link-layer address assigned");
goto out;
}
sdl = (struct sockaddr_dl *)ifa->ifa_addr;
hwaddr = LLADDR(sdl);
snprintf(mac, sizeof(mac), "%02X%02X%02X%02X%02X%02X",
hwaddr[0] & 0xFF, hwaddr[1] & 0xFF,
hwaddr[2] & 0xFF, hwaddr[3] & 0xFF,
hwaddr[4] & 0xFF, hwaddr[5] & 0xFF);
str = safe_strdup(mac);
out:
freeifaddrs(ifap);
return str;
#else
return NULL;
#endif
}
示例15: arptab_set
/*
* Set an individual arp entry
*/
int
arptab_set(u_char *eaddr, u_int32_t host)
{
struct sockaddr_inarp *sin = &sin_m;
struct rt_msghdr *rtm = &(m_rtmsg.m_rtm);
struct sockaddr_dl *sdl;
struct timeval now;
int rt;
getsocket();
pid = getpid();
sdl_m = blank_sdl;
sin_m = blank_sin;
sin->sin_addr.s_addr = host;
memcpy((u_char *)LLADDR(&sdl_m), (char *)eaddr, 6);
sdl_m.sdl_alen = 6;
expire_time = 0;
doing_proxy = flags = export_only = 0;
gettimeofday(&now, 0);
expire_time = now.tv_sec + 20 * 60;
tryagain:
if (rtmsg(RTM_GET) < 0) {
syslog(LOG_ERR,"%s: %m", inet_ntoa(sin->sin_addr));
close(s);
s = -1;
return (1);
}
sin = (struct sockaddr_inarp *)((char *)rtm + rtm->rtm_hdrlen);
sdl = (struct sockaddr_dl *)(sin->sin_len + (char *)sin);
if (sin->sin_addr.s_addr == sin_m.sin_addr.s_addr) {
if (sdl->sdl_family == AF_LINK &&
(rtm->rtm_flags & RTF_LLINFO) &&
!(rtm->rtm_flags & RTF_GATEWAY))
switch (sdl->sdl_type) {
case IFT_ETHER:
case IFT_FDDI:
case IFT_ISO88023:
case IFT_ISO88024:
case IFT_ISO88025:
goto overwrite;
default:
break;
}
if (doing_proxy == 0) {
syslog(LOG_ERR, "arptab_set: can only proxy for %s",
inet_ntoa(sin->sin_addr));
close(s);
s = -1;
return (1);
}
if (sin_m.sin_other & SIN_PROXY) {
syslog(LOG_ERR,
"arptab_set: proxy entry exists for non 802 device");
close(s);
s = -1;
return(1);
}
sin_m.sin_other = SIN_PROXY;
export_only = 1;
goto tryagain;
}
overwrite:
if (sdl->sdl_family != AF_LINK) {
syslog(LOG_ERR,
"arptab_set: cannot intuit interface index and type for %s",
inet_ntoa(sin->sin_addr));
close(s);
s = -1;
return (1);
}
sdl_m.sdl_type = sdl->sdl_type;
sdl_m.sdl_index = sdl->sdl_index;
rt = rtmsg(RTM_ADD);
close(s);
s = -1;
return (rt);
}