diff options
author | Ulrich Dangel <uli@spamt.net> | 2011-03-28 18:59:35 +0200 |
---|---|---|
committer | maximilian attems <max@stro.at> | 2011-03-29 14:52:33 +0200 |
commit | 6df362216a2e5beb4f29feafeabc630034a76914 (patch) | |
tree | 9a726ff5616e2778ad4c07cf65ba1ec968d782d8 | |
parent | 92823d1a78a8a6f3e7a7cc36f949ca6379c4e77c (diff) | |
download | klibc-6df362216a2e5beb4f29feafeabc630034a76914.tar.gz |
[klibc] ipconfig: Remove packet_peek and adjusted packet_rcv as well as process_receive_event.
packet_peek is not really necessary as it does basically nothing besides
testing if a packet is availabe. This is already done in packet_recv.
Adjusted do_pkt_recv to only use process_receive_event.
packet_recv was modified to only receive and use packets from the specified
interface.
process_receive_event was adjusted to handle discared/ignored packages from
the corresponding recv functions. As packet_recv could return 0 for
ignored packets process_receive_event handled them as processed/handled
packets resulting in an endless loop if new (non valid dhcp/bootp) packets
were received.
As a side effect ignored packets are now shown automatically in the debug
output.
Signed-off-by: Ulrich Dangel <uli@spamt.net>
Signed-off-by: maximilian attems <max@stro.at>
-rw-r--r-- | usr/kinit/ipconfig/main.c | 24 | ||||
-rw-r--r-- | usr/kinit/ipconfig/packet.c | 43 | ||||
-rw-r--r-- | usr/kinit/ipconfig/packet.h | 1 |
3 files changed, 20 insertions, 48 deletions
diff --git a/usr/kinit/ipconfig/main.c b/usr/kinit/ipconfig/main.c index 1e48083e21ff7..43b6637908fdc 100644 --- a/usr/kinit/ipconfig/main.c +++ b/usr/kinit/ipconfig/main.c @@ -170,7 +170,7 @@ static void complete_device(struct netdev *dev) /* * Returns: - * 0 = Not handled, the packet is still in the queue + * 0 = Not handled, try again later * 1 = Handled */ static int process_receive_event(struct state *s, time_t now) @@ -187,6 +187,9 @@ static int process_receive_event(struct state *s, time_t now) case -1: s->state = DEVST_ERROR; break; + case 0: + handled = 0; + break; case 1: s->state = DEVST_COMPLETE; dprintf("\n bootp reply\n"); @@ -200,6 +203,9 @@ static int process_receive_event(struct state *s, time_t now) case -1: s->state = DEVST_ERROR; break; + case 0: + handled = 0; + break; case DHCPOFFER: /* Offer received */ s->state = DEVST_DHCPREQ; dhcp_send_request(s->dev); @@ -213,6 +219,9 @@ static int process_receive_event(struct state *s, time_t now) case -1: /* error */ s->state = DEVST_ERROR; break; + case 0: + handled = 0; + break; case DHCPACK: /* ACK received */ s->state = DEVST_COMPLETE; break; @@ -299,23 +308,16 @@ struct netdev *ifaces; /* * Returns: - * 0 = Error, packet not received or discarded + * 0 = No dhcp/bootp packet was received * 1 = A packet was received and handled */ static int do_pkt_recv(int pkt_fd, time_t now) { - int ret = 0; + int ret; struct state *s; for (s = slist; s; s = s->next) { - ret = packet_peek(s->dev); - if (ret) { - ret = process_receive_event(s, now); - if (ret == 0) { - packet_discard(s->dev); - } - break; - } + ret |= process_receive_event(s, now); } return ret; } diff --git a/usr/kinit/ipconfig/packet.c b/usr/kinit/ipconfig/packet.c index 993a2fa1bb127..ea5a25d23a1ea 100644 --- a/usr/kinit/ipconfig/packet.c +++ b/usr/kinit/ipconfig/packet.c @@ -166,41 +166,6 @@ int packet_send(struct netdev *dev, struct iovec *iov, int iov_len) return sendmsg(pkt_fd, &msg, 0); } -/* - * Fetches a bootp packet from specified device, but doesn't remove it. - * Returns: - * 0 = Error - * >0 = A packet of size "ret" is available for interface ifindex - */ -int packet_peek(struct netdev *dev) -{ - struct sockaddr_ll sll; - struct iphdr iph; - int ret, sllen = sizeof(struct sockaddr_ll); - - sll.sll_ifindex = dev->ifindex; - /* - * 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; - - - return ret; - -discard_pkt: - packet_discard(dev); - return 0; -} - void packet_discard(struct netdev *dev) { struct iphdr iph; @@ -235,9 +200,15 @@ int packet_recv(struct netdev* dev, struct iovec *iov, int iov_len) .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 -1; diff --git a/usr/kinit/ipconfig/packet.h b/usr/kinit/ipconfig/packet.h index 524f3937b172f..f6cef5210958a 100644 --- a/usr/kinit/ipconfig/packet.h +++ b/usr/kinit/ipconfig/packet.h @@ -6,7 +6,6 @@ struct iovec; int packet_open(void); void packet_close(void); int packet_send(struct netdev *dev, struct iovec *iov, int iov_len); -int packet_peek(struct netdev *dev); void packet_discard(struct netdev *dev); int packet_recv(struct netdev *dev, struct iovec *iov, int iov_len); |