--- trunk/mkinitrd-magellan/klibc/usr/kinit/ipconfig/packet.c 2010/08/18 21:11:40 1122 +++ trunk/mkinitrd-magellan/klibc/usr/kinit/ipconfig/packet.c 2011/05/27 15:12:11 1297 @@ -166,47 +166,14 @@ return sendmsg(pkt_fd, &msg, 0); } -/* - * Fetches a bootp packet, but doesn't remove it. - * Returns: - * 0 = Error - * >0 = A packet of size "ret" is available for interface ifindex - */ -int packet_peek(int *ifindex) -{ - struct sockaddr_ll sll; - struct iphdr iph; - int ret, sllen = sizeof(struct sockaddr_ll); - - /* - * Peek at the IP header. - */ - ret = recvfrom(pkt_fd, &iph, sizeof(struct iphdr), - MSG_PEEK, (struct sockaddr *)&sll, &sllen); - if (ret == -1) - return 0; - - if (sll.sll_family != AF_PACKET) - goto discard_pkt; - - if (iph.ihl < 5 || iph.version != IPVERSION) - goto discard_pkt; - - *ifindex = sll.sll_ifindex; - - return ret; - -discard_pkt: - packet_discard(); - return 0; -} - -void packet_discard(void) +void packet_discard(struct netdev *dev) { struct iphdr iph; struct sockaddr_ll sll; socklen_t sllen = sizeof(sll); + sll.sll_ifindex = dev->ifindex; + recvfrom(pkt_fd, &iph, sizeof(iph), 0, (struct sockaddr *)&sll, &sllen); } @@ -215,10 +182,11 @@ * Receive a bootp packet. The options are listed in iov[1...iov_len]. * iov[0] must point to the bootp packet header. * Returns: - * 0 = Error, try again later + * -1 = Error, try again later +* 0 = Discarded packet (non-DHCP/BOOTP traffic) * >0 = Size of packet */ -int packet_recv(struct iovec *iov, int iov_len) +int packet_recv(struct netdev* dev, struct iovec *iov, int iov_len) { struct iphdr *ip, iph; struct udphdr *udp; @@ -232,11 +200,17 @@ .msg_flags = 0 }; int ret, iphl; + struct sockaddr_ll sll; + socklen_t sllen = sizeof(sll); + + sll.sll_ifindex = dev->ifindex; + msg.msg_name = &sll; + msg.msg_namelen = sllen; ret = recvfrom(pkt_fd, &iph, sizeof(struct iphdr), - MSG_PEEK, NULL, NULL); + MSG_PEEK, (struct sockaddr *)&sll, &sllen); if (ret == -1) - return 0; + return -1; if (iph.ihl < 5 || iph.version != IPVERSION) goto discard_pkt; @@ -292,6 +266,6 @@ discard_pkt: dprintf("discarded\n"); - packet_discard(); + packet_discard(dev); return 0; }