아래의 소스에서 (리눅스 커널에 있는 소스입니다./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);
}