///down 一下我测试过
#include <sys/types.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ioctl.h> #include <sys/stat.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <net/if.h> #include <sys/utsname.h> #include <limits.h> #include <ctype.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <linux/sockios.h> #include <linux/ethtool.h> #include <net/if_arp.h> #include <endian.h> /* * struct ethtool_value { * int cmd; * int data; * }; * */ char *devname = NULL; static int phys_id_time = 0; int get_mac_addr (int fd, struct ifreq *ifr) { printf ("Get MAC\n"); if (ioctl (fd, SIOCGIFHWADDR, ifr) != 0) { printf ("Get mac error\n"); return -1; } printf ("MAC Addr %02x:%02x:%02x:%02x:%02x:%02x\n", ifr->ifr_hwaddr.sa_data[0], ifr->ifr_hwaddr.sa_data[1], ifr->ifr_hwaddr.sa_data[2], ifr->ifr_hwaddr.sa_data[3], ifr->ifr_hwaddr.sa_data[4], ifr->ifr_hwaddr.sa_data[5]); return 0; } int set_mac_addr (int fd, struct ifreq *ifr) { printf ("Set MAC\n"); ifr->ifr_addr.sa_family = ARPHRD_ETHER; ifr->ifr_hwaddr.sa_data[0] = 0; ifr->ifr_hwaddr.sa_data[1] = 2; ifr->ifr_hwaddr.sa_data[2] = 2; ifr->ifr_hwaddr.sa_data[3] = 2; ifr->ifr_hwaddr.sa_data[4] = 2; ifr->ifr_hwaddr.sa_data[5] = 2; if (ioctl (fd, SIOCSIFHWADDR, ifr) != 0) { printf ("Set mac error,first byte bit0 must be 0\n"); perror("OOOOO"); return -1; } printf ("SET MAC Addr %02x:%02x:%02x:%02x:%02x:%02x\n", ifr->ifr_hwaddr.sa_data[0], ifr->ifr_hwaddr.sa_data[1], ifr->ifr_hwaddr.sa_data[2], ifr->ifr_hwaddr.sa_data[3], ifr->ifr_hwaddr.sa_data[4], ifr->ifr_hwaddr.sa_data[5]); return 0; } int main (int argc, char **argv) { int fd, id, sta; struct ifreq ifr; if (argv[1]) devname = argv[1]; else devname = "eth0"; memset (&ifr, 0, sizeof (ifr)); sprintf (ifr.ifr_name, devname); fd = socket (AF_INET, SOCK_DGRAM, 0); if (fd < 0) { printf ("Cannot get control socket\n"); return -1; } #if 0 get_phys_set (fd, &ifr); set_phys_set (fd, &ifr); sleep (5); get_phys_set (fd, &ifr); #else // get_mac_addr (fd, &ifr); set_mac_addr (fd, &ifr); // get_mac_addr (fd, &ifr); #endif return 0; }
/up
#include <sys/types.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ioctl.h> #include <sys/stat.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <net/if.h> #include <sys/utsname.h> #include <limits.h> #include <ctype.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <linux/sockios.h> #include <linux/ethtool.h> #include <endian.h> //#define SIOCETHTOOL 0x8946 //#define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */ /* struct ethtool_value { int cmd; int data; }; */ char * devname=NULL; static int phys_id_time = 0; static int send_ioctl(int fd, struct ifreq *ifr) { return ioctl(fd, SIOCETHTOOL, ifr); } /* return : 1:link 0:unlink */ static int get_phys_link(int fd, struct ifreq *ifr) { int err; struct ethtool_value edata; edata.cmd = ETHTOOL_GLINK; //ETHTOOL_GLINK edata.data = phys_id_time; ifr->ifr_data = (caddr_t)&edata; err = send_ioctl(fd, ifr); if (err < 0) perror("Error"); printf("Link status: %d\n",edata.data); return edata.data; } /* reset phy */ static int set_phys_rst(int fd, struct ifreq *ifr) { int err; struct ethtool_value edata; printf("Rest PHY\n"); edata.cmd = ETHTOOL_NWAY_RST; //ETHTOOL_GLINK edata.data = phys_id_time; ifr->ifr_data = (caddr_t)&edata; err = send_ioctl(fd, ifr); if (err < 0) perror("Error"); return err; } static int get_phys_set(int fd, struct ifreq *ifr) { int err; struct ethtool_cmd cmd; memset(&cmd,0,sizeof(cmd)); printf("Get PHY setting\n"); cmd.cmd = ETHTOOL_GSET; //ETHTOOL_GLINK ifr->ifr_data = (caddr_t)&cmd; err = send_ioctl(fd, ifr); if (err < 0) perror("Error"); printf("phy addr [%d],port [%d],speed [%d],duplex [%d]\n",cmd.phy_address,cmd.port,cmd.speed,cmd.duplex); return err; } static int set_phys_set(int fd, struct ifreq *ifr) { int err; struct ethtool_cmd cmd; // 1.get setting memset(&cmd,0,sizeof(cmd)); printf("Get PHY setting\n"); cmd.cmd = ETHTOOL_GSET; ifr->ifr_data = (caddr_t)&cmd; err = send_ioctl(fd, ifr); if (err < 0) perror("Error"); printf("speed [%d]\n",cmd.speed); // 2. set setting cmd.speed=SPEED_100; //SPEED_100 cmd.cmd = ETHTOOL_SSET; err = send_ioctl(fd, ifr); if (err < 0) perror("Error"); // 3.verify the set value get_phys_set(fd,ifr); printf("set Done\n"); return 0; } int get_mac_addr(int fd,struct ifreq *ifr) { printf("Get MAC\n"); if(ioctl(fd,SIOCGIFHWADDR,ifr)!=0) { printf("Get mac error\n"); return -1; } //printf("MAC addr :%s\n",ifr.ifr_hwaddr.sa_data); printf("MAC Addr %02x:%02x:%02x:%02x:%02x:%02x\n",ifr->ifr_hwaddr.sa_data[0], ifr->ifr_hwaddr.sa_data[1], ifr->ifr_hwaddr.sa_data[2], ifr->ifr_hwaddr.sa_data[3], ifr->ifr_hwaddr.sa_data[4], ifr->ifr_hwaddr.sa_data[5]); return 0; } int set_mac_addr(int fd,struct ifreq *ifr) { printf("Set MAC\n"); ifr->ifr_hwaddr.sa_data[0]=0; ifr->ifr_hwaddr.sa_data[1]=2; ifr->ifr_hwaddr.sa_data[2]=2; ifr->ifr_hwaddr.sa_data[3]=2; ifr->ifr_hwaddr.sa_data[4]=2; ifr->ifr_hwaddr.sa_data[5]=2; //ifr->ifr_hwaddr.sa_data[5]=0x88; if(ioctl(fd,SIOCSIFHWADDR,ifr)!=0) { printf("Set mac error,first byte bit0 must be 0\n"); return -1; } printf("SET MAC Addr %02x:%02x:%02x:%02x:%02x:%02x\n",ifr->ifr_hwaddr.sa_data[0], ifr->ifr_hwaddr.sa_data[1], ifr->ifr_hwaddr.sa_data[2], ifr->ifr_hwaddr.sa_data[3], ifr->ifr_hwaddr.sa_data[4], ifr->ifr_hwaddr.sa_data[5]); return 0; } int main(int argc, char **argv) { int fd,id,sta; struct ifreq ifr; printf("[%s][%s]\n",__DATE__,__TIME__); if(argv[1]) devname=argv[1]; else devname="eth0"; memset(&ifr, 0, sizeof(ifr)); sprintf(ifr.ifr_name, devname); fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { printf("Cannot get control socket\n"); return -1; } #if 1 //get_phys_link(fd, &ifr); //set_phys_rst(fd,&ifr); get_phys_set(fd,&ifr); set_phys_set(fd,&ifr); sleep(5); get_phys_set(fd,&ifr); //get_phys_set(fd,&ifr); //get_phys_set(fd,&ifr); #else get_mac_addr(fd,&ifr); set_mac_addr(fd,&ifr); get_mac_addr(fd,&ifr); #endif return 0; }