本文整理汇总了C++中NLMSG_DATA函数的典型用法代码示例。如果您正苦于以下问题:C++ NLMSG_DATA函数的具体用法?C++ NLMSG_DATA怎么用?C++ NLMSG_DATA使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NLMSG_DATA函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: get_netlink
static int
get_netlink(struct dhcpcd_ctx *ctx, struct iovec *iov,
struct interface *ifp, int fd, int flags,
int (*callback)(struct dhcpcd_ctx *, struct interface *, struct nlmsghdr *))
{
struct msghdr msg;
struct sockaddr_nl nladdr;
ssize_t len;
struct nlmsghdr *nlm;
int r;
unsigned int again;
memset(&msg, 0, sizeof(msg));
msg.msg_name = &nladdr;
msg.msg_namelen = sizeof(nladdr);
memset(&nladdr, 0, sizeof(nladdr));
msg.msg_iov = iov;
msg.msg_iovlen = 1;
recv_again:
if ((len = recvmsg_realloc(fd, &msg, flags)) == -1)
return -1;
if (len == 0)
return 0;
/* Check sender */
if (msg.msg_namelen != sizeof(nladdr)) {
errno = EINVAL;
return -1;
}
/* Ignore message if it is not from kernel */
if (nladdr.nl_pid != 0)
return 0;
r = 0;
again = 0; /* Appease static analysis */
for (nlm = iov->iov_base;
nlm && NLMSG_OK(nlm, (size_t)len);
nlm = NLMSG_NEXT(nlm, len))
{
again = (nlm->nlmsg_flags & NLM_F_MULTI);
if (nlm->nlmsg_type == NLMSG_NOOP)
continue;
if (nlm->nlmsg_type == NLMSG_ERROR) {
struct nlmsgerr *err;
if (nlm->nlmsg_len - sizeof(*nlm) < sizeof(*err)) {
errno = EBADMSG;
return -1;
}
err = (struct nlmsgerr *)NLMSG_DATA(nlm);
if (err->error != 0) {
errno = -err->error;
return -1;
}
break;
}
if (nlm->nlmsg_type == NLMSG_DONE) {
again = 0;
break;
}
if (callback && (r = callback(ctx, ifp, nlm)) != 0)
break;
}
if (r == 0 && again)
goto recv_again;
return r;
}
开发者ID:jaredmcneill,项目名称:netbsd-src,代码行数:69,代码来源:if-linux.c
示例2: ifc_act_on_address
/*
* Adds or deletes an IP address on an interface.
*
* Action is one of:
* - RTM_NEWADDR (to add a new address)
* - RTM_DELADDR (to delete an existing address)
*
* Returns zero on success and negative errno on failure.
*/
int ifc_act_on_address(int action, const char *name, const char *address,
int prefixlen) {
int ifindex, s, len, ret;
struct sockaddr_storage ss;
void *addr;
size_t addrlen;
struct {
struct nlmsghdr n;
struct ifaddrmsg r;
// Allow for IPv6 address, headers, and padding.
char attrbuf[NLMSG_ALIGN(sizeof(struct nlmsghdr)) +
NLMSG_ALIGN(sizeof(struct rtattr)) +
NLMSG_ALIGN(INET6_ADDRLEN)];
} req;
struct rtattr *rta;
struct nlmsghdr *nh;
struct nlmsgerr *err;
char buf[NLMSG_ALIGN(sizeof(struct nlmsghdr)) +
NLMSG_ALIGN(sizeof(struct nlmsgerr)) +
NLMSG_ALIGN(sizeof(struct nlmsghdr))];
// Get interface ID.
ifindex = if_nametoindex(name);
if (ifindex == 0) {
return -errno;
}
// Convert string representation to sockaddr_storage.
ret = string_to_ip(address, &ss);
if (ret) {
return ret;
}
// Determine address type and length.
if (ss.ss_family == AF_INET) {
struct sockaddr_in *sin = (struct sockaddr_in *) &ss;
addr = &sin->sin_addr;
addrlen = INET_ADDRLEN;
} else if (ss.ss_family == AF_INET6) {
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) &ss;
addr = &sin6->sin6_addr;
addrlen = INET6_ADDRLEN;
} else {
return -EAFNOSUPPORT;
}
// Fill in netlink structures.
memset(&req, 0, sizeof(req));
// Netlink message header.
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.r));
req.n.nlmsg_type = action;
req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
req.n.nlmsg_pid = getpid();
// Interface address message header.
req.r.ifa_family = ss.ss_family;
req.r.ifa_prefixlen = prefixlen;
req.r.ifa_index = ifindex;
// Routing attribute. Contains the actual IP address.
rta = (struct rtattr *) (((char *) &req) + NLMSG_ALIGN(req.n.nlmsg_len));
rta->rta_type = IFA_LOCAL;
rta->rta_len = RTA_LENGTH(addrlen);
req.n.nlmsg_len = NLMSG_ALIGN(req.n.nlmsg_len) + RTA_LENGTH(addrlen);
memcpy(RTA_DATA(rta), addr, addrlen);
s = socket(PF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE);
if (send(s, &req, req.n.nlmsg_len, 0) < 0) {
close(s);
return -errno;
}
len = recv(s, buf, sizeof(buf), 0);
close(s);
if (len < 0) {
return -errno;
}
// Parse the acknowledgement to find the return code.
nh = (struct nlmsghdr *) buf;
if (!NLMSG_OK(nh, (unsigned) len) || nh->nlmsg_type != NLMSG_ERROR) {
return -EINVAL;
}
err = NLMSG_DATA(nh);
// Return code is negative errno.
return err->error;
}
开发者ID:00zhengfu00,项目名称:platform_system_core,代码行数:98,代码来源:ifc_utils.c
示例3: ipt_ulog_packet
static void ipt_ulog_packet(unsigned int hooknum,
const struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
const struct ipt_ulog_info *loginfo,
const char *prefix)
{
ulog_buff_t *ub;
ulog_packet_msg_t *pm;
size_t size, copy_len;
struct nlmsghdr *nlh;
struct timeval tv;
unsigned int groupnum = ffs(loginfo->nl_group) - 1;
if (loginfo->copy_range == 0 || loginfo->copy_range > skb->len)
copy_len = skb->len;
else
copy_len = loginfo->copy_range;
size = NLMSG_SPACE(sizeof(*pm) + copy_len);
ub = &ulog_buffers[groupnum];
spin_lock_bh(&ulog_lock);
if (!ub->skb) {
if (!(ub->skb = ulog_alloc_skb(size)))
goto alloc_failure;
} else if (ub->qlen >= loginfo->qthreshold ||
size > skb_tailroom(ub->skb)) {
ulog_send(groupnum);
if (!(ub->skb = ulog_alloc_skb(size)))
goto alloc_failure;
}
pr_debug("qlen %d, qthreshold %Zu\n", ub->qlen, loginfo->qthreshold);
nlh = NLMSG_PUT(ub->skb, 0, ub->qlen, ULOG_NL_EVENT,
sizeof(*pm)+copy_len);
ub->qlen++;
pm = NLMSG_DATA(nlh);
if (skb->tstamp.tv64 == 0)
__net_timestamp((struct sk_buff *)skb);
pm->data_len = copy_len;
tv = ktime_to_timeval(skb->tstamp);
put_unaligned(tv.tv_sec, &pm->timestamp_sec);
put_unaligned(tv.tv_usec, &pm->timestamp_usec);
put_unaligned(skb->mark, &pm->mark);
pm->hook = hooknum;
if (prefix != NULL)
strncpy(pm->prefix, prefix, sizeof(pm->prefix));
else if (loginfo->prefix[0] != '\0')
strncpy(pm->prefix, loginfo->prefix, sizeof(pm->prefix));
else
*(pm->prefix) = '\0';
if (in && in->hard_header_len > 0 &&
skb->mac_header != skb->network_header &&
in->hard_header_len <= ULOG_MAC_LEN) {
memcpy(pm->mac, skb_mac_header(skb), in->hard_header_len);
pm->mac_len = in->hard_header_len;
} else
pm->mac_len = 0;
if (in)
strncpy(pm->indev_name, in->name, sizeof(pm->indev_name));
else
pm->indev_name[0] = '\0';
if (out)
strncpy(pm->outdev_name, out->name, sizeof(pm->outdev_name));
else
pm->outdev_name[0] = '\0';
if (skb_copy_bits(skb, 0, pm->payload, copy_len) < 0)
BUG();
if (ub->qlen > 1)
ub->lastnlh->nlmsg_flags |= NLM_F_MULTI;
ub->lastnlh = nlh;
if (!timer_pending(&ub->timer)) {
ub->timer.expires = jiffies + flushtimeout * HZ / 100;
add_timer(&ub->timer);
}
//.........这里部分代码省略.........
开发者ID:MiniBlu,项目名称:cm11_kernel_htc_msm8974a3ul,代码行数:101,代码来源:ipt_ULOG.c
示例4: ProcessInterfaceWatch
/**
* Process the message and add/drop multicast membership if needed
*/
int
ProcessInterfaceWatch(int s, int s_ssdp, int s_ssdp6,
int n_if_addr, const char * * if_addr)
{
ssize_t len;
int i;
char buffer[4096];
#ifdef __linux__
struct iovec iov;
struct msghdr hdr;
struct nlmsghdr *nlhdr;
struct ifaddrmsg *ifa;
iov.iov_base = buffer;
iov.iov_len = sizeof(buffer);
memset(&hdr, 0, sizeof(hdr));
hdr.msg_iov = &iov;
hdr.msg_iovlen = 1;
len = recvmsg(s, &hdr, 0);
if(len < 0) {
syslog(LOG_ERR, "recvmsg(s, &hdr, 0): %m");
return -1;
}
for(nlhdr = (struct nlmsghdr *)buffer;
NLMSG_OK(nlhdr, len);
nlhdr = NLMSG_NEXT(nlhdr, len)) {
syslog(LOG_DEBUG, "nlmsg_type=%d", nlhdr->nlmsg_type);
if(nlhdr->nlmsg_type == NLMSG_DONE)
break;
if(nlhdr->nlmsg_type == RTM_NEWADDR) {
ifa = (struct ifaddrmsg *)NLMSG_DATA(nlhdr);
syslog(LOG_DEBUG, "ProcessInterfaceWatchNotify RTM_NEWADDR index=%d", ifa->ifa_index);
for(i = 0; i < n_if_addr; i++) {
if(ifa->ifa_index == if_nametoindex(if_addr[i])) {
AddDropMulticastMembership(s_ssdp, if_addr[i], 0, 0);
break;
}
}
} else if(nlhdr->nlmsg_type == RTM_DELADDR) {
ifa = (struct ifaddrmsg *)NLMSG_DATA(nlhdr);
syslog(LOG_DEBUG, "ProcessInterfaceWatchNotify RTM_DELADDR index=%d", ifa->ifa_index);
for(i = 0; i < n_if_addr; i++) {
if(ifa->ifa_index == if_nametoindex(if_addr[i])) {
AddDropMulticastMembership(s_ssdp, if_addr[i], 0, 1);
break;
}
}
}
}
#else /* __linux__ */
struct rt_msghdr * rtm;
struct ifa_msghdr * ifam;
len = recv(s, buffer, sizeof(buffer), 0);
if(len < 0) {
syslog(LOG_ERR, "ProcessInterfaceWatchNotify recv: %m");
return -1;
}
rtm = (struct rt_msghdr *)buffer;
switch(rtm->rtm_type) {
case RTM_NEWADDR:
ifam = (struct ifa_msghdr *)buffer;
syslog(LOG_DEBUG, "ProcessInterfaceWatchNotify RTM_NEWADDR index=%d", ifam->ifam_index);
for(i = 0; i < n_if_addr; i++) {
if(ifam->ifam_index == if_nametoindex(if_addr[i])) {
AddDropMulticastMembership(s_ssdp, if_addr[i], 0, 0);
break;
}
}
break;
case RTM_DELADDR:
ifam = (struct ifa_msghdr *)buffer;
syslog(LOG_DEBUG, "ProcessInterfaceWatchNotify RTM_DELADDR index=%d", ifam->ifam_index);
for(i = 0; i < n_if_addr; i++) {
if(ifam->ifam_index == if_nametoindex(if_addr[i])) {
/* I dont think it is useful */
/*AddDropMulticastMembership(s_ssdp, if_addr[i], 0, 1);*/
break;
}
}
break;
default:
syslog(LOG_DEBUG, "rtm->rtm_type=%d", rtm->rtm_type);
}
#endif
return 0;
}
开发者ID:MustafaUzumcuCom,项目名称:miniupnp,代码行数:93,代码来源:ifacewatch.c
示例5: interpretLink
static int interpretLink(struct nlmsghdr *p_hdr, struct ifaddrs **p_links, struct ifaddrs **p_resultList)
{
struct ifinfomsg *l_info = (struct ifinfomsg *)NLMSG_DATA(p_hdr);
size_t l_nameSize = 0;
size_t l_addrSize = 0;
size_t l_dataSize = 0;
size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg));
struct rtattr *l_rta;
for(l_rta = (struct rtattr *)(((char *)l_info) + NLMSG_ALIGN(sizeof(struct ifinfomsg))); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
{
void *l_rtaData = RTA_DATA(l_rta);
size_t l_rtaDataSize = RTA_PAYLOAD(l_rta);
switch(l_rta->rta_type)
{
case IFLA_ADDRESS:
case IFLA_BROADCAST:
l_addrSize += NLMSG_ALIGN(calcAddrLen(AF_PACKET, l_rtaDataSize));
break;
case IFLA_IFNAME:
l_nameSize += NLMSG_ALIGN(l_rtaSize + 1);
break;
case IFLA_STATS:
l_dataSize += NLMSG_ALIGN(l_rtaSize);
break;
default:
break;
}
}
struct ifaddrs *l_entry = malloc(sizeof(struct ifaddrs) + l_nameSize + l_addrSize + l_dataSize);
if (l_entry == NULL)
{
return -1;
}
memset(l_entry, 0, sizeof(struct ifaddrs));
l_entry->ifa_name = "";
char *l_name = ((char *)l_entry) + sizeof(struct ifaddrs);
char *l_addr = l_name + l_nameSize;
char *l_data = l_addr + l_addrSize;
l_entry->ifa_flags = l_info->ifi_flags;
l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg));
for(l_rta = (struct rtattr *)(((char *)l_info) + NLMSG_ALIGN(sizeof(struct ifinfomsg))); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
{
void *l_rtaData = RTA_DATA(l_rta);
size_t l_rtaDataSize = RTA_PAYLOAD(l_rta);
switch(l_rta->rta_type)
{
case IFLA_ADDRESS:
case IFLA_BROADCAST:
{
size_t l_addrLen = calcAddrLen(AF_PACKET, l_rtaDataSize);
makeSockaddr(AF_PACKET, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize);
((struct sockaddr_ll *)l_addr)->sll_ifindex = l_info->ifi_index;
((struct sockaddr_ll *)l_addr)->sll_hatype = l_info->ifi_type;
if(l_rta->rta_type == IFLA_ADDRESS)
{
l_entry->ifa_addr = (struct sockaddr *)l_addr;
}
else
{
l_entry->ifa_broadaddr = (struct sockaddr *)l_addr;
}
l_addr += NLMSG_ALIGN(l_addrLen);
break;
}
case IFLA_IFNAME:
strncpy(l_name, l_rtaData, l_rtaDataSize);
l_name[l_rtaDataSize] = '\0';
l_entry->ifa_name = l_name;
break;
case IFLA_STATS:
memcpy(l_data, l_rtaData, l_rtaDataSize);
l_entry->ifa_data = l_data;
break;
default:
break;
}
}
addToEnd(p_resultList, l_entry);
p_links[l_info->ifi_index - 1] = l_entry;
return 0;
}
开发者ID:huangkun1988,项目名称:android-ifaddrs,代码行数:88,代码来源:ifaddrs.c
示例6: print_qdisc
int print_qdisc(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
{
FILE *fp = (FILE*)arg;
struct tcmsg *t = NLMSG_DATA(n);
int len = n->nlmsg_len;
struct rtattr * tb[TCA_MAX+1];
struct qdisc_util *q;
char abuf[256];
if (n->nlmsg_type != RTM_NEWQDISC && n->nlmsg_type != RTM_DELQDISC) {
fprintf(stderr, "Not a qdisc\n");
return 0;
}
len -= NLMSG_LENGTH(sizeof(*t));
if (len < 0) {
fprintf(stderr, "Wrong len %d\n", len);
return -1;
}
if (filter_ifindex && filter_ifindex != t->tcm_ifindex)
return 0;
memset(tb, 0, sizeof(tb));
parse_rtattr(tb, TCA_MAX, TCA_RTA(t), len);
if (tb[TCA_KIND] == NULL) {
fprintf(stderr, "NULL kind\n");
return -1;
}
if (n->nlmsg_type == RTM_DELQDISC)
fprintf(fp, "deleted ");
fprintf(fp, "qdisc %s %x: ", (char*)RTA_DATA(tb[TCA_KIND]), t->tcm_handle>>16);
if (filter_ifindex == 0)
fprintf(fp, "dev %s ", ll_index_to_name(t->tcm_ifindex));
if (t->tcm_parent == TC_H_ROOT)
fprintf(fp, "root ");
else if (t->tcm_parent) {
print_tc_classid(abuf, sizeof(abuf), t->tcm_parent);
fprintf(fp, "parent %s ", abuf);
}
if (t->tcm_info != 1) {
fprintf(fp, "refcnt %d ", t->tcm_info);
}
if ((q = get_qdisc_kind(RTA_DATA(tb[TCA_KIND]))) != NULL)
q->print_qopt(q, fp, tb[TCA_OPTIONS]);
else
fprintf(fp, "[UNKNOWN]");
fprintf(fp, "\n");
if (show_stats) {
if (tb[TCA_STATS]) {
if (RTA_PAYLOAD(tb[TCA_STATS]) < sizeof(struct tc_stats))
fprintf(fp, "statistics truncated");
else {
struct tc_stats st;
memcpy(&st, RTA_DATA(tb[TCA_STATS]), sizeof(st));
print_tcstats(fp, &st);
fprintf(fp, "\n");
}
}
if (q && tb[TCA_XSTATS]) {
q->print_xstats(q, fp, tb[TCA_XSTATS]);
fprintf(fp, "\n");
}
fprintf(fp, "\n ");
}
fflush(fp);
return 0;
}
开发者ID:BackupTheBerlios,项目名称:wl530g-svn,代码行数:70,代码来源:tc_qdisc.c
示例7: read_ifaces
void read_ifaces(void)
{
struct sockaddr_nl addr;
socklen_t addr_len = sizeof(addr);
unsigned char buffer[4096];
int sock, len;
struct {
struct nlmsghdr nlh;
struct rtgenmsg g;
}req;
print_dbg(0, "Searching for network interfaces...\n");
sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (sock < 0) {
perror("socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE) failed");
exit(1);
}
memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK;
if (bind(sock, (struct sockaddr*)&addr, addr_len) < 0) {
perror("bind(AF_NETLINK) failed");
exit(1);
}
req.nlh.nlmsg_len = sizeof(req);
req.nlh.nlmsg_type = RTM_GETLINK;
req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_REQUEST;
req.nlh.nlmsg_pid = 0;
req.nlh.nlmsg_seq = 1;
req.g.rtgen_family = AF_PACKET;
if (sendto(sock, (void*)&req, sizeof(req), 0,
(struct sockaddr*)&addr, sizeof(addr)) < 0) {
perror("inarpd: sendto(RTM_GETLINK) failed");
exit(1);
}
while(1) {
struct nlmsghdr *h = (struct nlmsghdr*)buffer;
if ((len = recv(sock, buffer, sizeof(buffer), 0)) < 0) {
perror("recv() failed");
exit(1);
}
while (len > 0) {
if (!NLMSG_OK(h, (unsigned) len)) {
error("NLMSG 0x%X not OK\n", h->nlmsg_type);
break;
}
print_dbg(2, "NLMSG 0x%X\n", h->nlmsg_type);
if (h->nlmsg_type == RTM_NEWLINK)
parse_link(NLMSG_DATA(h), IFLA_PAYLOAD(h));
else if (h->nlmsg_type == RTM_NEWADDR)
parse_addr(NLMSG_DATA(h), IFA_PAYLOAD(h));
else if (h->nlmsg_type == NLMSG_DONE) {
if (req.nlh.nlmsg_type == RTM_GETADDR) {
close(sock);
return;
}
req.nlh.nlmsg_type = RTM_GETADDR;
if (sendto(sock, (void*)&req, sizeof(req), 0,
(struct sockaddr*)&addr,
sizeof(addr)) < 0) {
perror("inarpd: sendto(RTM_GETADDR)"
" failed");
exit(1);
}
break;
} else
error("Unknown netlink message type 0x%X\n",
h->nlmsg_type);
h = NLMSG_NEXT(h, len);
}
}
}
开发者ID:ago,项目名称:inarp,代码行数:85,代码来源:inarpd.c
示例8: print_route
int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
{
FILE *fp = (FILE*)arg;
struct rtmsg *r = NLMSG_DATA(n);
int len = n->nlmsg_len;
struct rtattr * tb[RTA_MAX+1];
char abuf[256];
int host_len;
__u32 table;
SPRINT_BUF(b1);
static int hz;
if (n->nlmsg_type != RTM_NEWROUTE && n->nlmsg_type != RTM_DELROUTE) {
fprintf(stderr, "Not a route: %08x %08x %08x\n",
n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags);
return 0;
}
if (filter.flushb && n->nlmsg_type != RTM_NEWROUTE)
return 0;
len -= NLMSG_LENGTH(sizeof(*r));
if (len < 0) {
fprintf(stderr, "BUG: wrong nlmsg len %d\n", len);
return -1;
}
host_len = af_bit_len(r->rtm_family);
parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len);
table = rtm_get_table(r, tb);
if (!filter_nlmsg(n, tb, host_len))
return 0;
if (filter.flushb) {
struct nlmsghdr *fn;
if (NLMSG_ALIGN(filter.flushp) + n->nlmsg_len > filter.flushe) {
if (flush_update())
return -1;
}
fn = (struct nlmsghdr*)(filter.flushb + NLMSG_ALIGN(filter.flushp));
memcpy(fn, n, n->nlmsg_len);
fn->nlmsg_type = RTM_DELROUTE;
fn->nlmsg_flags = NLM_F_REQUEST;
fn->nlmsg_seq = ++rth.seq;
filter.flushp = (((char*)fn) + n->nlmsg_len) - filter.flushb;
filter.flushed++;
if (show_stats < 2)
return 0;
}
if (n->nlmsg_type == RTM_DELROUTE)
fprintf(fp, "Deleted ");
if ((r->rtm_type != RTN_UNICAST || show_details > 0) && !filter.type)
fprintf(fp, "%s ", rtnl_rtntype_n2a(r->rtm_type, b1, sizeof(b1)));
if (tb[RTA_DST]) {
if (r->rtm_dst_len != host_len) {
fprintf(fp, "%s/%u ", rt_addr_n2a(r->rtm_family,
RTA_PAYLOAD(tb[RTA_DST]),
RTA_DATA(tb[RTA_DST]),
abuf, sizeof(abuf)),
r->rtm_dst_len
);
} else {
fprintf(fp, "%s ", format_host(r->rtm_family,
RTA_PAYLOAD(tb[RTA_DST]),
RTA_DATA(tb[RTA_DST]),
abuf, sizeof(abuf))
);
}
} else if (r->rtm_dst_len) {
fprintf(fp, "0/%d ", r->rtm_dst_len);
} else {
fprintf(fp, "default ");
}
if (tb[RTA_SRC]) {
if (r->rtm_src_len != host_len) {
fprintf(fp, "from %s/%u ", rt_addr_n2a(r->rtm_family,
RTA_PAYLOAD(tb[RTA_SRC]),
RTA_DATA(tb[RTA_SRC]),
abuf, sizeof(abuf)),
r->rtm_src_len
);
} else {
fprintf(fp, "from %s ", format_host(r->rtm_family,
RTA_PAYLOAD(tb[RTA_SRC]),
RTA_DATA(tb[RTA_SRC]),
abuf, sizeof(abuf))
);
}
} else if (r->rtm_src_len) {
fprintf(fp, "from 0/%u ", r->rtm_src_len);
}
if (tb[RTA_NEWDST]) {
fprintf(fp, "as to %s ", format_host(r->rtm_family,
RTA_PAYLOAD(tb[RTA_NEWDST]),
RTA_DATA(tb[RTA_NEWDST]),
abuf, sizeof(abuf))
);
}
//.........这里部分代码省略.........
开发者ID:hvoigt,项目名称:iproute2,代码行数:101,代码来源:iproute.c
示例9: igs_cfg_request_send
int
igs_cfg_request_send(igs_cfg_request_t *buffer, int length)
{
struct sockaddr_nl src_addr, dest_addr;
struct nlmsghdr *nlh = NULL;
struct msghdr msg;
struct iovec iov;
int sock_fd, ret;
if ((buffer == NULL) || (length > MAX_DATA_SIZE))
{
fprintf(stderr, "Invalid parameters %p %d\n", buffer, length);
return (FAILURE);
}
/* Create a netlink socket */
sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_IGSC);
if (sock_fd < 0)
{
fprintf(stderr, "Netlink socket create failed\n");
return (FAILURE);
}
/* Associate a local address with the opened socket */
memset(&src_addr, 0, sizeof(struct sockaddr_nl));
src_addr.nl_family = AF_NETLINK;
src_addr.nl_pid = getpid();
src_addr.nl_groups = 0;
bind(sock_fd, (struct sockaddr *)&src_addr, sizeof(src_addr));
/* Fill the destination address, pid of 0 indicates kernel */
memset(&dest_addr, 0, sizeof(struct sockaddr_nl));
dest_addr.nl_family = AF_NETLINK;
dest_addr.nl_pid = 0;
dest_addr.nl_groups = 0;
/* Allocate memory for sending configuration request */
nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_DATA_SIZE));
if (nlh == NULL)
{
fprintf(stderr, "Out of memory allocating cfg buffer\n");
return (FAILURE);
}
/* Fill the netlink message header. The configuration request
* contains netlink header followed by data.
*/
nlh->nlmsg_len = NLMSG_SPACE(MAX_DATA_SIZE);
nlh->nlmsg_pid = getpid();
nlh->nlmsg_flags = 0;
/* Fill the data part */
memcpy(NLMSG_DATA(nlh), buffer, length);
iov.iov_base = (void *)nlh;
iov.iov_len = nlh->nlmsg_len;
memset(&msg, 0, sizeof(struct msghdr));
msg.msg_name = (void *)&dest_addr;
msg.msg_namelen = sizeof(dest_addr);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
/* Send request to kernel module */
ret = sendmsg(sock_fd, &msg, 0);
if (ret < 0)
{
perror("sendmsg:");
free(nlh);
return (ret);
}
/* Wait for the response */
memset(nlh, 0, NLMSG_SPACE(MAX_DATA_SIZE));
ret = recvmsg(sock_fd, &msg, 0);
if (ret < 0)
{
perror("recvmsg:");
free(nlh);
return (ret);
}
/* Copy data to user buffer */
memcpy(buffer, NLMSG_DATA(nlh), length);
free(nlh);
close(sock_fd);
return (ret);
}
开发者ID:ECRS,项目名称:Asus-RT-N16,代码行数:91,代码来源:igsu_linux.c
示例10: handle_spectral_data
/*
* Function : handle_spectral_data
* Description : receive data from spectral driver
* Input params : pointer to ath_ssdinfo
* Return : SUCCESS or FAILURE
*
*/
int handle_spectral_data(ath_ssd_info_t *pinfo)
{
ath_ssd_nlsock_t *pnl = GET_ADDR_OF_NLSOCKINFO(pinfo);
ath_ssd_stats_t *pstats = GET_ADDR_OF_STATS(pinfo);
struct nlmsghdr *nlh = NULL;
struct msghdr msg;
struct iovec iov;
int status = SUCCESS;
int err = SUCCESS;
int sockerr = 0;
static int msg_pace_rate = 0;
SPECTRAL_SAMP_MSG *ss_msg = NULL;
SPECTRAL_SAMP_DATA *ss_data = NULL;
if (!(nlh = (struct nlmsghdr*)malloc(NLMSG_SPACE(sizeof(SPECTRAL_SAMP_MSG))))) {
perror("no memory");
status = FAILURE;
return status;
}
memset(nlh, 0, NLMSG_SPACE(sizeof(SPECTRAL_SAMP_MSG)));
nlh->nlmsg_len = NLMSG_SPACE(sizeof(SPECTRAL_SAMP_MSG));
nlh->nlmsg_pid = getpid();
nlh->nlmsg_flags = 0;
iov.iov_base = (void *)nlh;
iov.iov_len = nlh->nlmsg_len;
memset(&pnl->dst_addr, 0, sizeof(pnl->dst_addr));
pnl->dst_addr.nl_family = PF_NETLINK;
pnl->dst_addr.nl_pid = 0;
pnl->dst_addr.nl_groups = 1;
memset(&msg, 0, sizeof(msg));
msg.msg_name = (void*)&pnl->dst_addr;
msg.msg_namelen = sizeof(pnl->dst_addr);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
/* receive spectral data from spectral driver */
sockerr = recvmsg(pnl->spectral_fd, &msg, MSG_WAITALL);
ss_msg = (SPECTRAL_SAMP_MSG*)NLMSG_DATA(nlh);
ss_data = &ss_msg->samp_data;
if (sockerr >= 0) {
if (nlh->nlmsg_len) {
#ifdef USE_OLD_CLASSIFIER
process_spectral_msg(pinfo, ss_msg);
#else
new_process_spectral_msg(pinfo, ss_msg);
#endif /* USE_OLD_CLASSIFIER */
msg_pace_rate++;
if (msg_pace_rate == MSG_PACE_THRESHOLD) {
send_to_client(pinfo, ss_msg, sizeof(SPECTRAL_SAMP_MSG));
pstats->ch[pinfo->current_channel].sent_msg++;
msg_pace_rate = 0;
}
}
if (err == -1) {
perror("send err");
status = FAILURE;
}
} else if ((sockerr < 0) && (sockerr != EINTR)) {
//perror("recvmsg");
}
/* free the resource */
free(nlh);
return status;
}
开发者ID:KHATEEBNSIT,项目名称:AP,代码行数:85,代码来源:ath_ssd.c
示例11: filter_nlmsg
static int filter_nlmsg(struct nlmsghdr *n, struct rtattr **tb, int host_len)
{
struct rtmsg *r = NLMSG_DATA(n);
inet_prefix dst;
inet_prefix src;
inet_prefix via;
inet_prefix prefsrc;
__u32 table;
static int ip6_multiple_tables;
table = rtm_get_table(r, tb);
if (preferred_family != AF_UNSPEC && r->rtm_family != preferred_family)
return 0;
if (r->rtm_family == AF_INET6 && table != RT_TABLE_MAIN)
ip6_multiple_tables = 1;
if (filter.cloned == !(r->rtm_flags&RTM_F_CLONED))
return 0;
if (r->rtm_family == AF_INET6 && !ip6_multiple_tables) {
if (filter.tb) {
if (filter.tb == RT_TABLE_LOCAL) {
if (r->rtm_type != RTN_LOCAL)
return 0;
} else if (filter.tb == RT_TABLE_MAIN) {
if (r->rtm_type == RTN_LOCAL)
return 0;
} else {
return 0;
}
}
} else {
if (filter.tb > 0 && filter.tb != table)
return 0;
}
if ((filter.protocol^r->rtm_protocol)&filter.protocolmask)
return 0;
if ((filter.scope^r->rtm_scope)&filter.scopemask)
return 0;
if ((filter.type^r->rtm_type)&filter.typemask)
return 0;
if ((filter.tos^r->rtm_tos)&filter.tosmask)
return 0;
if (filter.rdst.family &&
(r->rtm_family != filter.rdst.family || filter.rdst.bitlen > r->rtm_dst_len))
return 0;
if (filter.mdst.family &&
(r->rtm_family != filter.mdst.family ||
(filter.mdst.bitlen >= 0 && filter.mdst.bitlen < r->rtm_dst_len)))
return 0;
if (filter.rsrc.family &&
(r->rtm_family != filter.rsrc.family || filter.rsrc.bitlen > r->rtm_src_len))
return 0;
if (filter.msrc.family &&
(r->rtm_family != filter.msrc.family ||
(filter.msrc.bitlen >= 0 && filter.msrc.bitlen < r->rtm_src_len)))
return 0;
if (filter.rvia.family) {
int family = r->rtm_family;
if (tb[RTA_VIA]) {
struct rtvia *via = RTA_DATA(tb[RTA_VIA]);
family = via->rtvia_family;
}
if (family != filter.rvia.family)
return 0;
}
if (filter.rprefsrc.family && r->rtm_family != filter.rprefsrc.family)
return 0;
memset(&dst, 0, sizeof(dst));
dst.family = r->rtm_family;
if (tb[RTA_DST])
memcpy(&dst.data, RTA_DATA(tb[RTA_DST]), (r->rtm_dst_len+7)/8);
if (filter.rsrc.family || filter.msrc.family) {
memset(&src, 0, sizeof(src));
src.family = r->rtm_family;
if (tb[RTA_SRC])
memcpy(&src.data, RTA_DATA(tb[RTA_SRC]), (r->rtm_src_len+7)/8);
}
if (filter.rvia.bitlen>0) {
memset(&via, 0, sizeof(via));
via.family = r->rtm_family;
if (tb[RTA_GATEWAY])
memcpy(&via.data, RTA_DATA(tb[RTA_GATEWAY]), host_len/8);
if (tb[RTA_VIA]) {
size_t len = RTA_PAYLOAD(tb[RTA_VIA]) - 2;
struct rtvia *rtvia = RTA_DATA(tb[RTA_VIA]);
via.family = rtvia->rtvia_family;
memcpy(&via.data, rtvia->rtvia_addr, len);
}
}
if (filter.rprefsrc.bitlen>0) {
memset(&prefsrc, 0, sizeof(prefsrc));
prefsrc.family = r->rtm_family;
if (tb[RTA_PREFSRC])
memcpy(&prefsrc.data, RTA_DATA(tb[RTA_PREFSRC]), host_len/8);
}
//.........这里部分代码省略.........
开发者ID:hvoigt,项目名称:iproute2,代码行数:101,代码来源:iproute.c
示例12: link_netlink
static int
link_netlink(struct dhcpcd_ctx *ctx, struct interface *ifp,
struct nlmsghdr *nlm)
{
int r;
size_t len;
struct rtattr *rta, *hwaddr;
struct ifinfomsg *ifi;
char ifn[IF_NAMESIZE + 1];
r = link_route(ctx, ifp, nlm);
if (r != 0)
return r;
r = link_addr(ctx, ifp, nlm);
if (r != 0)
return r;
#ifdef INET6
r = link_neigh(ctx, ifp, nlm);
if (r != 0)
return r;
#endif
if (nlm->nlmsg_type != RTM_NEWLINK && nlm->nlmsg_type != RTM_DELLINK)
return 0;
len = nlm->nlmsg_len - sizeof(*nlm);
if ((size_t)len < sizeof(*ifi)) {
errno = EBADMSG;
return -1;
}
ifi = NLMSG_DATA(nlm);
if (ifi->ifi_flags & IFF_LOOPBACK)
return 0;
rta = (void *)((char *)ifi + NLMSG_ALIGN(sizeof(*ifi)));
len = NLMSG_PAYLOAD(nlm, sizeof(*ifi));
*ifn = '\0';
hwaddr = NULL;
while (RTA_OK(rta, len)) {
switch (rta->rta_type) {
case IFLA_WIRELESS:
/* Ignore wireless messages */
if (nlm->nlmsg_type == RTM_NEWLINK &&
ifi->ifi_change == 0)
return 0;
break;
case IFLA_IFNAME:
strlcpy(ifn, (char *)RTA_DATA(rta), sizeof(ifn));
break;
case IFLA_ADDRESS:
hwaddr = rta;
break;
}
rta = RTA_NEXT(rta, len);
}
if (nlm->nlmsg_type == RTM_DELLINK) {
/* If are listening to a dev manager, let that remove
* the interface rather than the kernel. */
if (dev_listening(ctx) < 1)
dhcpcd_handleinterface(ctx, -1, ifn);
return 0;
}
/* Virtual interfaces may not get a valid hardware address
* at this point.
* To trigger a valid hardware address pickup we need to pretend
* that that don't exist until they have one. */
if (ifi->ifi_flags & IFF_MASTER && !hwaddr) {
dhcpcd_handleinterface(ctx, -1, ifn);
return 0;
}
/* Check for a new interface */
ifp = if_findindex(ctx->ifaces, (unsigned int)ifi->ifi_index);
if (ifp == NULL) {
/* If are listening to a dev manager, let that announce
* the interface rather than the kernel. */
if (dev_listening(ctx) < 1)
dhcpcd_handleinterface(ctx, 1, ifn);
return 0;
}
/* Handle interface being renamed */
if (strcmp(ifp->name, ifn) != 0) {
dhcpcd_handleinterface(ctx, -1, ifn);
dhcpcd_handleinterface(ctx, 1, ifn);
return 0;
}
/* Re-read hardware address and friends */
if (!(ifi->ifi_flags & IFF_UP) && hwaddr) {
uint8_t l;
l = l2addr_len(ifi->ifi_type);
if (hwaddr->rta_len == RTA_LENGTH(l))
dhcpcd_handlehwaddr(ctx, ifn, RTA_DATA(hwaddr), l);
}
dhcpcd_handlecarrier(ctx,
ifi->ifi_flags & IFF_RUNNING ? LINK_UP : LINK_DOWN,
//.........这里部分代码省略.........
开发者ID:jaredmcneill,项目名称:netbsd-src,代码行数:101,代码来源:if-linux.c
示例13: link_addr
static int
link_addr(struct dhcpcd_ctx *ctx, struct interface *ifp, struct nlmsghdr *nlm)
{
size_t len;
struct rtattr *rta;
struct ifaddrmsg *ifa;
struct priv *priv;
#ifdef INET
struct in_addr addr, net, brd;
#endif
#ifdef INET6
struct in6_addr addr6;
#endif
if (nlm->nlmsg_type != RTM_DELADDR && nlm->nlmsg_type != RTM_NEWADDR)
return 0;
len = nlm->nlmsg_len - sizeof(*nlm);
if (len < sizeof(*ifa)) {
errno = EBADMSG;
return -1;
}
/* Ignore messages we sent. */
priv = (struct priv*)ctx->priv;
if (nlm->nlmsg_pid == priv->route_pid)
return 0;
ifa = NLMSG_DATA(nlm);
if ((ifp = if_findindex(ctx->ifaces, ifa->ifa_index)) == NULL) {
/* We don't know about the interface the address is for
* so it's not really an error */
return 1;
}
rta = (struct rtattr *)IFA_RTA(ifa);
len = NLMSG_PAYLOAD(nlm, sizeof(*ifa));
switch (ifa->ifa_family) {
#ifdef INET
case AF_INET:
addr.s_addr = brd.s_addr = INADDR_ANY;
inet_cidrtoaddr(ifa->ifa_prefixlen, &net);
while (RTA_OK(rta, len)) {
switch (rta->rta_type) {
case IFA_ADDRESS:
if (ifp->flags & IFF_POINTOPOINT) {
memcpy(&brd.s_addr, RTA_DATA(rta),
sizeof(brd.s_addr));
}
break;
case IFA_BROADCAST:
memcpy(&brd.s_addr, RTA_DATA(rta),
sizeof(brd.s_addr));
break;
case IFA_LOCAL:
memcpy(&addr.s_addr, RTA_DATA(rta),
sizeof(addr.s_addr));
break;
}
rta = RTA_NEXT(rta, len);
}
ipv4_handleifa(ctx, nlm->nlmsg_type, NULL, ifp->name,
&addr, &net, &brd, ifa->ifa_flags, (pid_t)nlm->nlmsg_pid);
break;
#endif
#ifdef INET6
case AF_INET6:
memset(&addr6, 0, sizeof(addr6));
while (RTA_OK(rta, len)) {
switch (rta->rta_type) {
case IFA_ADDRESS:
memcpy(&addr6.s6_addr, RTA_DATA(rta),
sizeof(addr6.s6_addr));
break;
}
rta = RTA_NEXT(rta, len);
}
ipv6_handleifa(ctx, nlm->nlmsg_type, NULL, ifp->name,
&addr6, ifa->ifa_prefixlen, ifa->ifa_flags,
(pid_t)nlm->nlmsg_pid);
break;
#endif
}
return 0;
}
开发者ID:jaredmcneill,项目名称:netbsd-src,代码行数:84,代码来源:if-linux.c
示例14: if_copyrt
static int
if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, struct nlmsghdr *nlm)
{
size_t len;
struct rtmsg *rtm;
struct rtattr *rta;
unsigned int ifindex;
struct sockaddr *sa;
len = nlm->nlmsg_len - sizeof(*nlm);
if (len < sizeof(*rtm)) {
errno = EBADMSG;
return -1;
}
rtm = (struct rtmsg *)NLMSG_DATA(nlm);
if (rtm->rtm_table != RT_TABLE_MAIN)
return -1;
memset(rt, 0, sizeof(*rt));
if (rtm->rtm_type == RTN_UNREACHABLE)
rt->rt_flags |= RTF_REJECT;
rta = (struct rtattr *)RTM_RTA(rtm);
len = RTM_PAYLOAD(nlm);
while (RTA_OK(rta, len)) {
sa = NULL;
switch (rta->rta_type) {
case RTA_DST:
sa = &rt->rt_dest;
break;
case RTA_GATEWAY:
sa = &rt->rt_gateway;
break;
case RTA_PREFSRC:
sa = &rt->rt_ifa;
break;
case RTA_OIF:
ifindex = *(unsigned int *)RTA_DATA(rta);
rt->rt_ifp = if_findindex(ctx->ifaces, ifindex);
break;
case RTA_PRIORITY:
rt->rt_metric = *(unsigned int *)RTA_DATA(rta);
break;
case RTA_METRICS:
{
struct rtattr *r2;
size_t l2;
l2 = rta->rta_len;
r2 = (struct rtattr *)RTA_DATA(rta);
while (RTA_OK(r2, l2)) {
switch (r2->rta_type) {
case RTAX_MTU:
rt->rt_mtu = *(unsigned int *)RTA_DATA(r2);
break;
}
r2 = RTA_NEXT(r2, l2);
}
break;
}
}
if (sa != NULL) {
socklen_t salen;
sa->sa_family = rtm->rtm_family;
salen = sa_addrlen(sa);
memcpy((char *)sa + sa_addroffset(sa), RTA_DATA(rta),
MIN(salen, RTA_PAYLOAD(rta)));
}
rta = RTA_NEXT(rta, len);
}
/* If no RTA_DST set the unspecified address for the family. */
if (rt->rt_dest.sa_family == AF_UNSPEC)
rt->rt_dest.sa_family = rtm->rtm_family;
rt->rt_netmask.sa_family = rtm->rtm_family;
sa_fromprefix(&rt->rt_netmask, rtm->rtm_dst_len);
if (sa_is_allones(&rt->rt_netmask))
rt->rt_flags |= RTF_HOST;
#if 0
if (rt->rtp_ifp == NULL && rt->src.s_addr != INADDR_ANY) {
struct ipv4_addr *ap;
/* For some reason the default route comes back with the
* loopback interface in RTA_OIF? Lets find it by
* preferred source address */
if ((ap = ipv4_findaddr(ctx, &rt->src)))
rt->iface = ap->iface;
}
#endif
if (rt->rt_ifp == NULL) {
errno = ESRCH;
return -1;
}
return 0;
//.........这里部分代码省略.........
开发者ID:jaredmcneill,项目名称:netbsd-src,代码行数:101,代码来源:if-linux.c
示例15: process_msg
static int process_msg(const struct sockaddr_nl *who, struct nlmsghdr *n,
void *arg)
{
FILE *fp = (FILE *) arg;
struct genlmsghdr *ghdr;
struct rtattr *attrs[TCP_METRICS_ATTR_MAX + 1], *a;
int len = n->nlmsg_len;
char abuf[256];
inet_prefix daddr, saddr;
int family, i, atype, stype, dlen = 0, slen = 0;
if (n->nlmsg_type != genl_family)
return -1;
len -= NLMSG_LENGTH(GENL_HDRLEN);
if (len < 0)
return -1;
ghdr = NLMSG_DATA(n);
if (ghdr->cmd != TCP_METRICS_CMD_GET)
return 0;
parse_rtattr(attrs, TCP_METRICS_ATTR_MAX, (void *) ghdr + GENL_HDRLEN,
len);
a = attrs[TCP_METRICS_ATTR_ADDR_IPV4];
if (a) {
if (f.daddr.family && f.daddr.family != AF_INET)
return 0;
memcpy(&daddr.data, RTA_DATA(a), 4);
daddr.bytelen = 4;
family = AF_INET;
atype = TCP_METRICS_ATTR_ADDR_IPV4;
dlen = RTA_PAYLOAD(a);
} else {
a = attrs[TCP_METRICS_ATTR_ADDR_IPV6];
if (a) {
if (f.daddr.family && f.daddr.family != AF_INET6)
return 0;
memcpy(&daddr.data, RTA_DATA(a), 16);
daddr.bytelen = 16;
family = AF_INET6;
atype = TCP_METRICS_ATTR_ADDR_IPV6;
dlen = RTA_PAYLOAD(a);
} else
return 0;
}
a = attrs[TCP_METRICS_ATTR_SADDR_IPV4];
if (a) {
if (f.saddr.family && f.saddr.family != AF_INET)
return 0;
memcpy(&saddr.data, RTA_DATA(a), 4);
saddr.bytelen = 4;
stype = TCP_METRICS_ATTR_SADDR_IPV4;
slen = RTA_PAYLOAD(a);
} else {
a = attrs[TCP_METRICS_ATTR_SADDR_IPV6];
if (a) {
if (f.saddr.family && f.saddr.family != AF_INET6)
return 0;
memcpy(&saddr.data, RTA_DATA(a), 16);
saddr.bytelen = 16;
stype = TCP_METRICS_ATTR_SADDR_IPV6;
slen = RTA_PAYLOAD(a);
}
}
if (f.daddr.family && f.daddr.bitlen >= 0 &&
inet_addr_match(&daddr, &f.daddr, f.daddr.bitlen))
return 0;
/* Only check for the source-address if the kernel supports it,
* meaning slen != 0.
*/
if (slen && f.saddr.family && f.saddr.bitlen >= 0 &&
inet_addr_match(&saddr, &f.saddr, f.saddr.bitlen))
return 0;
if (f.flushb) {
struct nlmsghdr *fn;
TCPM_REQUEST(req2, 128, TCP_METRICS_CMD_DEL, NLM_F_REQUEST);
addattr_l(&req2.n, sizeof(req2), atype, &daddr.data,
daddr.bytelen);
if (slen)
addattr_l(&req2.n, sizeof(req2), stype, &saddr.data,
saddr.bytelen);
if (NLMSG_ALIGN(f.flushp) + req2.n.nlmsg_len > f.flushe) {
if (flush_update())
return -1;
}
fn = (struct nlmsghdr *) (f.flushb + NLMSG_ALIGN(f.flushp));
memcpy(fn, &req2.n, req2.n.nlmsg_len);
fn->nlmsg_seq = ++grth.seq;
f.flushp = (((char *) fn) + req2.n.nlmsg_len) - f.flushb;
f.flushed++;
if (show_stats < 2)
return 0;
}
//.........这里部分代码省略.........
开发者ID:AllardJ,项目名称:Tomato,代码行数:101,代码来源:tcp_metrics.c
示例16: rtnl_dump_filter
int rtnl_dump_filter(struct rtnl_handle *rth,
int (*filter)(struct sockaddr_nl *, struct nlmsghdr *n, void *),
void *arg1,
int (*junk)(struct sockaddr_nl *,struct nlmsghdr *n, void *),
void *arg2)
{
char buf[8192];
struct sockaddr_nl nladdr;
struct iovec iov = { buf, sizeof(buf) };
while (1) {
int status;
struct nlmsghdr *h;
struct msghdr msg = {
(void*)&nladdr, sizeof(nladdr),
&iov, 1,
NULL, 0,
0
};
status = recvmsg(rth->fd, &msg, 0);
if (status < 0) {
if (errno == EINTR)
continue;
perror("OVERRUN");
continue;
}
if (status == 0) {
fprintf(stderr, "EOF on netlink\n");
return -1;
}
if (msg.msg_namelen != sizeof(nladdr)) {
fprintf(stderr, "sender address length == %d\n", msg.msg_namelen);
exit(1);
}
h = (struct nlmsghdr*)buf;
while (NLMSG_OK(h, status)) {
int err;
if (h->nlmsg_pid != rth->local.nl_pid ||
h->nlmsg_seq != rth->dump) {
if (junk) {
err = junk(&nladdr, h, arg2);
if (err < 0)
return err;
}
goto skip_it;
}
if (h->nlmsg_type == NLMSG_DONE)
return 0;
if (h->nlmsg_type == NLMSG_ERROR) {
struct nlmsgerr *err = (struct nlmsgerr*)NLMSG_DATA(h);
if (h->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr))) {
fprintf(stderr, "ERROR truncated\n");
} else {
errno = -err->error;
perror("RTNETLINK answers");
}
return -1;
}
err = filter(&nladdr, h, arg1);
if (err < 0)
return err;
skip_it:
h = NLMSG_NEXT(h, status);
}
if (msg.msg_flags & MSG_TRUNC) {
fprintf(stderr, "Message truncated\n");
continue;
}
if (status) {
fprintf(stderr, "!!!Remnant of size %d\n", status);
exit(1);
}
}
}
开发者ID:aYosukeAkatsuka,项目名称:edimax-br-6528n,代码行数:81,代码来源:libnetlink.c
示例17: UNUSED_PARAM
//.........这里部分代码省略.........
#ifdef DEBUG_NETWORK
reconnDebugPrint("%s: oldLinkState = %d theValue = %d messageSent = %d\n", __FUNCTION__, oldLinkState, theValue, messageSent);
#endif
if((oldLinkState != theValue) || (messageSent == FALSE))
{
oldLinkState = theValue;
/*
* Send message to the master client informing it of the link transition.
*/
memset(theResponsePktPtr, 0, sizeof(theResponsePkt
|
请发表评论