how to correctly distinguish broadcast udp packets vs unicast (socket, pcap or bpf)?

Budnev Vladimir vladimir.budnev at gmail.com
Fri Jul 6 11:53:34 UTC 2012


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:)



More information about the freebsd-questions mailing list