int set_arp(JNIEnv *env,jobject packet,u_char *pointer){ /** XXX assume Ethernet ARP**/ struct ether_arp *arp=(struct ether_arp *)pointer; arp->arp_hrd=htons(GetShortField(ARPPacket,packet,"hardtype")); arp->arp_pro=htons(GetShortField(ARPPacket,packet,"prototype")); arp->arp_op=htons(GetShortField(ARPPacket,packet,"operation")); arp->arp_hln=(u_char)GetShortField(ARPPacket,packet,"hlen"); arp->arp_pln=(u_char)GetShortField(ARPPacket,packet,"plen"); (*env)->GetByteArrayRegion(env, GetObjectField(ARPPacket,packet,"[B","sender_hardaddr"), 0,arp->arp_hln,arp->arp_sha); (*env)->GetByteArrayRegion(env, GetObjectField(ARPPacket,packet,"[B","sender_protoaddr"), 0,arp->arp_pln,arp->arp_spa); (*env)->GetByteArrayRegion(env, GetObjectField(ARPPacket,packet,"[B","target_hardaddr"), 0,arp->arp_hln,arp->arp_tha); (*env)->GetByteArrayRegion(env, GetObjectField(ARPPacket,packet,"[B","target_protoaddr"), 0,arp->arp_pln,arp->arp_tpa); return sizeof(struct ether_arp); }
void set_tcp(JNIEnv *env,jobject packet,char *pointer,jbyteArray data,struct ip *ip) { struct tcphdr *tcp=(struct tcphdr *)(pointer); jint length=(*env)->GetArrayLength(env,data); tcp->th_sport=htons((jshort)GetIntField(TCPPacket,packet,"src_port")); tcp->th_dport=htons((jshort)GetIntField(TCPPacket,packet,"dst_port")); tcp->th_seq=htonl((unsigned long)GetLongField(TCPPacket,packet,"sequence")); tcp->th_ack=htonl((unsigned long)GetLongField(TCPPacket,packet,"ack_num")); tcp->th_off=5; // updated by Damien Daspit 5/7/01 tcp->th_flags=(GetBooleanField(TCPPacket,packet,"rsv1")<<7)+ (GetBooleanField(TCPPacket,packet,"rsv2")<<6)+ (GetBooleanField(TCPPacket,packet,"urg")<<5)+ (GetBooleanField(TCPPacket,packet,"ack")<<4)+ (GetBooleanField(TCPPacket,packet,"psh")<<3)+ (GetBooleanField(TCPPacket,packet,"rst")<<2)+ (GetBooleanField(TCPPacket,packet,"syn")<<1)+ (GetBooleanField(TCPPacket,packet,"fin")); // ******************************* tcp->th_win=htons((jshort)GetIntField(TCPPacket,packet,"window")); tcp->th_urp=htons(GetShortField(TCPPacket,packet,"urgent_pointer")); if(length+IPv4HDRLEN+TCPHDRLEN>MAX_PACKET_SIZE) length=MAX_PACKET_SIZE-IPv4HDRLEN-TCPHDRLEN; // updated by Damien Daspit 5/15/01 (*env)->GetByteArrayRegion(env,data,0, length, (u_char *)(pointer+TCPHDRLEN)); tcp->th_sum=0; tcp->th_sum=in_cksum2(ip,htons((u_short)length+TCPHDRLEN),(u_short *)tcp,length+TCPHDRLEN); }
int set_ether(JNIEnv *env,jobject packet,char *pointer){ packet=GetObjectField(Packet,packet,"Ljpcap/packet/DatalinkPacket;","datalink"); if(packet!=NULL && IsInstanceOf(packet,EthernetPacket)){ struct ether_header *ether_hdr=(struct ether_header *)pointer; jbyteArray src=GetObjectField(EthernetPacket,packet,"[B","src_mac"); jbyteArray dst=GetObjectField(EthernetPacket,packet,"[B","dst_mac"); (*env)->GetByteArrayRegion(env,src,0,6,(char *)ðer_hdr->ether_src); (*env)->GetByteArrayRegion(env,dst,0,6,(char *)ðer_hdr->ether_dest); ether_hdr->ether_type=htons(GetShortField(EthernetPacket,packet,"frametype")); (*env)->ExceptionDescribe(env); return sizeof(struct ether_header); } return 0; }