Date: Fri, 06 Jul 2012 15:53:28 +0400 From: Budnev Vladimir <vladimir.budnev@gmail.com> To: Nikolay Denev <zndenev@gmail.com>, freebsd-questions@freebsd.org Subject: Re: how to correctly distinguish broadcast udp packets vs unicast (socket, pcap or bpf)? Message-ID: <4FF6D1B8.3080108@gmail.com> In-Reply-To: <4FF46498.2070901@gmail.com> References: <4FF45C81.3030907@gmail.com> <07EA7CC9-19CF-4EFE-A9E2-6A94DCA3F1AC@gmail.com> <4FF46498.2070901@gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Tnx! Worked like a charm, with skipped init and other checks, just the control point parts: <...> int optval=1; setsockopt(root_socket, IPPROTO_IP, IP_RECVDSTADDR, &optval, sizeof(optval)) <...> char t[200]; unsigned int sender_len; struct msghdr msg; struct iovec iov; struct sockaddr_in from; sender_len = sizeof(from); msg.msg_name = &from; msg.msg_namelen = sender_len; msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_iov->iov_base = &u; msg.msg_iov->iov_len = sizeof(packet_container); msg.msg_control = t; msg.msg_controllen = sizeof(t); msg.msg_flags = 0; <...> result = recvmsg(root_socket,&msg,0); <...> struct cmsghdr *cmsg=NULL; uint32_t* dst_ip=NULL; for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg,cmsg)) { if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_RECVDSTADDR) { dst_ip=(uint32_t*)CMSG_DATA(cmsg); break; } } <...> And at that point we have destination ip in dst_ip var:)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4FF6D1B8.3080108>