📄 msg-nicdsp.c
字号:
#include <stdio.h>#include <stdlib.h>#include <linux/ip.h>#include <linux/tcp.h>#include <linux/if_ether.h>#include <sys/time.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/ioctl.h>#include <netinet/in.h>#include <netdb.h>#include <arpa/inet.h>#include <signal.h>#include <string.h>#include <linux/if.h>#include <linux/socket.h>#include <linux/if_packet.h>#include <fcntl.h>#include <sys/msg.h>#define JDEBUG#include "jdebug.h"#include "msghdr.h"int openintf(char *);//void cleanup(int);int state=0;struct etherpacket{ struct ethhdr eth; struct iphdr ip; struct tcphdr tcp; char buff[1600]; /*changed from 8192 by jack on Jul 18,2008*/}ep,ep_eth0, ep_eth1;struct iphdr *ip, *ip_eth0;struct tcphdr *tcp, *tcp_eth0;int s;FILE *fp;#define TCPLOG "tcp.log"#define INTERFACE "eth1" int openintf(char *d){ int fd; struct ifreq ifr; int ss; struct packet_mreq mr; struct sockaddr_ll src;// fd = socket(AF_INET, SOCK_PACKET, htons(0x800)); fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)); if (fd < 0) { perror("cant get SOCK_PACKET socket"); exit(0); } memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name,d); ss = ioctl(fd, SIOCGIFINDEX, &ifr); if (ss < 0) { close(fd); perror("cant get index"); exit(0); } memset(&src, 0, sizeof(src)); src.sll_family = AF_PACKET; src.sll_protocol = htons(ETH_P_ALL); src.sll_ifindex = ifr.ifr_ifindex; ss = bind(fd, (struct sockaddr*)&src, sizeof(src)); if (ss < 0) { close(fd); perror("cant bind eth1"); exit(0); }/* Method 1: use setsockopt to set promiscuous mode */ memset(&mr, 0, sizeof(mr)); mr.mr_ifindex = ifr.ifr_ifindex; mr.mr_type = PACKET_MR_PROMISC; //bt ss = setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr));/* Method 2: use ioctl to set promiscuous mode */// ifr.ifr_flags |= IFF_PROMISC;// ss = ioctl(fd, SIOCSIFFLAGS, &ifr); if (ss < 0) { perror("cant set promiscuous mode"); exit(1); } return fd;}// on May 8th// remove read_tcp(), filter(),print_header, print_data// print_iphdr(), print_tcphdr()void i2a(char *data, char *str){ if (data == NULL || str == NULL) { printf("error pointer\n"); exit(1); } sprintf(str,"%d.%d.%d.%d", data[0], data[1], data[2], data[3]); return;}int openfifo(char *file,mode_t mode){ int retv; retv = open(file, mode); if (retv < 0) { printf("cant open fifo:%s\n",file); exit(0); } return retv;}int openqueue(key_t key){ int retv; retv = msgget(key,IPC_CREAT|IPC_EXCL); if (retv < 0) { printf("can not open msg queue(key%d)\n",key); exit(0); } return retv;} main(int argc, char *argv[]){ int frame_index,read_len; int fdin,fdout; msg_t omsg, imsg; int result, iplength; int eth0_read_len, snd_msg_len; int tmp, retv; s = openintf("eth1"); ip = (struct iphdr *)(((unsigned long)&ep.ip) - 2); tcp = (struct tcphdr *)(((unsigned long)&ep.tcp) - 2); ip_eth0 = (struct iphdr *)(((unsigned long)&ep_eth0.ip) - 2); tcp_eth0 = (struct tcphdr *)(((unsigned long)&ep_eth0.tcp) - 2); fp = stdout; fdout = openqueue(NICIKEY); fdin = openqueue(NICOKEY);/* sockwrt = openfifo(DSPFILE,); if (sockwrt < 0) { fprintf(stderr,"cant open dsp file:%s\n",DSPFILE); exit(0); }*/ if (fork() == 0) { printf("get ready!\n"); while (1) { printf("--------get ready to read eth1------\n"); //state=1; read_len = read(s, &ep_eth0, sizeof(ep)); //state=0; printf("---read eth1 return: %d\n",read_len); memset(&omsg, 0 , sizeof(omsg)); omsg.type = 0x1111; memcpy(omsg.data+5,&ep_eth0,read_len); /*reserved some buff */ snd_msg_len = LONGSIZE + 5 + read_len; //usleep(100000); //by bt tmp = msgsnd(fdout,&omsg,snd_msg_len,IPC_NOWAIT); if (!tmp) Jdebug("---write NIC IN queue %d.\n",snd_msg_len); else Jdebug("####write NIC In queue wrong.\n"); } } else { while(1) { eth0_read_len = msgrcv(fdin,&imsg,sizeof(imsg),0,0); printf("read Nic OUT return:%d\n",eth0_read_len); eth0_read_len = eth0_read_len - LONGSIZE - 5; memset(&ep_eth1, 0, sizeof(ep_eth1)); memcpy(&ep_eth1, imsg.data+5, eth0_read_len);// retv = write(s,imsg.data+5,eth0_read_len); retv = write(s,&ep_eth1, eth0_read_len-4); Jdebug("write eth1 return:%d\n", retv); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -