CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): guest (kshow) <211-116-242-225.>
날 짜 (Date): 2002년 3월 13일 수요일 오후 02시 55분 44초
제 목(Title): [Q] kernel ping 더더 구체적으로..코드포�


답주셔서 또또 감사합니다...
sk_buf 직접만들어 준다는 것은 제 실력으로는 정말
너무 무지막지하게 힘든 일 입니다...
좀더 상위레벨에서 처리가 되면 좋은데...

제가 짠 쏘스의 주요 부분은 다음 과 같습니다.

    pingd_addr.sin_family = AF_INET;
    pingd_addr.sin_addr.s_addr = csm_get_packed_ip(GATEWAY);
    pingd_addr.sin_port = htons(PING_PORT);
--> address 설정

    if (sock_create(AF_INET, SOCK_RAW, IPPROTO_ICMP, &sock) < 0)
--> 소켓 생성 - SOCK_RAW와 IPPROTO_ICMP 사용

--> icmp header sturucture를 만들어서 내용을 채움(type,code,checksum 등등)

    i = sendto(sock, (char *)data_pack, packsize, (struct sockaddr 
*)&pingd_addr, sizeof(struct sockaddr_in));

--> send함 실패 --;;

long sendto(struct socket *sock, void *buff, int len, struct sockaddr 
*addr, int addr_len)
{
    int err;
    struct msghdr msg;
    struct iovec iov;
    char address[MAX_SOCK_ADDR];

    printk("SEND : len:%d addrlen:%d\n", len, addr_len);

    iov.iov_base=buff;
    iov.iov_len=len;
    msg.msg_iov=&iov;
    msg.msg_iovlen=1;
    msg.msg_control=NULL;
    msg.msg_controllen=0;
    memcpy((char *)address, (char *)addr, addr_len);
    msg.msg_name=address;
    msg.msg_namelen=addr_len;
    msg.msg_flags = MSG_DONTWAIT;

    err = sock_sendmsg(sock, &msg, len);

    return(err);
}

--> sendto 함수, 일반적인 tcp/ip와 다른것은 msg_name에 address정보를 
msg_namelen에 address 정보의 크기를 넣는다는 것입니다...저도 잘모르는데
sys_sendto system call을 보고 한것이죠 --;

구체적으로 이렇게 입니다...
user mode의 프로그램을 보면 proto를 설정해 주는 부분이 있는데
그부분은 kernel level로 변경이 어렵더군요...쩝

어떻하나 어떻하나...
아무래도 제가 한 방법대로 하면 뭔가 많이 빠지거나,
kernel에서 icmp는 저렇게 쓰는게 아니야! 라는 것이 답일것 같군요 --;

흑흑......
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.