16진수 값을 넣고 싶은데요...
아래의 소스에서 (리눅스 커널에 있는 소스입니
다./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);
}

Re: 16진수 값을 넣고 싶은데요...
제가 새로 넣은 부분입니다.
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;
여기까지..추가.
------------------------------------------------------------
br_hwaddr 를 다른 용도로 쓰시지 않는다면
unsigned char br_hwaddr[6] = {255, 255, 255, 255, 255, 255};
정도로 하시거나, 또는 변경되지 않는다면 static 을 붙여주시는것도
괜찮을 듯 싶습니다.
strcat() 은 source문자열 뒤에 dest문자열을 복사하는 것이기 때문에
잘못된 결과가 나옵니다.
*br_hwaddr_temp = (unsigned char)255; br_hwaddr_temp가 초기화되어 있지 않기 때문에 임의의 곳을 가리킬 수
있고, 위의 할당문에 의해 메모리상의 어디엔가의 값이 255로 바뀌었습니
다. 잘못된 코드이고요.
strcat(buffer, br_hwaddr_temp); br_hdaddr_temp 가 가리키는 맨 첫 바이트는 255를 가지고 있지만 그 후
에 어떤 값이 있을지 모릅니다. 따라서 위 문장은 255를 buffer에 복사하
는 것이 아니라 br_hwaddr_temp 가 가리키고 있는 곳에서 NULL (0) 이 나
올때까지 있는 문자열을 buffer에 복사합니다. 몇 바이트가 복사될지는
알 수 없습니다.
strcat()을 6번 호출했는데, br_hwaddr_temp가 가리키는 곳의 다음 바이
트에 바로 0이 온다고 하더라도 NULL까지 복사되기 때문에 buffer에는
255 여섯개와 끝에 NULL 을 포함해서 7바이트의 문자가 필요하게 됩니
다. 따라서 메모리를 깨 먹겠죠.
지금의 경우는 아마 br_hdaddr 을 깨 먹을 것 같은데 곧바로 br_hwaddr
이 buffer를 가리키도록 할당되기 때문에 영향은 없겠지만 위험한 코드입
니다.
정말 감사합니다.
지금 말씀하신대로 해보고
다시 커널 컴파일 하고 있습니다.
결과는 아직 안나왔지만..대충 어디가 문제인지..
많은 도움이 되었습니다.
그럼..
좋은 하루되세요.