From 83e13ebc5f18d9f583cb7c2f0a7673a43302d2b2 Mon Sep 17 00:00:00 2001 From: wangyu- Date: Tue, 12 Jun 2018 10:08:41 -0500 Subject: [PATCH] libnet roughly works --- main.cpp | 48 ++++++++++++++++++++++++++++++++++++++++-------- network.cpp | 23 ++++++++++++++++++++++- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/main.cpp b/main.cpp index d61ca47..f2b7775 100755 --- a/main.cpp +++ b/main.cpp @@ -766,19 +766,51 @@ int client_event_loop() return 0; } +void sigpipe_cb(struct ev_loop *l, ev_signal *w, int revents) +{ + mylog(log_info, "got sigpipe, ignored"); +} + +void sigterm_cb(struct ev_loop *l, ev_signal *w, int revents) +{ + mylog(log_info, "got sigterm, exit"); + myexit(0); +} + +void sigint_cb(struct ev_loop *l, ev_signal *w, int revents) +{ + mylog(log_info, "got sigint, exit"); + myexit(0); +} + + int main(int argc, char *argv[]) { - libnet_t *l; /* the libnet context */ - char errbuf[LIBNET_ERRBUF_SIZE]; + //libnet_t *l; /* the libnet context */ + //char errbuf[LIBNET_ERRBUF_SIZE]; - l = libnet_init(LIBNET_RAW4, NULL, errbuf); + //l = libnet_init(LIBNET_RAW4, NULL, errbuf); dup2(1, 2);//redirect stderr to stdout - signal(SIGINT, signal_handler); - signal(SIGHUP, signal_handler); - signal(SIGKILL, signal_handler); - signal(SIGTERM, signal_handler); - signal(SIGQUIT, signal_handler); + //signal(SIGINT, signal_handler); + //signal(SIGHUP, signal_handler); + //signal(SIGKILL, signal_handler); + //signal(SIGTERM, signal_handler); + //signal(SIGQUIT, signal_handler); + + struct ev_loop* loop=ev_default_loop(0); + ev_signal signal_watcher_sigpipe; + ev_signal_init(&signal_watcher_sigpipe, sigpipe_cb, SIGPIPE); + ev_signal_start(loop, &signal_watcher_sigpipe); + + ev_signal signal_watcher_sigterm; + ev_signal_init(&signal_watcher_sigterm, sigterm_cb, SIGTERM); + ev_signal_start(loop, &signal_watcher_sigterm); + + ev_signal signal_watcher_sigint; + ev_signal_init(&signal_watcher_sigint, sigint_cb, SIGINT); + ev_signal_start(loop, &signal_watcher_sigint); + pre_process_arg(argc,argv); diff --git a/network.cpp b/network.cpp index 097c4f9..bea6678 100644 --- a/network.cpp +++ b/network.cpp @@ -40,6 +40,8 @@ const u32_t receive_window_lower_bound=40960; const u32_t receive_window_random_range=512; const unsigned char wscale=0x05; +libnet_t *libnet_handle; + struct sock_filter code_tcp_old[] = { { 0x28, 0, 0, 0x0000000c },//0 { 0x15, 0, 10, 0x00000800 },//1 @@ -174,6 +176,11 @@ packet_info_t::packet_info_t() int init_raw_socket() { + char errbuf[LIBNET_ERRBUF_SIZE]; + + libnet_handle = libnet_init(LIBNET_RAW4, dev, errbuf); + + assert(libnet_handle!=0); g_ip_id_counter=get_true_random_number()%65535; if(lower_level==0) @@ -612,6 +619,20 @@ int send_raw_ip(raw_info_t &raw_info,const char * payload,int payloadlen) iph->check=0; int ret; + + ret=libnet_build_ipv4(ip_tot_len, iph->tos, ntohs(iph->id), ntohs(iph->frag_off), + iph->ttl , send_info.protocol, iph->check , iph->saddr, iph->daddr, + (const unsigned char *)payload, payloadlen, libnet_handle, 0); + assert(ret!=-1); + + ret= libnet_write(libnet_handle); + + assert(ret!=-1); + + libnet_clear_packet(libnet_handle); + + + /* if(lower_level==0) { struct sockaddr_in sin={0}; @@ -639,7 +660,7 @@ int send_raw_ip(raw_info_t &raw_info,const char * payload,int payloadlen) else { //mylog(log_info,"sendto succ\n"); - } + }*/ return 0; } int peek_raw(packet_info_t &peek_info)