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@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