📄 testvnet4.c
字号:
//-------------------------------------------------------------------------//test get/set guestif macaddr,//test set iflag flag=IFF_UP|IFF_RUNNING;//test guestif<----->guestif communication//usage://testvnet4 s server side, wait and read, should first//testvnet4 c client side, write//-------------------------------------------------------------------------#include <net/if.h>#include <net/ethernet.h>#include <sys/ioctl.h>//#include <linux/if.h>#include "if_vnet.h"//from linux/sockios.h#define SIOCGIFADDR 0x8915 /* get PA address */#define SIOCSIFADDR 0x8916 /* set PA address */#define ETH_ALEN 6/*struct ethhdr { unsigned char h_dest[ETH_ALEN]; unsigned char h_source[ETH_ALEN]; unsigned short h_proto;};*/struct ethhdr packet1,packet2;int main(int argc, char **argv){int tapif_fd;unsigned flag;char buf[1024];unsigned char paddr[ETH_ALEN],paddr1[ETH_ALEN],paddr2[ETH_ALEN];fd_set frds;struct timeval tv;int ret;char myid;if (argc!=2) { printf("test guestif<---->guestif communication\n"); printf("server side:wait & read, client side:write\n"); printf("usage:testvnet4 c|s (client or server)\n"); exit(-1);}myid=argv[1][0];printf("test vnet ioctl\n");tapif_fd = open("/dev/net/vnet", 2);if(tapif_fd<0){ perror("open");exit(-1);};printf("open vnet ok!\n"); if (ioctl(tapif_fd, SIOCGIFADDR, (void *) paddr) < 0) { printf("get mac addr error\n"); exit(-1);}printf("ioctl vnet get mac addr ok, addr is %x:%x:%x:%x:%x:%x \n", paddr[0],paddr[1],paddr[2],paddr[3],paddr[4],paddr[5]); paddr1[0]=0; paddr1[1]=1; paddr1[2]=2; paddr1[3]=3; paddr1[4]=4; paddr1[5]=5; paddr2[0]=0; paddr2[1]=2; paddr2[2]=3; paddr2[3]=4; paddr2[4]=5; paddr2[5]=6;if(myid=='c') memcpy(paddr,paddr1,ETH_ALEN);else memcpy(paddr,paddr2,ETH_ALEN);if (ioctl(tapif_fd, SIOCSIFADDR, (void *) paddr) < 0) { printf("set mac addr error\n"); exit(-1);}printf("ioctl vnet set mac addr ok\n");if (ioctl(tapif_fd, SIOCGIFADDR, (void *) paddr) < 0) { printf("get mac addr error\n"); exit(-1);}printf("ioctl vnet get mac addr ok, addr is %x:%x:%x:%x:%x:%x \n", paddr[0],paddr[1],paddr[2],paddr[3],paddr[4],paddr[5]);flag=0;printf("ioctl vnet get ifflag\n");if (ioctl(tapif_fd, SIOCGIFFLAGS, (void *) &flag) < 0) { printf("get mac addr error\n"); exit(-1);}printf("ioctl vnet get flag 0x%x\n",flag);flag=IFF_UP|IFF_RUNNING;printf("ioctl vnet set ifflag 0x %x\n",flag);if (ioctl(tapif_fd, SIOCSIFFLAGS, (void *) &flag) < 0) { printf("get mac addr error\n"); exit(-1);}printf("ioctl vnet set ifflag ok.\n");//------------------------if(myid=='c'){//client side printf("client test communication\n"); memcpy(&packet1.h_source,paddr1,ETH_ALEN); memcpy(&packet1.h_dest,paddr2,ETH_ALEN); packet1.h_proto=6; printf("client write packet1 begin\n"); write(tapif_fd, &packet1, sizeof(packet1)); printf("client write packet1 end\n"); printf("client side end\n"); }else{// server side printf("server test communication read\n"); memset(&packet2,0,sizeof(packet2)); memset(paddr1,0,sizeof(paddr1)); memset(paddr2,0,sizeof(paddr2)); FD_ZERO(&frds); FD_SET(tapif_fd, &frds); tv.tv_sec =0; tv.tv_usec=0; printf("server test select begin tapif_fd %d\n",tapif_fd); ret=0; if((ret=select(tapif_fd+1,&frds,NULL,NULL,NULL))>0) { //wait for ever if &tv=NULL printf("server select ok! success ret %d\n",ret); if(FD_ISSET(tapif_fd,&frds)){ printf("server test read\n"); read(tapif_fd, &packet2, sizeof(packet2)); memcpy(paddr1,&packet2.h_source,ETH_ALEN); memcpy(paddr2,&packet2.h_dest,ETH_ALEN); printf("server get packet src mac is %x:%x:%x:%x:%x:%x \n", paddr1[0],paddr1[1],paddr1[2],paddr1[3],paddr1[4],paddr1[5]); printf("server get packet dest mac is %x:%x:%x:%x:%x:%x \n", paddr2[0],paddr2[1],paddr2[2],paddr2[3],paddr2[4],paddr2[5]); printf("server side end\n"); } }} while(1){ sleep(30);};}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -