-
- len -= hdr->nlmsg_len;
- ptr += hdr->nlmsg_len;
- }
-
- return TRUE;
-}
-
-static GIOChannel *channel;
-
-static int rtnl_request(void)
-{
- struct {
- struct nlmsghdr hdr;
- struct rtgenmsg msg;
- } req;
-
- struct sockaddr_nl addr;
- int sk;
-
- DBG("");
-
- memset(&req, 0, sizeof(req));
- req.hdr.nlmsg_len = sizeof(req.hdr) + sizeof(req.msg);
- req.hdr.nlmsg_type = RTM_GETLINK;
- req.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
- req.hdr.nlmsg_pid = 0;
- req.hdr.nlmsg_seq = 42;
- req.msg.rtgen_family = AF_INET;
-
- sk = g_io_channel_unix_get_fd(channel);
-
- memset(&addr, 0, sizeof(addr));
- addr.nl_family = AF_NETLINK;
-
- return sendto(sk, &req, sizeof(req), 0,
- (struct sockaddr *) &addr, sizeof(addr));
-}
-
-static int iface_up(struct ethernet_data *ethernet)
-{
- struct ifreq ifr;
- int sk, err;
-
- DBG("index %d flags %d", ethernet->index, ethernet->flags);
-
- sk = socket(PF_INET, SOCK_DGRAM, 0);
- if (sk < 0)
- return -errno;
-
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_ifindex = ethernet->index;
-
- if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
- err = -errno;
- goto done;
- }
-
- if (ioctl(sk, SIOCGIFFLAGS, &ifr) < 0) {
- err = -errno;
- goto done;
- }
-
- if (ifr.ifr_flags & IFF_UP) {
- err = -EALREADY;
- goto done;
- }
-
- ifr.ifr_flags |= IFF_UP;
-
- if (ioctl(sk, SIOCSIFFLAGS, &ifr) < 0) {
- err = -errno;
- goto done;
- }
-
- err = 0;
-
-done:
- close(sk);
-
- return err;
-}
-
-static int iface_down(struct ethernet_data *ethernet)
-{
- struct ifreq ifr;
- int sk, err;
-
- DBG("index %d flags %d", ethernet->index, ethernet->flags);
-
- sk = socket(PF_INET, SOCK_DGRAM, 0);
- if (sk < 0)
- return -errno;
-
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_ifindex = ethernet->index;
-
- if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
- err = -errno;
- goto done;