17a192d395ce5d7e5945afa684146d5b0abc53480mbligh/* 27a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Copyright 2007, Intel Corporation 37a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 47a192d395ce5d7e5945afa684146d5b0abc53480mbligh * This file is part of PowerTOP 57a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 67a192d395ce5d7e5945afa684146d5b0abc53480mbligh * This program file is free software; you can redistribute it and/or modify it 77a192d395ce5d7e5945afa684146d5b0abc53480mbligh * under the terms of the GNU General Public License as published by the 87a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Free Software Foundation; version 2 of the License. 97a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 107a192d395ce5d7e5945afa684146d5b0abc53480mbligh * This program is distributed in the hope that it will be useful, but WITHOUT 117a192d395ce5d7e5945afa684146d5b0abc53480mbligh * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 127a192d395ce5d7e5945afa684146d5b0abc53480mbligh * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 137a192d395ce5d7e5945afa684146d5b0abc53480mbligh * for more details. 147a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 157a192d395ce5d7e5945afa684146d5b0abc53480mbligh * You should have received a copy of the GNU General Public License 167a192d395ce5d7e5945afa684146d5b0abc53480mbligh * along with this program in a file named COPYING; if not, write to the 177a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Free Software Foundation, Inc., 187a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 51 Franklin Street, Fifth Floor, 197a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Boston, MA 02110-1301 USA 207a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 217a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Authors: 227a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Arjan van de Ven <arjan@linux.intel.com> 237a192d395ce5d7e5945afa684146d5b0abc53480mbligh */ 247a192d395ce5d7e5945afa684146d5b0abc53480mbligh 257a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <unistd.h> 267a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <stdio.h> 277a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <stdlib.h> 287a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <string.h> 297a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <stdint.h> 307a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <sys/types.h> 317a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <dirent.h> 327a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <linux/types.h> 337a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <net/if.h> 347a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <linux/sockios.h> 357a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <sys/ioctl.h> 367a192d395ce5d7e5945afa684146d5b0abc53480mbligh 377a192d395ce5d7e5945afa684146d5b0abc53480mbligh/* work around a bug in debian -- it exposes kernel internal types to userspace */ 387a192d395ce5d7e5945afa684146d5b0abc53480mbligh#define u64 __u64 397a192d395ce5d7e5945afa684146d5b0abc53480mbligh#define u32 __u32 407a192d395ce5d7e5945afa684146d5b0abc53480mbligh#define u16 __u16 417a192d395ce5d7e5945afa684146d5b0abc53480mbligh#define u8 __u8 427a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <linux/ethtool.h> 437a192d395ce5d7e5945afa684146d5b0abc53480mbligh#undef u64 447a192d395ce5d7e5945afa684146d5b0abc53480mbligh#undef u32 457a192d395ce5d7e5945afa684146d5b0abc53480mbligh#undef u16 467a192d395ce5d7e5945afa684146d5b0abc53480mbligh#undef u8 477a192d395ce5d7e5945afa684146d5b0abc53480mbligh 487a192d395ce5d7e5945afa684146d5b0abc53480mbligh 497a192d395ce5d7e5945afa684146d5b0abc53480mbligh 507a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include "powertop.h" 517a192d395ce5d7e5945afa684146d5b0abc53480mbligh 527a192d395ce5d7e5945afa684146d5b0abc53480mblighvoid activate_WOL_suggestion(void) 537a192d395ce5d7e5945afa684146d5b0abc53480mbligh{ 547a192d395ce5d7e5945afa684146d5b0abc53480mbligh int sock; 557a192d395ce5d7e5945afa684146d5b0abc53480mbligh struct ifreq ifr; 567a192d395ce5d7e5945afa684146d5b0abc53480mbligh struct ethtool_wolinfo wol; 577a192d395ce5d7e5945afa684146d5b0abc53480mbligh int ret; 587a192d395ce5d7e5945afa684146d5b0abc53480mbligh 597a192d395ce5d7e5945afa684146d5b0abc53480mbligh memset(&ifr, 0, sizeof(struct ifreq)); 607a192d395ce5d7e5945afa684146d5b0abc53480mbligh 617a192d395ce5d7e5945afa684146d5b0abc53480mbligh sock = socket(AF_INET, SOCK_DGRAM, 0); 627a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (sock<0) 637a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 647a192d395ce5d7e5945afa684146d5b0abc53480mbligh 657a192d395ce5d7e5945afa684146d5b0abc53480mbligh strcpy(ifr.ifr_name, "eth0"); 667a192d395ce5d7e5945afa684146d5b0abc53480mbligh 677a192d395ce5d7e5945afa684146d5b0abc53480mbligh /* Check if the interface is up */ 687a192d395ce5d7e5945afa684146d5b0abc53480mbligh ret = ioctl(sock, SIOCGIFFLAGS, &ifr); 697a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (ret<0) { 707a192d395ce5d7e5945afa684146d5b0abc53480mbligh close(sock); 717a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 727a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 737a192d395ce5d7e5945afa684146d5b0abc53480mbligh 747a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (ifr.ifr_flags & (IFF_UP | IFF_RUNNING)) { 757a192d395ce5d7e5945afa684146d5b0abc53480mbligh close(sock); 767a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 777a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 787a192d395ce5d7e5945afa684146d5b0abc53480mbligh 797a192d395ce5d7e5945afa684146d5b0abc53480mbligh memset(&wol, 0, sizeof(wol)); 807a192d395ce5d7e5945afa684146d5b0abc53480mbligh 817a192d395ce5d7e5945afa684146d5b0abc53480mbligh wol.cmd = ETHTOOL_GWOL; 827a192d395ce5d7e5945afa684146d5b0abc53480mbligh ifr.ifr_data = (caddr_t)&wol; 837a192d395ce5d7e5945afa684146d5b0abc53480mbligh ioctl(sock, SIOCETHTOOL, &ifr); 847a192d395ce5d7e5945afa684146d5b0abc53480mbligh wol.cmd = ETHTOOL_SWOL; 857a192d395ce5d7e5945afa684146d5b0abc53480mbligh wol.wolopts = 0; 867a192d395ce5d7e5945afa684146d5b0abc53480mbligh ioctl(sock, SIOCETHTOOL, &ifr); 877a192d395ce5d7e5945afa684146d5b0abc53480mbligh 887a192d395ce5d7e5945afa684146d5b0abc53480mbligh close(sock); 897a192d395ce5d7e5945afa684146d5b0abc53480mbligh} 907a192d395ce5d7e5945afa684146d5b0abc53480mbligh 917a192d395ce5d7e5945afa684146d5b0abc53480mbligh 927a192d395ce5d7e5945afa684146d5b0abc53480mbligh 937a192d395ce5d7e5945afa684146d5b0abc53480mblighvoid suggest_WOL_off(void) 947a192d395ce5d7e5945afa684146d5b0abc53480mbligh{ 957a192d395ce5d7e5945afa684146d5b0abc53480mbligh int sock; 967a192d395ce5d7e5945afa684146d5b0abc53480mbligh struct ifreq ifr; 977a192d395ce5d7e5945afa684146d5b0abc53480mbligh struct ethtool_wolinfo wol; 987a192d395ce5d7e5945afa684146d5b0abc53480mbligh int ret; 997a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1007a192d395ce5d7e5945afa684146d5b0abc53480mbligh memset(&ifr, 0, sizeof(struct ifreq)); 1017a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1027a192d395ce5d7e5945afa684146d5b0abc53480mbligh sock = socket(AF_INET, SOCK_DGRAM, 0); 1037a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (sock<0) 1047a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 1057a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1067a192d395ce5d7e5945afa684146d5b0abc53480mbligh strcpy(ifr.ifr_name, "eth0"); 1077a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1087a192d395ce5d7e5945afa684146d5b0abc53480mbligh /* Check if the interface is up */ 1097a192d395ce5d7e5945afa684146d5b0abc53480mbligh ret = ioctl(sock, SIOCGIFFLAGS, &ifr); 1107a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (ret<0) { 1117a192d395ce5d7e5945afa684146d5b0abc53480mbligh close(sock); 1127a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 1137a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 1147a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1157a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (ifr.ifr_flags & (IFF_UP | IFF_RUNNING)) { 1167a192d395ce5d7e5945afa684146d5b0abc53480mbligh close(sock); 1177a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 1187a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 1197a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1207a192d395ce5d7e5945afa684146d5b0abc53480mbligh memset(&wol, 0, sizeof(wol)); 1217a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1227a192d395ce5d7e5945afa684146d5b0abc53480mbligh wol.cmd = ETHTOOL_GWOL; 1237a192d395ce5d7e5945afa684146d5b0abc53480mbligh ifr.ifr_data = (caddr_t)&wol; 1247a192d395ce5d7e5945afa684146d5b0abc53480mbligh ioctl(sock, SIOCETHTOOL, &ifr); 1257a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1267a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (wol.wolopts) { 1277a192d395ce5d7e5945afa684146d5b0abc53480mbligh add_suggestion(_( 1287a192d395ce5d7e5945afa684146d5b0abc53480mbligh "Disable Ethernet Wake-On-Lan with the following command:\n" 1297a192d395ce5d7e5945afa684146d5b0abc53480mbligh " ethtool -s eth0 wol d \n" 1307a192d395ce5d7e5945afa684146d5b0abc53480mbligh "Wake-on-Lan keeps the phy active, this costs power."), 5, 1317a192d395ce5d7e5945afa684146d5b0abc53480mbligh 'W', _(" W - disable Wake-On-Lan "), activate_WOL_suggestion); 1327a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1337a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1347a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 1357a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1367a192d395ce5d7e5945afa684146d5b0abc53480mbligh close(sock); 1377a192d395ce5d7e5945afa684146d5b0abc53480mbligh} 1387a192d395ce5d7e5945afa684146d5b0abc53480mbligh 139