본문 바로가기
콤퓨타/Linux

ping 소스 수정

by 어니엉 2013. 2. 20.
728x90

환경 : Vmware, CentOS 5.5

소스위치 : /usr/src/linux/drivers/net/pcnet32.c
(vmware는 pcnet32)


<!--[if !mso]-->

<!--[endif]-->

static int pcnet32_tx(struct net_device*dev)

{

structpcnet32_private *lp= netdev_priv(dev);

unsignedint dirty_tx= lp->dirty_tx;

int delta;

int must_restart = 0;


/*여기 0으로 초기화한 전역변수 flag를 이용한 조건문.

if(flag==0){

printk(KERN_DEBUG"YoungNam >_< \n");

flag=1; }

을 추가한다.

*/

while(dirty_tx != lp->cur_tx) {

intentry = dirty_tx& lp->tx_mod_mask;

intstatus = (short)le16_to_cpu(lp->tx_ring[entry].status);

if(status < 0)

break; /* It still hasn't been Txed */

lp->tx_ring[entry].base = 0;

if(status & 0x4000) {

/* There was a major error, log it. */

int err_status = le32_to_cpu(lp->tx_ring[entry].misc);

dev->stats.tx_errors++;

netif_err(lp, tx_err, dev,

"Tx error status=%04x err_status=%08x\n",

status, err_status);

if (err_status& 0x04000000)

dev->stats.tx_aborted_errors++;

if (err_status& 0x08000000)

dev->stats.tx_carrier_errors++;

if (err_status & 0x10000000)

dev->stats.tx_window_errors++;

#ifndef DO_DXSUFLO

if (err_status& 0x40000000) {

dev->stats.tx_fifo_errors++;

/* Ackk! On FIFO errors the Tx unit is turned off! */

/* Remove this verbosity later! */

netif_err(lp, tx_err, dev, "Tx FIFO error!\n");

must_restart = 1;

}

#else

if (err_status& 0x40000000) {

dev->stats.tx_fifo_errors++;

if (!lp->dxsuflo) { /* If controller doesn't recover ... */

/* Ackk! On FIFO errors the Tx unit is turned off! */

/* Remove this verbosity later! */

netif_err(lp, tx_err, dev, "Tx FIFO error!\n");

must_restart = 1;

}

}

#endif

} else{

if (status & 0x1800)

dev->stats.collisions++;

dev->stats.tx_packets++;

}

/* We must free the original skb */

if(lp->tx_skbuff[entry]) {

pci_unmap_single(lp->pci_dev,

lp->tx_dma_addr[entry],

lp->tx_skbuff[entry]->

len, PCI_DMA_TODEVICE);

dev_kfree_skb_any(lp->tx_skbuff[entry]);

lp->tx_skbuff[entry] = NULL;

lp->tx_dma_addr[entry] = 0;

}

dirty_tx++;

}

delta= (lp->cur_tx- dirty_tx) & (lp->tx_mod_mask + lp->tx_ring_size);

if (delta > lp->tx_ring_size) {

netif_err(lp, drv, dev, "out-of-sync dirty pointer, %d vs. %d, full=%d\n",

dirty_tx, lp->cur_tx, lp->tx_full);

dirty_tx+= lp->tx_ring_size;

delta-= lp->tx_ring_size;

}

if (lp->tx_full&&

netif_queue_stopped(dev) &&

delta < lp->tx_ring_size - 2) {

/* The ring is no longer full, clear tbusy. */

lp->tx_full = 0;

netif_wake_queue(dev); }

lp->dirty_tx = dirty_tx;

returnmust_restart;

}






결과 : 핑날리면 메시지랑 같이 뜸ㅋㅋㅋ

재밌땅




※printk


상수선언문

의미

#define KERN_EMERGE

“<0>” 시스템이 동작하지 않는다.

#define KERN_ALERT

“<1>” 항상 출력된다.

#define KERN_CRIT

“<2>” 치명적인 정보

#define KERN_ERR

“<3>” 오류 정보

#define KERN_WARNING

“<4>” 경고 정보

#define KERN_NOTICE

“<5>” 정상적인 정보

#define KERN_INFO

“<6>” 시스템 정보

#define KERN_DEBUG

“<7>” 디버깅 정보



Ex) KERN_INFO의 동일한 표현

Printk(KERN_INFO”system ok\n”);

Printk(“<6>””system ok\n”);

Printk(“<6>system ok\n”);

728x90

'콤퓨타 > Linux' 카테고리의 다른 글

CentOS에서 vi를 vim으로  (0) 2013.02.20
locate 명령어에 문제가 발생했을 경우  (0) 2013.02.20
ubuntu 10.10 사용자 등록할 때  (0) 2013.02.20
gdb 인자넣고시작  (0) 2013.02.20
stack overflow???????  (0) 2013.02.20

댓글