Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright 2007, Intel Corporation
      3  *
      4  * This file is part of PowerTOP
      5  *
      6  * This program file is free software; you can redistribute it and/or modify it
      7  * under the terms of the GNU General Public License as published by the
      8  * Free Software Foundation; version 2 of the License.
      9  *
     10  * This program is distributed in the hope that it will be useful, but WITHOUT
     11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     13  * for more details.
     14  *
     15  * You should have received a copy of the GNU General Public License
     16  * along with this program in a file named COPYING; if not, write to the
     17  * Free Software Foundation, Inc.,
     18  * 51 Franklin Street, Fifth Floor,
     19  * Boston, MA 02110-1301 USA
     20  *
     21  * Authors:
     22  * 	Arjan van de Ven <arjan (at) linux.intel.com>
     23  */
     24 
     25 #include <unistd.h>
     26 #include <stdio.h>
     27 #include <stdlib.h>
     28 #include <string.h>
     29 #include <stdint.h>
     30 #include <sys/types.h>
     31 #include <dirent.h>
     32 #include <linux/types.h>
     33 #include <net/if.h>
     34 #include <linux/sockios.h>
     35 #include <sys/ioctl.h>
     36 
     37 /* work around a bug in debian -- it exposes kernel internal types to userspace */
     38 #define u64 __u64
     39 #define u32 __u32
     40 #define u16 __u16
     41 #define u8 __u8
     42 #include <linux/ethtool.h>
     43 #undef u64
     44 #undef u32
     45 #undef u16
     46 #undef u8
     47 
     48 
     49 
     50 #include "powertop.h"
     51 
     52 void activate_WOL_suggestion(void)
     53 {
     54 	int sock;
     55 	struct ifreq ifr;
     56 	struct ethtool_wolinfo wol;
     57 	int ret;
     58 
     59 	memset(&ifr, 0, sizeof(struct ifreq));
     60 
     61 	sock = socket(AF_INET, SOCK_DGRAM, 0);
     62 	if (sock<0)
     63 		return;
     64 
     65 	strcpy(ifr.ifr_name, "eth0");
     66 
     67 	/* Check if the interface is up */
     68 	ret = ioctl(sock, SIOCGIFFLAGS, &ifr);
     69 	if (ret<0) {
     70 		close(sock);
     71 		return;
     72 	}
     73 
     74 	if (ifr.ifr_flags & (IFF_UP | IFF_RUNNING)) {
     75 		close(sock);
     76 		return;
     77 	}
     78 
     79 	memset(&wol, 0, sizeof(wol));
     80 
     81 	wol.cmd = ETHTOOL_GWOL;
     82 	ifr.ifr_data = (caddr_t)&wol;
     83         ioctl(sock, SIOCETHTOOL, &ifr);
     84 	wol.cmd = ETHTOOL_SWOL;
     85 	wol.wolopts = 0;
     86         ioctl(sock, SIOCETHTOOL, &ifr);
     87 
     88 	close(sock);
     89 }
     90 
     91 
     92 
     93 void suggest_WOL_off(void)
     94 {
     95 	int sock;
     96 	struct ifreq ifr;
     97 	struct ethtool_wolinfo wol;
     98 	int ret;
     99 
    100 	memset(&ifr, 0, sizeof(struct ifreq));
    101 
    102 	sock = socket(AF_INET, SOCK_DGRAM, 0);
    103 	if (sock<0)
    104 		return;
    105 
    106 	strcpy(ifr.ifr_name, "eth0");
    107 
    108 	/* Check if the interface is up */
    109 	ret = ioctl(sock, SIOCGIFFLAGS, &ifr);
    110 	if (ret<0) {
    111 		close(sock);
    112 		return;
    113 	}
    114 
    115 	if (ifr.ifr_flags & (IFF_UP | IFF_RUNNING)) {
    116 		close(sock);
    117 		return;
    118 	}
    119 
    120 	memset(&wol, 0, sizeof(wol));
    121 
    122 	wol.cmd = ETHTOOL_GWOL;
    123 	ifr.ifr_data = (caddr_t)&wol;
    124         ioctl(sock, SIOCETHTOOL, &ifr);
    125 
    126 	if (wol.wolopts) {
    127 		add_suggestion(_(
    128 			"Disable Ethernet Wake-On-Lan with the following command:\n"
    129 			"  ethtool -s eth0 wol d \n"
    130 			"Wake-on-Lan keeps the phy active, this costs power."), 5,
    131 			'W', _(" W - disable Wake-On-Lan "), activate_WOL_suggestion);
    132 
    133 
    134 	}
    135 
    136 	close(sock);
    137 }
    138 
    139