>> Edit article
이름
제목
패스워드
아래의 소스에서 (리눅스 커널에 있는 소스입니다./usr/src/linux/net/ipv4/arp.c 파일의 일부입니다.) ******************로 체크된 memcopy의 src_hw 부분을 제가 원하는 값으로 강제로 집어 넣고 싶은데요. 그래서.._-------------------------------이렇게 한 부분을 제가 넣었습니다. 결국 제가 하고 싶은 것은 unsigned char br_hwaddr에 16진수로 FF(0xFF)인 unsigned char를 넣고 싶은 것입니다. 그것도 6개를 쫙 붙여서... (찍어보니까..y 자 위에 점 두개 찍혀있는 그런 문자던데....) 그런데...이 부분을..즉..제가 수정한 부분만을 따로 띄어내서 컴파일 하면..정상적으로 동작합니다. 그러나 이렇게 수정하고..커널 컴파일을 하면..커널 패닉이 나고..에러들이 쫙 뜨면서..아무것도 안 먹습니다... 한..2틀동안 이것 저것 해보면서..커널 컴파일만..40번을 넘게 햇습니다. 도와주세요..어디가 문제인지..ㅜ.ㅜ void arp_send(int type, int ptype, u32 dest_ip, struct net_device *dev, u32 src_ip, unsigned char *dest_hw, unsigned char *src_hw, unsigned char *target_hw) { struct sk_buff *skb; struct arphdr *arp; unsigned char *arp_ptr; ------------------------------------------------------ 제가 새로 넣은 부분입니다. unsigned char buffer[6]; unsigned char *br_hwaddr; unsigned char *br_hwaddr_temp; *br_hwaddr_temp = (unsigned char)255; strcat(buffer, br_hwaddr_temp); strcat(buffer, br_hwaddr_temp); strcat(buffer, br_hwaddr_temp); strcat(buffer, br_hwaddr_temp); strcat(buffer, br_hwaddr_temp); strcat(buffer, br_hwaddr_temp); br_hwaddr = buffer; 여기까지..추가. ------------------------------------------------------------ /* * No arp on this interface. */ if (dev->flags&IFF_NOARP) return; /* * Allocate a buffer */ skb = alloc_skb(sizeof(struct arphdr)+ 2*(dev->addr_len+4) + dev->hard_header_len + 15, GFP_ATOMIC); if (skb == NULL) return; skb_reserve(skb, (dev->hard_header_len+15)&~15); skb->nh.raw = skb->data; arp = (struct arphdr *) skb_put(skb,sizeof(struct arphdr) + 2*(dev->addr_len+4)); skb->dev = dev; skb->protocol = __constant_htons (ETH_P_ARP); if (src_hw == NULL) src_hw = dev->dev_addr; if (dest_hw == NULL) dest_hw = dev->broadcast; /* * Fill the device header for the ARP frame */ if (dev->hard_header && dev->hard_header(skb,dev,ptype,dest_hw,src_hw,skb->len) < 0) goto out; /* * Fill out the arp protocol part. * * The arp hardware type should match the device type, except for FDDI, * which (according to RFC 1390) should always equal 1 (Ethernet). */ /* * Exceptions everywhere. AX.25 uses the AX.25 PID value not the * DIX code for the protocol. Make these device structure fields. */ switch (dev->type) { default: arp->ar_hrd = htons(dev->type); arp->ar_pro = __constant_htons(ETH_P_IP); break; #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) case ARPHRD_AX25: arp->ar_hrd = __constant_htons(ARPHRD_AX25); arp->ar_pro = __constant_htons(AX25_P_IP); break; #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE) case ARPHRD_NETROM: arp->ar_hrd = __constant_htons(ARPHRD_NETROM); arp->ar_pro = __constant_htons(AX25_P_IP); break; #endif #endif #ifdef CONFIG_FDDI case ARPHRD_FDDI: arp->ar_hrd = __constant_htons(ARPHRD_ETHER); arp->ar_pro = __constant_htons(ETH_P_IP); break; #endif #ifdef CONFIG_TR case ARPHRD_IEEE802_TR: arp->ar_hrd = __constant_htons(ARPHRD_IEEE802); arp->ar_pro = __constant_htons(ETH_P_IP); break; #endif } arp->ar_hln = dev->addr_len; arp->ar_pln = 4; arp->ar_op = htons(type); arp_ptr=(unsigned char *)(arp+1); ****************************************************** /* memcpy(arp_ptr, src_hw, dev->addr_len); <---이 부분아래와 같이 수정하고 주석으로 막아놨습니다.? memcpy(arp_ptr, br_hwaddr, dev->addr_len); <-이렇게 바꿨습니다. ******************************************************** arp_ptr+=dev->addr_len; memcpy(arp_ptr, &src_ip,4); arp_ptr+=4; if (target_hw != NULL) memcpy(arp_ptr, target_hw, dev->addr_len); else memset(arp_ptr, 0, dev->addr_len); arp_ptr+=dev->addr_len; memcpy(arp_ptr, &dest_ip, 4); dev_queue_xmit(skb); return; out: kfree_skb(skb); }
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved