static void event_recv_skb(struct sk_buff *skb) #endif { int err; struct nlmsghdr *nlh; u32 rlen; while (skb->len >= NLMSG_SPACE(0)) { nlh = (struct nlmsghdr *)skb->data; if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len) goto out; rlen = NLMSG_ALIGN(nlh->nlmsg_len); if (rlen > skb->len) rlen = skb->len; err = event_recv_msg(skb, nlh); if (err) netlink_ack(skb, nlh, -err); else if (nlh->nlmsg_flags & NLM_F_ACK) netlink_ack(skb, nlh, 0); skb_pull(skb, rlen); } out: #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)) return 0; #else return; #endif }
static void event_recv_skb(struct sk_buff *skb) { int err; struct nlmsghdr *nlh; u32 rlen; while (skb->len >= NLMSG_SPACE(0)) { nlh = (struct nlmsghdr *)skb->data; if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len) break; rlen = NLMSG_ALIGN(nlh->nlmsg_len); if (rlen > skb->len) rlen = skb->len; if ((err = event_recv_msg(skb, nlh))) { netlink_ack(skb, nlh, -err); } else if (nlh->nlmsg_flags & NLM_F_ACK) netlink_ack(skb, nlh, 0); skb_pull(skb, rlen); } }
static ssize_t tgt_write(struct file *file, const char __user * buffer, size_t count, loff_t * ppos) { struct tgt_event *ev; struct tgt_ring *ring = &rx_ring; while (1) { ev = tgt_head_event(ring, ring->tr_idx); /* do we need this? */ flush_dcache_page(virt_to_page(ev)); if (!ev->hdr.status) break; tgt_ring_idx_inc(ring); event_recv_msg(ev); ev->hdr.status = 0; }; return count; }