| [ 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는 저렇게 쓰는게 아니야! 라는 것이 답일것 같군요 --; 흑흑...... |