커널에 전송층 프로토콜을 추가하려고 합니다.

dong1036의 이미지

#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 가 무엇인지 잘 모르겠네요;;
소스를 봐도 잘 이해가 안되서 이렇게 질문 드립니다.

태훈의 이미지

추가하는 방식은 맞습니다.

obj_size는 프로토콜 별로 따로 관리해야하는 정보를 담는 구조체(ex> udp_sock, tcp_sock)의 크기 입니다. 별도의 프로토콜을 추가 하신다니, 이 구조체를 선언해서 필요한 정보들을 넣어 주시면 되겠군요.

------------------------------------------
http://onestep.tistory.com

Just do it!

dong1036의 이미지

제가 만들려고 하는 프로토콜은 일단 먼저 아주 간단하게...

포트를 제외시키고.. 이걸 제외시키면 전송층 프로토콜이라 부르기가 좀 그렇지만..

일단 제가 만들려고 하는 헤더는 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; 로 구현되었는데...

이게 어떤식으로 되는것인지;; 구조체를 보면 서로 다른 구조체인데.. 궁금하네요;;

염치스럽지만.. 답변 부탁드립니다 (^^

음 냐냐~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.