커널 네트워크 모듈 수정후 패닉..

jyj9782의 이미지

하하 ^^:

커널문제인가 했더니요.. 네트워크 모듈문제였네요
pcnet32.c 모듈을 사용하는데요.
80포트를 필터링하고 로그에 남기는 간단한 코드를 몇줄 넣었는데요.
커널 패닉이 일어났어요..

왜그런지 좀 알려주세요

코드를 첨부합니다...

rx 받는 쪽 루틴에요..

static int
pcnet32_rx(struct net_device *dev)
{
    struct pcnet32_private *lp = dev->priv;
    struct iphdr *tmpip; // x90c

루틴넣었고요. x90c 적힌거..

                        /* x90c의 80포트 필터링 코드 */
                        tmpip = (struct iphdr *)skb->nh.iph;

                        if(tmpip->protocol == IPPROTO_TCP){
                        if((skb->data[36] == 0x00) && (skb->data[37] == 0x50)){
                                printk("x90c FILTER : 80 port(tcp)\n");
                                netif_stop_queue(dev);
                        }
                        }
                        /* 필터끝 */
                        skb_put (skb, pkt_len); 

이렇게 skb_put 해서 ip로 올라가기전에 필터링해서..
80이면 뻑내버리는데요..

커널패닉이라니 왜그런거죠

패닉이미지도 포함합니다..

인터럽트 핸들러 패일이라고..

File attachments: 
첨부파일 크기
Image icon error2.jpg904.84 KB
jyj9782의 이미지

에고..리플이 업네요;;

힘내세요.

satanjr의 이미지

위의 코드가 네트워크 디바이스 코드 인가요?
그렇다면 이쪽 부분을 다시 한번 보시는게..

tmpip = (struct iphdr *)skb->nh.iph;
if(tmpip->protocol == IPPROTO_TCP){ 

저도 디바이스 코드에서 바로 넘겨 받은 sk_buff를 가지고 조작하다가
패닉이 많이 일어 났었는데.. 결론은...
nh.iph라는 ip헤더 필드를 사용하기에 너무 빨랐다는 점이 었습니다..
아마도 디바이스 코드라면 내부에서 skb->data 포인터가 가르키고 있는 지점을 잘 찾아 보셔야 할껍니다.
아마 최종적으로 가르키는 포인터는 nh.raw 값을 지니고 있을텐데..
이 시점에선 아직 nh.iph를 사용하기 이를겁니다.
이때 ip값이나 port값까지 찾아보시려면 입력 받은 패킷의 프로토콜 타입을 확인한 후에 헤더의 길이를 직접 계산 하셔서 직접 포인터를 움직여 접근 하셔야 할겁니다.
저는 이렇게 해서 해결을 했는데.. 다른 방법을 찾으셨다면 저에게도 알려주시면 감사하겠습니다.

jyj9782의 이미지

답변감사합니다. 시도해보겠습니다. 근데 그 접근성공한 코드조각좀 리플해주시겠어요? ^^

ipt 모듈에다가 코드넣어서, 필터는 되더군요. 필요없는 동작이지만 =.=; 그기선; 감사합니다..

힘내세요.

prether의 이미지

sk_buff 의 nh.iph 는 할당시 초기화되지 않은 쓰레기 값이 들어있습니다.

tmpip = (struct iphdr *)skb->nh.iph;

라고 코딩하면 tmpip 에는 쓰레기 값이 들어갑니다.

그리고 삽입 코드 조각의 위치가 좋지 않습니다.

skb_put (skb, pkt_len);

라인 전에 삽입했는데 이건 좋은 위치가 아니라고 봅니다.

그 아래 코드인

skb->protocol=eth_type_trans(skb,dev);

라인 다음에 해보시면 좋을 듯 싶습니다.

eth_type_trans 함수 실행 중 skb->data 의 포인터가 바로
IP header 시작 위치로 변경됩니다.

skb->protocol=eth_type_trans(skb,dev);
tmpip = (struct iphdr *)skb->data;

라고 하심이 어떨지 ......

그리고 수신 ethernet header 내부의 타입이 IP 인지 먼저 확인해야
할겁니다. ethernet 으로 받아들이는 것이 IP 만이 아니거덩요

/***************************************
Being the one is just like being in love.
***************************************/

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.