Example #1
0
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);
}
Example #2
0
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 *)&ether_hdr->ether_src);
		(*env)->GetByteArrayRegion(env,dst,0,6,(char *)&ether_hdr->ether_dest);
		ether_hdr->ether_type=htons(GetShortField(EthernetPacket,packet,"frametype"));

  (*env)->ExceptionDescribe(env);
		return sizeof(struct ether_header);
	}
	return 0;
}