커널에 전송층 프로토콜을 추가하려고 합니다.
글쓴이: dong1036 / 작성시간: 화, 2009/01/13 - 10:49오전
#define IPPROTO_SDP 137
static struct net_protocol sdp_protocol = {
.handler = sdp_rcv,
.err_handler = sdp_err,
.no_policy = 1,
};
struct proto sdp_prot = {
.name = "SDP",
.owner = THIS_MODULE,
.close = udp_lib_close,
.connect = ip4_datagram_connect,
.disconnect = udp_disconnect,
.ioctl = udp_ioctl,
.init = udplite_sk_init,
.destroy = udp_destroy_sock,
.setsockopt = udp_setsockopt,
.getsockopt = udp_getsockopt,
.sendmsg = sdp_sendmsg,
.recvmsg = sdp_recvmsg,
.sendpage = udp_sendpage,
.backlog_rcv = udp_queue_rcv_skb,
.hash = udp_lib_hash,
.unhash = udp_lib_unhash,
.get_port = udplite_v4_get_port,
.obj_size = sizeof(struct udp_sock),
};
static struct inet_protosw sdp_inetsw = {
.type = SOCK_DGRAM,
.protocol = IPPROTO_SDP,
.prot = &sdp_prot,
.ops = &inet_dgram_ops,
.capability = -1,
.no_check = 0,
.flags = INET_PROTOSW_PERMANENT,
};
int __init sdp_init(void)
{
if(proto_register(&sdp_prot, 1))
printk("proto_register error\n");
if(inet_add_protocol(&sdp_protocol, IPPROTO_SDP) < 0) {
printk("inet_add_protocol error\n");
proto_unregister(&sdp_prot);
}
inet_register_protosw(&sdp_inetsw);
return 0;
}
void __exit sdp_exit(void)
{
proto_unregisteer(&sdp_prot);
inet_del_protocol(&sdp_protocol, IPPROTO_SDP);
}
module_init(sdp_init);
module_exit(sdp_exit);커널에 전송층 프로토콜을 추가시키려고 합니다.
소스의 일부분인데.. 다 구현은 안 했지만... 이런 형식으로 추가시키는게 맞는지 궁금하네요 ;;
그리고.. struct proto 에서 .obj_size 가 무엇인지 잘 모르겠네요;;
소스를 봐도 잘 이해가 안되서 이렇게 질문 드립니다.
Forums:


추가하는 방식은
추가하는 방식은 맞습니다.
obj_size는 프로토콜 별로 따로 관리해야하는 정보를 담는 구조체(ex> udp_sock, tcp_sock)의 크기 입니다. 별도의 프로토콜을 추가 하신다니, 이 구조체를 선언해서 필요한 정보들을 넣어 주시면 되겠군요.
------------------------------------------
http://onestep.tistory.com
Just do it!
답변 갑사합니다. ^^
제가 만들려고 하는 프로토콜은 일단 먼저 아주 간단하게...
포트를 제외시키고.. 이걸 제외시키면 전송층 프로토콜이라 부르기가 좀 그렇지만..
일단 제가 만들려고 하는 헤더는 4바이트로써 count(2byte) + length(2byte)의 간단한 헤더를 추가시켜
단순히 send 하고 read하는 프로토콜을 만들고자 합니다.
struct proto에 정의되어있는 모든 것을 정의해야 하나요?? 예를 들면,, hash, getport .. ojb_size .. 등등
단순히 필요한 것만 하면 될것 같은데..
obj_size가 프로토콜을 따로 관리해야 하는 정보를 담는 구조체의 크기라고 말씀하셨는데..
udp_sock 구조체를 보면.. 구체적으로 어떤 정보들인가요??
그리고 struct udp_sock* udp_sk(struct sock *sk) 함수를 보면..
단순히 return (struct udp_sock*)sk; 로 구현되었는데...
이게 어떤식으로 되는것인지;; 구조체를 보면 서로 다른 구조체인데.. 궁금하네요;;
염치스럽지만.. 답변 부탁드립니다 (^^
음 냐냐~
댓글 달기