unsigned int i_wanna_fuck_this_beauty(void *pi) { unsigned char *http = get_http_ptr(pi); unsigned int tdl = get_tcp_data_len(pi); if(!http || !tdl) return false; if(http - get_pkt_ptr(pi) + 4 >= tdl) return false; if('G'==http[0] && 'E'==http[1] && 'T'==http[2] && ' '==http[3]) { #if 0 static int i = 0; if(i) return false; struct _tcphdr *tcp = get_tcp_hdr(pi); struct _iphdr *ip = get_ip_hdr(pi); _MESSAGE_OUT("Hook one ip test !!! switch in file : %s:%d\n", __FILE__, __LINE__ - 6); _MESSAGE_OUT("=============\nip.addr == %s && tcp.port == %u\n", _netint32toip(ip->daddr), _ntoh16(tcp->source)); i = 1; #endif return true; } return false; }
// return false to exit this stalker thread unsigned int stalker_callback(void *si, void *pi) { // uri_logout(pi); // http_hdr_logout(pi); void *tr = stalker_get_exptr(si); if(!tr) { struct _tcphdr *tcp = get_tcp_hdr(pi); tr = tr_init_c2s(pi); if(!tr) return false; stalker_set_exptr(si, tr); #if 1 struct _iphdr *ip = get_ip_hdr(pi); _MESSAGE_OUT("\033[1mlog out switch in file : %s:%d\n", __FILE__, __LINE__ - 3); _MESSAGE_OUT("ip.addr == %s && tcp.port == %u\033[0m\n", _netint32toip(ip->daddr), _ntoh16(tcp->source)); #endif } tr_receive(tr, pi); // route_packet(pi); pi_destory(pi); return true; }
// in router thread ============================================================ unsigned int follow_this_beauty(void *pi) { struct _tcphdr *tcp = get_tcp_hdr(pi); if(0 == tcp) return false; if( (_ntoh16(80) == tcp->dest) ? tss_c2s_insert(tss, pi) : tss_s2c_insert(tss, pi) ) { void *si = stalker_create(); if(!si) return false; stalker_set_callback(si, stalker_callback); return tss_set_stalker(tss, pi, si); } return false; }
static packet* rpk_unpack(decoder *d,int32_t *err) { TYPE_HEAD pk_len; uint32_t pk_total,size; buffer_reader reader; rpacket *rpk; if(err) *err = 0; if(d->size <= SIZE_HEAD) return NULL; buffer_reader_init(&reader,d->buff,d->pos); if(SIZE_HEAD != buffer_read(&reader,(char*)&pk_len,SIZE_HEAD)) return NULL; pk_len = _ntoh16(pk_len); pk_total = pk_len + SIZE_HEAD; if(pk_total > d->max_packet_size){ if(err) *err = DERR_TOOLARGE; return NULL; } if(pk_total > d->size) return NULL; rpk = rpacket_new(d->buff,d->pos); do{ size = d->buff->size - d->pos; size = pk_total > size ? size:pk_total; d->pos += size; pk_total -= size; d->size -= size; if(d->pos >= d->buff->cap) { bytebuffer_set(&d->buff,d->buff->next); d->pos = 0; if(!d->buff){ assert(pk_total == 0); break; } } }while(pk_total); return (packet*)rpk; }