From: Martin Xu <[email protected]>
---
gdhcp/client.c | 63 ------------------------------------------------
gdhcp/common.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
gdhcp/common.h | 6 ++++
3 files changed, 79 insertions(+), 63 deletions(-)
diff --git a/gdhcp/client.c b/gdhcp/client.c
index b9a0e7f..60aba00 100644
--- a/gdhcp/client.c
+++ b/gdhcp/client.c
@@ -268,70 +268,7 @@ static int send_release(GDHCPClient *dhcp_client,
server, SERVER_PORT);
}
-static gboolean interface_is_up(int index)
-{
- int sk, err;
- struct ifreq ifr;
- gboolean ret = FALSE;
-
- sk = socket(PF_INET, SOCK_DGRAM, 0);
- if (sk < 0) {
- perror("Open socket error");
- return FALSE;
- }
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_ifindex = index;
-
- err = ioctl(sk, SIOCGIFNAME, &ifr);
- if (err < 0) {
- perror("Get interface name error");
- goto done;
- }
-
- err = ioctl(sk, SIOCGIFFLAGS, &ifr);
- if (err < 0) {
- perror("Get interface flags error");
- goto done;
- }
-
- if (ifr.ifr_flags & IFF_UP)
- ret = TRUE;
-
-done:
- close(sk);
-
- return ret;
-}
-
-static char *get_interface_name(int index)
-{
- struct ifreq ifr;
- int sk, err;
-
- if (index < 0)
- return NULL;
-
- sk = socket(PF_INET, SOCK_DGRAM, 0);
- if (sk < 0) {
- perror("Open socket error");
- return NULL;
- }
-
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_ifindex = index;
-
- err = ioctl(sk, SIOCGIFNAME, &ifr);
- if (err < 0) {
- perror("Get interface name error");
- close(sk);
- return NULL;
- }
-
- close(sk);
-
- return g_strdup(ifr.ifr_name);
-}
static void get_interface_mac_address(int index, uint8_t *mac_address)
{
diff --git a/gdhcp/common.c b/gdhcp/common.c
index fc95881..ccf40f3 100644
--- a/gdhcp/common.c
+++ b/gdhcp/common.c
@@ -22,11 +22,19 @@
#include <config.h>
#endif
+#include <stdio.h>
#include <errno.h>
#include <unistd.h>
+#include <sys/ioctl.h>
#include <stdint.h>
+#include <stdlib.h>
#include <string.h>
#include <endian.h>
+#include <arpa/inet.h>
+#include <netpacket/packet.h>
+#include <net/ethernet.h>
+#include <net/if_arp.h>
+#include <linux/if.h>
#include <netpacket/packet.h>
#include <net/ethernet.h>
@@ -417,3 +425,68 @@ int dhcp_l3_socket(int port, const char *interface)
return fd;
}
+
+char *get_interface_name(int index)
+{
+ struct ifreq ifr;
+ int sk, err;
+
+ if (index < 0)
+ return NULL;
+
+ sk = socket(PF_INET, SOCK_DGRAM, 0);
+ if (sk < 0) {
+ perror("Open socket error");
+ return NULL;
+ }
+
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_ifindex = index;
+
+ err = ioctl(sk, SIOCGIFNAME, &ifr);
+ if (err < 0) {
+ perror("Get interface name error");
+ close(sk);
+ return NULL;
+ }
+
+ close(sk);
+
+ return g_strdup(ifr.ifr_name);
+}
+
+gboolean interface_is_up(int index)
+{
+ int sk, err;
+ struct ifreq ifr;
+ gboolean ret = FALSE;
+
+ sk = socket(PF_INET, SOCK_DGRAM, 0);
+ if (sk < 0) {
+ perror("Open socket error");
+ return FALSE;
+ }
+
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_ifindex = index;
+
+ err = ioctl(sk, SIOCGIFNAME, &ifr);
+ if (err < 0) {
+ perror("Get interface name error");
+ goto done;
+ }
+
+ err = ioctl(sk, SIOCGIFFLAGS, &ifr);
+ if (err < 0) {
+ perror("Get interface flags error");
+ goto done;
+ }
+
+ if (ifr.ifr_flags & IFF_UP)
+ ret = TRUE;
+
+done:
+ close(sk);
+
+ return ret;
+}
diff --git a/gdhcp/common.h b/gdhcp/common.h
index 5b6fe58..3927c9a 100644
--- a/gdhcp/common.h
+++ b/gdhcp/common.h
@@ -51,6 +51,10 @@ static const uint8_t MAC_BCAST_ADDR[6]
__attribute__((aligned(2))) = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
+static const uint8_t MAC_ANY_ADDR[6] __attribute__((aligned(2))) = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
/* DHCP packet */
#define DHCP_MAGIC 0x63825363
#define DHCP_OPTIONS_BUFSIZE 308
@@ -171,3 +175,5 @@ int dhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
uint32_t dest_ip, int dest_port);
int dhcp_l3_socket(int port, const char *interface);
int dhcp_recv_l3_packet(struct dhcp_packet *packet, int fd);
+char *get_interface_name(int index);
+gboolean interface_is_up(int index);
--
1.6.1.3
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman