aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlrich Dangel <uli@spamt.net>2011-03-28 18:59:35 +0200
committermaximilian attems <max@stro.at>2011-03-29 14:52:33 +0200
commit6df362216a2e5beb4f29feafeabc630034a76914 (patch)
tree9a726ff5616e2778ad4c07cf65ba1ec968d782d8
parent92823d1a78a8a6f3e7a7cc36f949ca6379c4e77c (diff)
downloadklibc-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.c24
-rw-r--r--usr/kinit/ipconfig/packet.c43
-rw-r--r--usr/kinit/ipconfig/packet.h1
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);