]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm tools: Add helper to tell if a UDP package is a DHCP package
authorAsias He <asias.hejun@gmail.com>
Sun, 17 Jul 2011 08:56:51 +0000 (16:56 +0800)
committerPekka Enberg <penberg@kernel.org>
Mon, 18 Jul 2011 10:09:56 +0000 (13:09 +0300)
This patch checks:

   - sport and dport

   - magic cookie

to detemine whether a UDP package is a DHCP package.

Signed-off-by: Asias He <asias.hejun@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
tools/kvm/Makefile
tools/kvm/include/kvm/uip.h
tools/kvm/net/uip/dhcp.c [new file with mode: 0644]

index 5d0437740fe9466a1ba175c58d38b6acd0bd6ba3..b5c55169f59be973726d8950df5d1687280b9620 100644 (file)
@@ -61,6 +61,7 @@ OBJS  += net/uip/tcp.o
 OBJS   += net/uip/udp.o
 OBJS   += net/uip/buf.o
 OBJS   += net/uip/csum.o
+OBJS   += net/uip/dhcp.o
 OBJS   += kvm-cmd.o
 OBJS   += mptable.o
 OBJS   += rbtree.o
index c414267bbab7195ea4c0e07e4625ff362e8f6ff1..7c84deab8fc8f0ed7573079b019def2abe2591ed 100644 (file)
 #define UIP_TCP_FLAG_URG       32
 
 #define UIP_DHCP_VENDOR_SPECIFIC_LEN   312
+#define UIP_DHCP_PORT_SERVER           67
+#define UIP_DHCP_PORT_CLIENT           68
 #define UIP_DHCP_MACPAD_LEN            10
 #define UIP_DHCP_HOSTNAME_LEN          64
 #define UIP_DHCP_FILENAME_LEN          128
+#define UIP_DHCP_MAGIC_COOKIE          0x63825363
 #define UIP_DHCP_MAGIC_COOKIE_LEN      4
 #define UIP_DHCP_OPTION_LEN            (UIP_DHCP_VENDOR_SPECIFIC_LEN - UIP_DHCP_MAGIC_COOKIE_LEN)
 /*
@@ -317,4 +320,5 @@ struct uip_buf *uip_buf_get_free(struct uip_info *info);
 struct uip_buf *uip_buf_clone(struct uip_tx_arg *arg);
 
 int uip_udp_make_pkg(struct uip_info *info, struct uip_udp_socket *sk, struct uip_buf *buf, u8 *payload, int payload_len);
+bool uip_udp_is_dhcp(struct uip_udp *udp);
 #endif /* KVM__UIP_H */
diff --git a/tools/kvm/net/uip/dhcp.c b/tools/kvm/net/uip/dhcp.c
new file mode 100644 (file)
index 0000000..af0407f
--- /dev/null
@@ -0,0 +1,17 @@
+#include "kvm/uip.h"
+
+bool uip_udp_is_dhcp(struct uip_udp *udp)
+{
+       struct uip_dhcp *dhcp;
+
+       if (ntohs(udp->sport) != UIP_DHCP_PORT_CLIENT ||
+           ntohs(udp->dport) != UIP_DHCP_PORT_SERVER)
+               return false;
+
+       dhcp = (struct uip_dhcp *)udp;
+
+       if (ntohl(dhcp->magic_cookie) != UIP_DHCP_MAGIC_COOKIE)
+               return false;
+
+       return true;
+}