Embedded °æ (¾«»ªÇø)

·¢ÐÅÈË: he (hehe), ÐÅÇø: Embedded_system
±ê  Ìâ: (ldd) Ch14-ÍøÂçÇý¶¯³ÌÐò(ÏÂ) (zz)
·¢ÐÅÕ¾: ¹þ¹¤´ó×϶¡Ïã (2001Äê06ÔÂ24ÈÕ17:23:00 ÐÇÆÚÌì), Õ¾ÄÚÐżþ



´ò¿ªºÍ¹Ø±Õ

ÎÒÃǵÄÇý¶¯³ÌÐò¿ÉÒÔÔÚÄ£¿é¼ÓÔغͺËÐÄÒýµ¼Ê±Ì½²â½Ó¿Ú¡£ÏÂÒ»²½ÊǸø½Ó¿Ú¸³Ò»¸öµØÖ·£¬
ÕâÑùÇý¶¯³ÌÐò¾Í¿ÉÒÔͨ¹ýËü½»»»Êý¾ÝÁË¡£´ò¿ªºÍ¹Ø±ÕÒ»¸ö½Ó¿ÚÓÉifconfigÃüÁîÍê³É¡£

µ±Ê¹ÓÃifconfigΪһ¸ö½Ó¿Ú¸³µØַʱ£¬ËüÍê³ÉÁ½Ï×÷¡£µÚÒ»£¬Ëüͨ¹ý
ioctl(SIOCSIFADDR)(¼´Socket I/O Control Set InterFace ADDRess)À´¸³µØÖ·¡£½Ó×Å
Ëüͨ¹ýioctl(SIOCSIFFLAGS)(¼´Socket I/O Control Set InterFace FLAGS) ¶Ôdev->fl
agÖеÄIFF_UPÖÃλÀ´´ò¿ª½Ó¿Ú¡£

ÖÁÓÚÉ豸£¬ioctl(SIOCSIFADDR)ÉèÖÃdev->pa_addr£¬dev->family£¬dev->pa_mask£¬dev-
>pa_brdaddr£¬Ã»ÓÐÇý¶¯³ÌÐòº¯Êý±»µ÷ÓÃ----Õâ¸öÈÎÎñÊÇÉ豸Î޹صģ¬ÓɺËÐÄÀ´Íê³É¡£²»
¹ý£¬ºóÒ»¸öÃüÁîioctl(SIOCSIFFLAGS)ΪÉ豸µ÷ÓÃopen·½·¨¡£

ÀàËƵأ¬µ±Ò»¸ö½Ó¿Ú¹Ø±Õʱ£¬ifconfigʹÓÃioctl(SIOCSIFFLAGS)À´Çå³ýIFF_UP£¬²¢ÇÒµ÷
ÓÃstop·½·¨¡£


Á½¸öÉ豸·½·¨Ôڳɹ¦Ê±¶¼·µ»Ø0£¬·¢Éú´íÎóʱ£¬Í¨³£·µ»ØÒ»¸ö¸ºÖµ¡£

ÖÁÓÚ´úÂ룬Çý¶¯³ÌÐò±ØÐëÖ´ÐÐÓë×Ö·ûºÍ¿éÉ豸ͬÑùµÄ¹¤×÷¡£openÇëÇóËüËùÐèÒªµÄËùÓеÄ
ϵͳ×ÊÔ´£¬²¢¸æËß½Ó¿ÚÆô¶¯£»stopÔò¹Ø±Õ½Ó¿Ú£¬²¢ÊÍ·Åϵͳ×ÊÔ´¡£

Èç¹ûÇý¶¯³ÌÐò²»×¼±¸Ê¹Óù²ÏíÖжϣ¨ÀýÈ磬Ëü²»´òËãÓë¾ÉµÄºËÐļæÈÝ£©£¬»¹ÓÐ×îºóÒ»²½
ÐèÒª×ö¡£ºËÐÄÒý³öÒ»¸öirq2dev_mapÕóÁУ¬ËüÓÉIRQºÅÑ°Ö·£¬³ÖÓпÕÖ¸Õ룻Çý¶¯³ÌÐòÒ²Ðí
ÏëÓÃÕâ¸öÊý×齫ÖжϺÅÓ³Éäµ½Ö¸Ïòdevice½á¹¹µÄÖ¸Õë¡£ÕâÊÇÔÚ²»Ê¹Óýӿڴ¦Àí³ÌÐòµÄÇé
¿öÏ£¬ÔÚÒ»¸öÇý¶¯³ÌÐòÀïÖ§³ÖÒ»¸öÒÔÉϽӿڵÄΨһ·½·¨¡£

ÁíÍ⣬ÔÚ½Ó¿Ú¿ÉÒÔºÍÍâ½çͨÐÅÒÔÇ°£¬Ó²¼þµØÖ·»¹±ØÐë´Ó°åÉϸ´ÖƵ½dev->dev_addr¡£Ó²¼þ
µØÖ·¿ÉÒÔ°´Çý¶¯³ÌÐòµÄÒâÔ¸ÔÚ̽²âʱ»ò´ò¿ªÊ±±»¸³Öµ¡£snullÈí¼þ½Ó¿Úʱ´ÓopenÀï¶ÔÆ丳
Öµ£»ËüÓÃÁ½¸öASCII´®Î±ÔìÒ»¸öÓ²¼þºÅÂë¡£µØÖ·µÄµÚÒ»¸ö×Ö½ÚÊǸö¿Õ×Ö·û£¨ÔÚºóÃæµÄ¡°µØ
Ö·½âÎö¡±ÖнâÊÍ£©¡£

½á¹ûµÃµ½µÄopen´úÂëÈçÏÂËùʾ£º

£¨´úÂë319£©

£¨´úÂë320 #1£©

ÕýÈçÄãËù¿´µ½µÄ£¬device½á¹¹Öеļ¸¸öÓò±»ÐÞ¸ÄÁË¡£start±íÃ÷½Ó¿ÚÒÑ×¼±¸ºÃ£¬ tbusy¶Ï
ÑÔ·¢ËÍÕß²»Ã¦£¨Ò²¾ÍÊÇ˵£¬ºËÐÄ¿ÉÒÔ·¢³öÒ»¸ö°ü£©¡£

stop·½·¨ÊÇopenµÄ²Ù×÷µÄ·´×ª¡£ÓÉÓÚÕâ¸öÔ­Òò£¬ÊµÏÖ stopµÄº¯Êýͨ³£µ÷Óàclose¡£

£¨´úÂë320 #2£©



°ü·¢ËÍ

ÍøÂç½Ó¿ÚÖ´ÐеÄ×îÖØÒªµÄ¹¤×÷ÊÇÊý¾Ý·¢ËͺͽÓÊÕ¡£ÎÒ×¼±¸´Ó·¢ËÍ¿ªÊ¼£¬ÒòΪËüÏà¶Ô±È½Ï
¼òµ¥¡£

µ±ºËÐÄÐèÒª·¢ËÍÒ»¸öÊý¾Ý°üʱ£¬Ëüµ÷ÓÃhard_start_transmit·½·¨½«Êý¾Ý·Åµ½Ò»¸öÊä³ö¶Ó
ÁС£ºËÐÄ´¦ÀíµÄÿ¸ö°ü°üº¬ÔÚÒ»¸öÌ×½Ó×Ö»º³åÇø½á¹¹£¨struct sk_buff£©ÖУ¬Æ䶨Òå¼û<
linux/skbuff.h>¡£Õâ¸ö½á¹¹´ÓUnixÓÃÀ´±íʾһ¸öÍøÂçÁ¬½ÓµÄ³éÏ󣬼´Ì×½Ó×ÖµÃÃû¡£¼´Ê¹
½Ó¿ÚÓëÌ×½Ó×ÖÎ޹أ¬Ã¿¸öÍøÂç°üÔڽϸߵÄÍøÂç²ãÖÐÒ»¶¨ÊôÓÚij¸öÌ×½Ó×Ö£¬ÈκÎÌ×½Ó×ÖµÄ
ÊäÈëÊä³ö»º³åÇø¶¼ÊÇsk_buff½á¹¹µÄÁÐ±í¡£Í¬ÑùµÄsk_buff½á¹¹ÔÚÕû¸öLinuxÍøÂç×ÓϵͳÖÐ
¶¼±»ÓÃÀ´³ÐÔØÍøÂçÊý¾Ý£¬µ«ÔÚ¿¼ÂǽӿÚʱ£¬Ò»¸öÌ×½Ó×Ö»º³åÇø¾ÍÊÇÒ»¸ö°ü¡£

Ö¸Ïòsk_buffµÄÖ¸Õëͨ³£±»³Æ×öskb£¬ÎÒ½«ÔÚʾÀýºÍÕýÎÄÖж¼Ê¹ÓÃʹÓÃÕâ¸öÏ°¹ß¡£


Ì×½Ó×Ö»º³åÇøÊÇÒ»¸ö¸´ÔӵĽṹ£¬ºËÐÄÌṩһ×麯ÊýÀ´¶ÔÆä²Ù×÷¡£ÕâЩº¯ÊýÔÚºóÃæµÄ¡°
Ì×½Ó×Ö»º³åÇø¡±ÖÐÃèÊö----Ä¿Ç°£¬ÖªµÀsk_buffµÄһЩ»ù±¾ÊÂʵÒÑ×ãÒÔд³ö¿É¹¤×÷µÄÇý¶¯
³ÌÐò¡£ÁíÍ⣬ÎÒÏ°¹ßÓÚÔÚÔúÈëÁíÈËÌÖÑáµÄϸ½Ú֮ǰÏÈŪÃ÷°×ÊÇÈçºÎ¹¤×÷µÄ¡£

´«µÝ¸øhard_start_xmitµÄÌ×½Ó×Ö»º³åÇøº¬ÓÐÎïÀí°ü£¬Ëü¾ßÓд«Êä²ãµÄ°üÍ·¡£½Ó¿Ú²»ÐèÒª
Ð޸ı»·¢Ë͵ÄÊý¾Ý¡£skb->dataÖ¸Ïò±»·¢Ë͵İü£¬skb->lenÊÇËüµÄ³¤¶È£¬ÒÔ°ËÔª×éΪµ¥Î»
¡£

snullµÄ°ü·¢ËÍ´úÂëÈçÏÂËùʾ£»ÎïÀí·¢ËÍ»úÖƱ»¸ôÀëÔÚÁíÒ»¸öº¯ÊýÖУ¬ÒòΪÿ¸ö½Ó¿ÚÇý¶¯
³ÌÐò±ØÐë°´ÕÕ±»Çý¶¯µÄÌض¨Ó²¼þÀ´ÊµÏÖËü¡£

£¨´úÂë321£©

ÕâÑù·¢Ëͺ¯ÊýÖ»½øÐÐһЩÇåÎúµÄ¶Ô°üµÄ¼ì²é£¬²¢Í¨¹ýÓ²¼þÏà¹ØµÄº¯Êý·¢ËÍÊý¾Ý¡£ÔÚÒ»¸ö
ÖжϱíÃ÷Ò»¸ö¡°·¢ËͽáÊø¡±µÄÌõ¼þʱ£¬dev->tbusy±»Çå³ý¡£



°ü½ÓÊÕ

´ÓÍøÂçÖнÓÊÕÊý¾Ý±È·¢ËÍÒª¸´ÔÓһЩ£¬ÒòΪ±ØÐë·ÖÅäÒ»¸ösk_buff£¬²¢´ÓÒ»¸öÖжϴ¦Àí³Ì
ÐòÖн«Æä½»µÝ¸ø¸ß²ã----½ÓÊÕ°üµÄ×îºÃµÄ°ì·¨ÊÇͨ¹ýÖжϣ¬³ý·Ç½Ó¿ÚÊÇÏósnullÒ»ÑùÊÇ´¿
Èí¼þµÄ£¬»òÊÇ»·»Ø½Ó¿Ú¡£¾¡¹ÜÓпÉÄÜдÂÖѯµÄÇý¶¯³ÌÐò£¬¶øÇÒÔÚÕýʽµÄºËÐÄÀïÒ²µÄÈ·ÓÐ
¼¸¸ö£¬µ«ÖжÏÇý¶¯µÄÒªºÃµÄ¶à£¬²»¹ÜÊÇÔÚÊý¾ÝÍÌÍÂÂÊ»¹ÊǼÆËãÐèÇóÉÏ¡£ÓÉÓÚ¾ø´ó¶àÊýÍø
Âç½Ó¿Ú¶¼ÊÇÖжÏÇý¶¯µÄ£¬ÎÒ²»´òËã̸ÂÛÂÖѯʵÏÖ£¬ËüÖ»ÊÇÀûÓÃÁ˺ËÐļÆʱÆ÷¡£

snullµÄʵÏÖÊǽ«Ó²¼þϸ½ÚºÍÉ豸Î޹صŤ×÷·ÖÀ뿪µÄ¡£ÕâÑù£¬ÔÚÓ²¼þÊÕµ½Ò»¸ö°üºó£¬sn
ull_rx±»µ÷Óã¬ËüÒѾ­ÔÚ¼ÆËã»úµÄÄÚ´æÖÐÁË¡£snull_rxÒò´ËÊÕµ½Ò»¸öÖ¸ÏòÊý¾ÝµÄÖ¸ÕëºÍ
°üµÄ³¤¶È¡£¡£Õâ¸öº¯ÊýΨһµÄÔðÈξÍÊǽ«°üºÍһЩ¶îÍâÐÅÏ¢·¢Ë͵½ÍøÂç´úÂëµÄ¸ß²ã¡£Æä
´úÂëÓëÊý¾ÝÖ¸Õë¼°³¤¶È»ñµÃµÄ·½·¨Î޹ء£

£¨´úÂë322£©

Õâ¸öº¯Êý×㹻ͨÓ㬿ÉÒÔ×÷ΪÈκÎÍøÂçÇý¶¯³ÌÐòÄ£°æ£¬µ«ÔÚÄãÓÐÐÅÐÄÖØÓÃÕâ¸ö´úÂë¶ÎÖ®
Ç°»¹ÐèҪһЩ½âÊÍ¡£

×¢Ò⻺³åÇø·ÖÅ亯ÊýÐèÒªÖªµÀÊý¾Ý³¤¶È¡£Õß±ÜÃâÁËÔÚµ÷ÓÃkmallocʱÀË·ÑÄÚ´æ¡£dev_allo
c_skbÒÔÔ­×ÓÓÅÏȼ¶µ÷Ó÷ÖÅ亯Êý£¬Òò´ËËüÒ²¿ÉÒÔÔÚÖжÏʱ°²È«µØʹÓ᣺ËÐÄ»¹ÌṩÁËÌ×
½Ó×Ö»º³åÇø·ÖÅäµÄÆäËüһЩ½Ó¿Ú£¬µ«²»ÖµµÃÔÚÕâÀï½éÉÜ£»Ì×½Ó×Ö»º³åÇøÔÚ±¾ÕºóÃæµÄ¡°
Ì×½Ó×Ö»º³åÇø¡±ÖÐÏêϸ½éÉÜ¡£

Ò»µ©ÓÐÁËÒ»¸öÓÐЧµÄskbÖ¸Õ룬¾Í¿ÉÒÔͨ¹ýµ÷ÓÃmemcpy½«°üÊý¾Ý¸´ÖƵ½Õâ¸ö»º³åÇø¡£skb_
put¸üлº³åÇøÖÐÊý¾ÝβµÄÖ¸Õ룬²¢·µ»ØÒ»¸öÖ¸ÏòÐÂÉú³É¿Õ¼äµÄÖ¸Õë¡£


²»ÐÒµÄÊÇ£¬°üÍ·ÖÐûÓÐ×ã¹»µÄÐÅÏ¢À´ÕýÈ·´¦ÀíÍøÂç²ã----ÔÚ»º³åÇøÏòÉϲ㴫µÝ֮ǰ£¬dev
ºÍprotocolÓò±ØÐë±»¸³Öµ¡£½Ó×ÅÎÒÃÇÐèÒªÖ¸¶¨ÈçºÎÖ´ÐÐУÑéºÍ£¨snull²»½øÐÐÈκÎУÑéºÍ
£©¡£skb->ip_summed¿ÉÄܵIJßÂÔΪ£º

CHECKSUM_HW

°å×ÓÓÃÓ²¼þÖ´ÐÐУÑéºÍ¡£Ò»¸öÓ²¼þУÑéºÍµÄÀë×ÓÊÇSparc HME½Ó¿Ú¡£

CHECKSUM_NONE

УÑéºÍÍêÈ«ÓÐÈí¼þÍê³É¡£¶ÔзÖÅäµÄ»º³åÇø£¬ÕâÊÇȱʡµÄ²ßÂÔ¡£

CHECKSUM_UNNECESSARY

²»×öÈκÎУÑéºÍ¡£ÕâÊÇsnullºÍ»·»Ø½Ó¿ÚµÄ²ßÂÔ¡£

ÔÚ1.2ºËÐÄ°æ±¾ÖÐûÓÐУÑéºÍÑ¡ÏîºÍip_summed¡£

×îºó£¬Çý¶¯³ÌÐò¸üÐÂËüµÄͳ¼Æ¼ÆÊýÆ÷¼Ç¼һ¸öаü±»ÊÕµ½ÁË¡£Í³¼Æ½á¹¹Óм¸¸öÓò×é³É£¬
×îÖØÒªµÄÊÇrx_packetsºÍtx_packets£¬ËüÃÇ°üº¬ÊÕµ½µÄºÍ·¢Ë͵İüµÄ¸öÊý¡£ËùÓеÄÓòÔÚ
ºóÃæµÄ¡°Í³¼ÆÐÅÏ¢¡±Öиø³öÒ»¸ö³¹µ×µÄÃèÊö¡£


°ü½ÓÊÕµÄ×îºóÒ»²½ÓÉnetif_rxÍê³É£¬Ëü½«Ì×½Ó×Ö»º³åÇøµÝ½»µ½ÉÏÒ»²ã¡£



ÖжÏÇý¶¯µÄ²Ù×÷

´ó¶àÊýÓ²¼þ½Ó¿ÚÒÔÖжϴ¦Àí³ÌÐòµÄ·½Ê½¿ØÖÆ¡£½Ó¿ÚÖжϴ¦ÀíÆ÷±íÃ÷Á½ÖÖʼþÖеÄÒ»ÖÖ£º
Ò»¸öаüµ½´ïÁË»òÒ»¸ö°ü·¢ËÍÍê³ÉÁË¡£ÕâÖÖÒ»°ã»¯²¢²»ÊÇ×ÜÊÊÓ㬵«Ëü»ù±¾ÉϽÒʾÁËÓë
Òì²½°ü´«ËÍÏà¹ØµÄÎÊÌâ¡£PLIPºÍPPPÊDz»ÊÊÓÃÕâÖÖÒ»°ã»¯µÄÀý×Ó¡£ËüÃÇ´¦ÀíͬÑùµÄʼþ£¬
µ«µÍ¼¶Öжϴ¦ÀíÂÔÓв»Í¬¡£

Ò»°ãµÄÖжÏÀý³Ì¿ÉÒÔͨ¹ý¼ì²éÔÚÓ²¼þÉ豸ÉϵÄÒ»¸ö״̬¼Ä´æÆ÷À´·Ö±æаüµ½´ïÖжÏÓëÍê
³É·¢Ë͵Ä֪ͨ¡£snull½Ó¿Ú¹¤×÷·½Ê½ÀàËÆ£¬µ«Æä״̬×ÖÔÚdev->privÖС£ÍøÂç½Ó¿ÚµÄÖжÏ
´¦Àí³ÌÐò¿´ÆðÀ´ÈçÏ£º

£¨´úÂë324£©

´¦Àí³ÌÐòµÄµÚÒ»¸öÈÎÎñÊǽÓÊÕÒ»¸öÖ¸ÏòÕýÈ·µÄdevice½á¹¹µÄÖ¸Õë¡£Äã¿ÉÒÔÓÃirq2dev_map
[]£¨¼ÙÈçÄãÔÚ´ò¿ªÊǸøËü¸³ÁËÒ»¸öÖµ£©»òÕß½ÓÊÕµ½µÄdev_idÖ¸Õë×÷Ϊһ¸ö²ÎÊý¡£Èç¹ûÄã
Ï£ÍûÇý¶¯³ÌÐò¿ÉÒÔÓëÐÂÓÚ1.3.70µÄºËÐŤ×÷£¬Äã±ØÐëʹÓÃirq2dev_map[]£¬ÒòΪÔçÆÚ°æ±¾
ÖÐûÓÐdev_id¡£


Õâ¸ö´¦Àí³ÌÐòÖÐÓÐȤµÄ²¿·ÖÊÇ´¦Àí¡°·¢ËÍÍê³É¡±µÄ²¿·Ö¡£½Ó¿Úͨ¹ýÇå³ýdev->tbusy²¢±ê
Ö¾ÍøÂçÏ°벿Àý³ÌÀ´ÏàÓ¦·¢ËÍÍê³É¡£Èç¹ûnet_bhµÄÈ·ÔËÐÐÁË£¬Ëü»áÊÔͼ·¢ËÍËùÓеȴýµÄ
°ü¡£

ÁíÒ»·½Ã棬°ü½ÓÊÕ²¢²»ÐèÒªÈκÎÌØÊâµÄÖжϴ¦Àí¡£ËùÓÐÐèÒª×öµÄ¾ÍÊǵ÷ÓÃsnull_rx¡£

ʵ¼ÊÉÏ£¬µ±netif_rx±»½ÓÊÕº¯Êýµ÷ÓÃʱ£¬ËüËù½øÐеÄʵ¼Ê²Ù×÷Ö»ÓбêÖ¾net_bh¡£»»¾ä»°
˵£¬ºËÐÄÔÚÒ»¸öÏ°벿´¦Àí³ÌÐòÖÐÍê³ÉÁËËùÓÐÍøÂçÏà¹ØµÄ¹¤×÷¡£Òò´Ë£¬ÍøÂçÇý¶¯³ÌÐòÓ¦
¸Ã×ÜÊÇÐû³ÆËüµÄÖжϴ¦Àí³ÌÐòÌ«Âý£¬ÒòΪÏ°벿½«»á¸üÔçµØÖ´ÐУ¨¼ûµÚ¾ÅÕÂÖС°Ï°벿
Éè¼Æ¡±£©¡£



Ì×½Ó×Ö»º³åÇø

ÎÒÃÇÒѾ­ÌÖÂÛÁËÓÚÍøÂç½Ó¿ÚÏà¹ØµÄ¶àÊýÄÚÈÝ¡£ÏÂÃ漸½ÚÎÒÃǽ«¸üϸµØÌÖÂÛsk_buffʱÈçºÎ
Éè¼ÆµÄ¡£Õ⼸½Ú¼È½éÉÜÕâ¸ö½á¹¹µÄÖ÷ÒªÓò£¬Ò²½éÉÜÔÚÌ×½Ó×Ö»º³åÇøÉϲÙ×÷µÄº¯Êý¡£

¾¡¹Ü²¢Ã»ÓÐÀí½âsk_buffÄÚ²¿µÄÑϸñÐèÒª£¬µ«ÊÇÈç¹ûÄÜÀí½âËüµÄÄÚÈݽ«»áÓÐÖúÓÚÄã½â¾öÎÊ
ÌâºÍÓÅ»¯´úÂë¡£ÀýÈ磬Èç¹ûÄã¿´ÁËloopback.c£¬Äã»á·¢ÏÖÒ»¸ö»ùÓÚsk_buffÄÚ²¿ÖªÊ¶µÄÓÅ
»¯¡£


ÎÒ²»´òËãÔÚÕâÀïÃèÊöÕû¸ö½á¹¹£¬¶øÖ»ÊÇÄÇЩ¿ÉÄܱ»Çý¶¯³ÌÐòÓõ½µÄÓò¡£Èç¹ûÄãÏëÖªµÀ¸ü
¶à£¬Äã¿ÉÒÔ¿´<linux/skbuff.h>£¬½á¹¹µÄ¶¨ÒåºÍº¯ÊýµÄÔ­Ðζ¼ÔÚÄÇÀﶨÒå¡£ÖÁÓÚÕâЩÓò
ºÍº¯ÊýÈçºÎʹÓõÄϸ½Ú¿ÉÒÔͨ¹ýä¯ÀÀºËÐÄÔ´ÂëµÃµ½¡£

ÖØÒªµÄÓò

³öÓÚÎÒÃǵÄÄ¿µÄ£¬½á¹¹ÀïÖØÒªµÄÓòÊÇÄÇЩÇý¶¯³ÌÐòµÄ×÷Õß¿ÉÄÜÒªÓõ½µÄÓò¡£ËüÃÇÈçÏÂËù
ʾ£¬ÎÞÌرð˳Ðò¡£

struct device *dev;

É豸½ÓÊÕ»òÕß·¢ËÍÕâ¸ö»º³åÇø¡£

__u32 saddr;

__u32 daddr;

__u32 raddr;

Ô´µØÖ·£¬Ä¿µÄµØÖ·£¬ºÍ·ÓÉÆ÷µØÖ·£¬ÓÉIPЭÒéʹÓá£raddrÊÇ°üÒªµ½´ïÆäÄ¿µÄµØµÄµÚÒ»²½
¡£ÕâЩÓòÔÚ°ü±»·¢ËÍÇ°±»ÉèÖã¬ÊÕµ½Ö®ºó¾Í²»±Ø¸³ÖµÁË¡£µ½´ïhard_start_xmit·½·¨µÄÍâ
³ö°üÒѾ­ÓÐÁËÒ»¸öºÏÊʵÄÓ²¼þ°üÍ·ÉèÖ÷´Ó³ÁË¡°µÚÒ»²½¡±ÐÅÏ¢¡£

unsigned char *head;

unsigned char *data;

unsigned char *tail;

unsigned char *end;

ÕâЩָÕëÓÃÀ´·ÃÎÊ°üÖеÄÊý¾Ý¡£headÖ¸Ïò·ÖÅä¿Õ¼äµÄ¿ªÊ¼£¬dataÊÇÓÐЧ°ËÔª×éµÄ¿ªÊ¼£¨
ͨ³£±ÈheadÂԴ󣩣¬tailÊÇÓÐЧ°ËÔª×éµÄ½áÊø£¬ endÖ¸Ïòtail¿ÉÒÔµ½´ïµÄ×î´óµØÖ·¡£¹Û
²ìËüÃǵÄÁíÒ»¸ö·½·¨ÊÇ£º¿ÉÓûº³åÇø¿Õ¼äΪskb->end-skb->head£¬µ±Ç°Ê¹ÓõÄÊý¾Ý¿Õ¼ä
Ϊskb->tail-skb->data¡£ÕâÖÖ´¦ÀíÄÚ´æÇøÓòµÄÇåÎú·½·¨ÔÚ1.3¿ª·¢Ê±²ÅʵÏÖ¡£ÕâÊÇsnull
ûÓб»ÒÆÖ²ÔÚLinux1.2ÉϱàÒëµÄÖ÷ÒªÔ­Òò¡£

unsigned long len;

Êý¾Ý±¾ÉíµÄ³¤¶È£¨skb->tail-skb->head£©¡£

unsigned char ip_summed;

Õâ¸öÓòÓÐÇý¶¯³ÌÐò¶Ô½øÀ´°üÉèÖã¬ÓÉTCP/UDPУÑéºÍʹÓá£ËüÔÚÇ°ÃæµÄ¡°°ü½ÓÊÕ¡±ÖнéÉÜ
´°üÉèÖã¬ÓÉTCP/UDPУÑéºÍʹÓá£ËüÔÚÇ°ÃæµÄ¡°°ü½ÓÊÕ¡±ÖнéÉÜ
¹ý¡£

unsigned char pkt_type;

Õâ¸öÓò±»ÄÚ²¿ÓÃÀ´·¢ËͽøÀ´°ü¡£Çý¶¯³ÌÐò¸ºÔð½«ÆäÉèÖÃΪPACKET_HOST£¨Õâ¸ö°üÊÇÎҵģ©
£¬ PACKET_BROADCAST£¬PACKET_MULTICAST£¬»òÊÇPACKET_OTHERHOST£¨²»£¬Õâ¸ö°ü²»ÊÇÎÒ
µÄ£© ¡£ÒÔÌ«ÍøÇý¶¯³ÌÐò²¢²»ÏÔʽµØÐÞ¸Äpkt_type£¬ÒòΪeth_type_trans»áΪËü×öÕâ¼þÊÂ
¡£

union { unsigned char *raw; [¡­]} mac;

Óëpkt_typeÀàËÆ£¬Õâ¸öÓò±»ÓÃÀ´´¦Àí½øÀ´°ü£¬±ØÐëÔÚ°ü½ÓÊÕʱÉèÖ᣺¯Êýeth_type_tran
sΪÒÔÌ«ÍøÇý¶¯³ÌÐò¸ºÔðÕâ¼þÊ¡£·ÇÒÔÌ«ÍøÇý¶¯³ÌÐòÓ¦ÉèÖÃskb->mac.rawÖ¸Õ룬ºóÃæ¡°·Ç
ÒÔÌ«Íø°üÍ·¡±Öн«»áÌáµ½¡£



½á¹¹ÖÐÆäÓàµÄÓò²¢ÎÞÌرðÐËȤ¡£ËüÃDZ»ÓÃÀ´Î¬»¤»º³åÇøÁÐ±í£¬½âÊÍÕ¼Óлº³åÇøµÄÌ×½Ó×Ö
µÄÄڴ棬µÈµÈ¡£

ÔÚÌ×½Ó×Ö»º³åÇøÉϲÙ×÷µÄº¯Êý


ʹÓÃsock_buffµÄÍøÂçÉ豸ͨ¹ýÕýʽµÄ½Ó¿Úº¯ÊýÔÚÕâ¸ö½á¹¹ÉϲÙ×÷¡£ÓкܶàÔÚÌ×½Ó×Ö»º³å
ÇøÉϲÙ×÷µÄº¯Êý£¬ÏÂÃæÊÇ×îÓÐȤµÄһЩ£º

struct sk_buff *alloc_skb(unsigned int len, int priority);

struct sk_buff *dev_alloc_skb(unsigned int len);

·ÖÅäÒ»¸ö»º³åÇø¡£alloc_skb·ÖÅäÒ»¸ö»º³åÇø²¢³õʼ»¯skb->dataºÍskb->tailµ½skb->hea
d¡£ dev_alloc_skbº¯Êý£¨ÔÚLinux1.2ÖÐûÓУ©Ò»¸ö¿ì½Ý·½Ê½£¬ËüÓÃGFP_ATOMICÓÅÏȼ¶µ÷
ÓÃalloc_skb£¬²¢·´×ªskb->headºÍskb->dataÖ®¼äµÄ16¸ö×Ö½Ú¡£Õâ¸öÊý¾Ý¿Õ¼ä¿ÉÒÔÓÃÀ´¡°
ÍÆ¡±Ó²¼þ°üÍ·¡£

void kfree_skb(struct sk_buff *skb, int rw);

void dev_kfree)skb(struct sk_buff *skb, int rw);

ÊÍ·ÅÒ»¸ö»º³åÇø¡£kfree_skb±»ºËÐÄÄÚ²¿Ê¹Óá£Çý¶¯³ÌÐòÓ¦¸ÃʹÓÃdev_kfree_skb£¬ÔÚÓµ
Óлº³åÇøµÄÌ×½Ó×ÖÐèÒªÔÙ´ÎʹÓÃËüµÄÇé¿öÏ£¬Ëü¿ÉÒÔÕýÈ·µØ´¦Àí»º³åÇø¼ÓËø¡£Á½¸öº¯Êý
µÄrw²ÎÊýÊÇFREE_READ»òFREE_WRITE¡£Õâ¸öÖµÓÃÀ´¸ú×ÙÌ×½Ó×ÖµÄÄÚ´æ¡£Íâ³ö»º³åÇøÓ¦ÓÃ
FREE_WRITEÀ´ÊÍ·Å£¬¶ø½øÀ´µÄÔòʹÓÃFREE_READ¡£

unsigned char *skb_put(struct sk_buff *skb, int len);

Õâ¸öÏßÈ뺯Êý¸üнṹsk_buffµÄtailºÍlenÓò£¬Ëü±»ÓÃÀ´ÔÚ»º³åÇøβ¼ÓÈëÊý¾Ý¡£Æä·µ»Ø
ÖµÊÇskb->tailÒÔÇ°µÄÖµ£¨»òÕß˵£¬ËüÖ¸Ïò¸ÕÉú³ÉµÄÊý¾Ý¿Õ¼ä£©¡£ÓÐЩÇý¶¯³ÌÐòͨ¹ýµ÷ÓÃ
ins(ioaddr,skb_put(¡­))»òmemcpy(skb_put(¡­), data,len)À´Ê¹ÓÃÕâ¸ö·µ»ØÖµ¡£Õâ¸ö
º¯Êý¼°ÏÂÃæµÄһЩÔÚΪLinux1.2¹¹ÔìÄ£¿éÊDz»´æÔÚ¡£

unsigned char *skb_push(struct sk_buff *skb, int len);

Õâ¸öº¯Êý¼õСskb->data£¬Ôö¼Óskb->len¡£ÀàËÆÓÚskb_put£¬³ýÁËÊý¾ÝÊǼÓÔÚ°ü¿ªÊ¼¶ø²»
Êǽáβ¡£·µ»ØÖµÖ¸Ïò¸ÕÉú³ÉµÄ¿Õ¼ä¡£

int skb_tailroom(struct sk_buff *skb);

Õâ¸öº¯Êý·µ»ØΪÔÚ»º³åÇøÖзÅÖÃÊý¾ÝµÄ¿ÉÓÿռäÁ¿¡£Èç¹ûÇý¶¯³ÌÐòÔÚ»º³åÇøÖзÅÁ˶àÓÚ
ËüÄܳÐÔصÄÊý¾Ý£¬ÏµÍ³¿ÉÄܻرÀÀ£¡£ÄãÒ²Ðí»á·´¶Ô²¢ÈÏΪ£¬ÓÃprintkÖ¸³öÕâ¸ö´íÎóÒѾ­
×ã¹»ÁË£¬¶øÄÚ´æ±ÀÀ£¶Ôϵͳ̫Óк¦ÁË£¬¿ª·¢Õ߿϶¨Òª²ÉȡһЩ´ëÊ©¡£µ«Êµ¼ÊÉÏ£¬Èç¹û»º
³åÇø±»ÕýÈ··ÖÅäÁË£¬Äã¸ù±¾²»±Ø¼ì²é¿ÉÓÿռ䡣ÒòΪÇý¶¯³ÌÐòͨ³£ÔÚ·ÖÅ仺³åÇø֮ǰ»ñ
µÃ°ü´óС£¬Ö»ÓÐÓÐÑÏÖØȱÏݵÄÇý¶¯³ÌÐò²Å¿ÉÄÜÔÚ»º³åÇøÄÚ·ÅÌ«¶àµÄÊý¾Ý£¬±ÀÀ£¿ÉÒÔÈÏΪ
ÊÇÓ¦µÃµÄ³Í·£¡£

int skb_headroom(struct sk_buff *skb);


·µ»ØÊý¾ÝÇ°ÃæµÃ¿ÉÓÿռäÁ¿£¬Ò²¾ÍÊÇ¿ÉÒÔÏò»º³åÇøÖС°ÍÆ¡±¶àÉÙ°ËÔª×é¡£

void skb_reserve(struct sk_buff *skb, int len);

Õâ¸öº¯ÊýÔö¼ÓdataºÍtail¡£Ëü¿ÉÒÔÓÃÀ´ÔÚÌî³ä»º³åÇøÇ°Ô¤Áô¿Õ¼ä¡£´ó¶àÊýÒÔÌ«Íø½Ó¿ÚÔÚ
°üÇ°Ô¤ÁôÁ½¸ö×Ö½Ú£»ÕâÑùIPÍ·¿ÉÒÔÔÚÒ»¸ö4×Ö½ÚÒÔÌ«ÍøÍ·Ö®ºó£¬ÔÚ16×ֽڱ߽ç¶ÔÆë¡£snul
lÍê³ÉµÃºÜºÃ£¬¾¡¹ÜÔÚ¡°°ü½ÓÊÕ¡±Öв¢Î´Ìáµ½ÕâÒ»µã£¬ÄÇÖ÷ÒªÊÇΪÁ˱ÜÃâ±ËʱÒýÈë¹ý¶àµÃ
¸ÅÄî¡£

unsigned char *skb)pull(struct sk_buff *skb, int len);

´Ó°üÍ·ÖÐɾ³ýÊý¾Ý¡£Çý¶¯³ÌÐò²¢²»ÓÃÕâ¸öº¯Êý£¬µ«ÎªÁËÍêÕûÐÔÒ²°üº¬ÔÚÕâÀï¡£Ëü¼õÉÙskb
->len£¬Ôö¼Óskb->data£»ÕâÊÇ´Ó½øÀ´°üµÄ¿ªÊ¼°þ³öÒÔÌ«Íø°üÍ·µÄ·½·¨¡£



ºËÐÄ»¹¶¨ÒåÁ˼¸¸öÔÚÌ×½Ó×Ö»º³åÇøÉϲÙ×÷µÃ±ðµÄº¯Êý£¬µ«ËüÃÇÖ÷ÒªÓ¦ÓÃÓÚÍøÂç´úÂëµÃ¸ß
²ã£¬Çý¶¯³ÌÐò²¢²»ÐèÒªËüÃÇ¡£



µØÖ·½âÎö
µØÖ·½âÎö

ÒÔÌ«ÍøͨÐÅ×î¼±ÆȵÃÎÊÌâÖ®Ò»ÊÇÓ²¼þµØÖ·£¨½Ó¿ÚµÃΨһ±êÖ¾·û£©ÓëIPºÅÂëÖ®¼äµÄ¹ØÁª¡£
´ó¶àÊýЭÒ鶼ÓÐÀàËÆÎÊÌ⣬µ«ÎÒÖ»ÏòÖصãÌÖÂÛÒ»ÏÂÒÔÌ«ÍøÀàµÃÇé¿ö¡£ÎÒÁ¦Í¼¸ø³öÒ»¸öÈ«
ÃæµÃÃèÊö£¬Òò´ËÎÒ½«ÏÔʾÈýÖÖÇé¿ö£ºARP£¬Ã»ÓÐARPµÄÒÔÌ«ÍøÍ·(Ïóplip)£¬ÒÔ¼°·ÇÒÔÌ«Íø
°üÍ·¡£

ÔÚÒÔÌ«ÍøÉÏʹÓÃARP

µØÖ·½âÎöµÃÒ»°ã·½·¨ÊÇARP£¬¼´µØÖ·½âÎöЭÒé¡£ÐÒÔ˵ÄÊÇ£¬ARPÓɺËÐĹÜÀí£¬ÒÔÌ«Íø½Ó¿Ú
²»±ØΪ֧³ÖARP×öÈκÎÌØÊ⹤×÷¡£Ö»ÒªÔÚ´ò¿ªÊ±ÕýÈ·µØÉèÖÃÁËdev->addrºÍdev->addr_len
£¬Çý¶¯³ÌÐò²»Ðèµ£ÐÄÈκδÓIPºÅÂëµ½ÎïÀíµØÖ·µÄת»»£»ether_setup½«ÕýÈ·µÄÉ豸·½·¨¸³
¸ødev->hard_headerºÍdev->rebuild_header¡£

µ±Ò»¸ö°ü±»¹¹Ôìʱ£¬ÒÔÌ«Íø°üÍ·ÓÉdev->hard_headerÀ´²¼¾Ö£¬²¢ÓÉdev->rebuild_header
ÔÚºóÀ´Ìî³ä£¬ËüʹÓÃARPЭÒ齫δ֪µÄIPºÅÂëÓ³Éäµ½µØÖ·ÉÏ¡£Çý¶¯³ÌÐò×÷Õß²»±ØÖªµÀÕâ¸ö
¹ý³ÌµÄϸ½Úȥдһ¸ö¿É¹¤×÷µÃÇý¶¯³ÌÐò¡£

Ô½¹ýARP

¼òµ¥µÃµãµ½µãÍøÂç½Ó¿ÚÈçplip¿ÉÒÔ´ÓÒÔÌ«Íø°üÍ·»ñÒ棬µ«È´Òª±ÜÃâÀ´»Ø·¢ËÍARP°üµÃ¿ªÏú
¡£snullÖеÃʾÀý´úÂë¾ÍÊôÓÚÕâÒ»ÀàÍøÂçÉ豸¡£snull²»ÄÜʹÓÃARP£¬ÒòΪÇý¶¯³ÌÐòÐ޸ı»
·¢Ë͵ðüµÃIPµØÖ·£¬¶øARP°üÒ²½»»»IPµØÖ·¡£

Èç¹ûÄãµÄÉ豸ÏëÓÃÒ»°ãµÄÓ²¼þ°üÍ·£¬È´²»ÏëÔËÐÐARP£¬ÄãÐèÒªÔ½¹ýȱʡµÄdev->rebuild_h
eader·½·¨¡£Õâ¾ÍÊÇsnullʵÏֵķ½·¨£¬Õâ¸ö¼òµ¥µÄº¯ÊýÓÐÈýÌõÓï¾ä£º

£¨´úÂë329£©

ÊÂʵÉÏ£¬²¢Ã»ÓÐÖ¸¶¨eth->h_sourceºÍeth->h_destÄÚÈݵÄʵ¼ÊÐèÒª£¬ÒòΪÕâЩֵֻ±»ÓÃ
À´½øÐаüµÃÎïÀí´«ËÍ£¬¶øÒ»¸öµãµ½µãµÃÁ¬½Ó±£Ö¤Äܽ«°ü·¢Ë͵½ËüµÄÄ¿µÄµØ£¬¶øÓëÓ²¼þµØ
Ö·Î޹ء£snullÖع¹°üÍ·µÄÔ­ÒòÊÇÏòÄãÑÝʾ£¬µ±eth_rebuild_header²»¿ÉÓÃʱ£¬Ò»¸öÕæʵ
µÄÍøÂç½Ó¿ÚµÄÖع¹º¯ÊýÊÇÈçºÎʵÏֵģ¬

µ±½Ó¿ÚÊÕµ½Ò»¸ö°üʱ£¬Ó²¼þ°üÍ·Ö»±»eth_type_transʹÓá£ÎÒÃÇÔÚsnull_rxÖÐÒѾ­¼û¹ý
Õâ¸öµ÷Óãº

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

Õâ¸öº¯Êý´ÓÒÔÌ«Íø°üÍ·ÖгéȡЭÒé±êÖ¾·û£¨ÔÚÕâÀïÊÇETH_P_IP£©£»Ëü»¹Òª¸³Öµskb->mac.
raw£¬´Ó°üÊý¾ÝÖÐɾȥӲ¼þ°üÍ·£¬²¢ÉèÖÃskb->pkt_type¡£×îºóÒ»ÏîÔÚskb·ÖÅäʱȱʡΪPA
CKET_HOST£¨±íÃ÷°ü±»Ö¸ÏòÕâ¸öÖ÷»ú£©£¬µ±È»ËüÒ²¿ÉÒÔ¸ÄΪ·ûºÏÒÔÌ«ÍøÄ¿µÄµØÖ·µÃÆäËüÖµ
¡£

Èç¹ûÄãµÄ½Ó¿ÚÊǵ㵽µãÁ¬½Ó£¬Ä㽫ÎÞ·¨ÊÕµ½Î´Ïëµ½µÄÑ¡²¥°ü¡£Îª±ÜÃâÕâ¸ö£¬Äã±ØÐë¼Çס
½Î´Ïëµ½µÄÑ¡²¥°ü¡£Îª±ÜÃâÕâ¸ö£¬Äã±ØÐë¼Çס
ÄÇЩµÚÒ»¸ö°ËÔª×éµÄ×îµÍ루LSB£©ÊÇ0µÄÄ¿µÄµØÖ·½«±»Ö¸Ïòµ¥¸öÖ÷»ú£¨Ò²¾ÍÊÇ˵£¬ËüÊÇP
ACKET_HOST»òPACKET_OTHERHOST£©¡£plipÇý¶¯³ÌÐòÓÃ0xfc×÷ΪËüµÄÓ²¼þµØÖ·µÄµÚÒ»¸ö°Ë
Ôª×飬¶øsnullÓÃ0x00¡£ÕâÁ½¸öµØÖ·¶¼µ¼ÖÂÒ»¸ö¿É¹¤×÷µÄÒÔÌ«ÍøÀàµÄµãµ½µãÁ¬½Ó¡£

·ÇÒÔÌ«Íø°üÍ·

Õâ½Ú¼òÒªµØ½éÉÜÓ²¼þ°üÍ·ÊÇÈçºÎÓÃÀ´·â×°Ïà¹ØÐÅÏ¢µÄ¡£Èç¹ûÄãÏ£ÍûÁ˽âϸ½Ú£¬Äã¿ÉÒÔ´Ó
ºËÐÄÔ´Âë»òÌرð´«Êä½éÖʵļ¼ÊõÎĵµÖеõ½¡£ÎÒÃǸղÅÒѾ­¿´µ½Ó²¼þ°üÍ·³ýÁ˺¬ÓÐÄ¿µÄ
µØÖ·Í⣬»¹ÓÐһЩÐÅÏ¢£¬ÆäÖÐ×îÖØÒªµÄÊÇͨÐÅЭÒé¡£

²»¹ý£¬²¢²»ÊÇÿ¸öЭÒ鶼ҪÌṩËùÓеÄÐÅÏ¢¡£Ïóplip»òsnullÖ®ÀàµÄµãµ½µãÁ¬½Ó¿ÉÒÔ±ÜÃâ
´«ËÍÕû¸öÒÔÌ«Íø°üÍ·£¬Í¬Ê±²»Ê§È¥Ò»°ãÐÔ¡£hard_headerÉ豸·½·¨´ÓºËÐĽÓÊÕ´«ËÍÐÅÏ¢--
--°üÀ¨Ð­Ò鼶ºÍÓ²¼þµØÖ·¡£ËüÒ²ÊÕµ½16λµÄЭÒéºÅ¡£ÀýÈçIPÓÉETH_P_IP±êÖ¾¡£Çý¶¯³ÌÐò
Ó¦ÄÜÕýÈ·µØÏó½ÓÊÕÖ÷»ú´«ËÍ°üÊý¾ÝºÍЭÒéºÅ¡£µãµ½µãÁ¬½Ó¿ÉÒÔÔÚÓ²¼þ°üÍ·ÖÐÊ¡ÂÔµØÖ·£¬
Ö»´«ËÍЭÒéºÅ£¬ÒòΪ´«ËÍÊÇÓб£Ö¤µÄ£¬ÓëÔ´ºÍÄ¿µÄµØÖ·Î޹ء£Ò»¸öÖ»ÓÐIPµÄÁ¬½ÓÉõÖÁʲ
ôӲ¼þÍ·¶¼²»´«ËÍ¡£Á½ÖÖÇé¿öÏ£¬ËùÓеŤ×÷¶¼ÓÉhard_headerÍê³É£¬rebuild_header³ý
ÁË·µ»Ø0Íâʲô¶¼²»×ö¡£

µ±°üÔÚÁ¬½ÓµÄÁíÒ»¶Ë±»¼ñÆðʱ£¬½ÓÊÕº¯Êý½«ÕýÈ·µØÉèÖÃskb->protocol£¬skb->pkt_type
£¬ºÍskb->mac.raw¡£

skb->mac.rawÊÇÒ»¸ö±»ÍøÂç¸ß²ã´úÂëʵÏֵĵØÖ·½âÎö»úÖÆʹÓõÄ×Ö·ûÖ¸Õ루ÀýÈ磬net/i
·½âÎö»úÖÆʹÓõÄ×Ö·ûÖ¸Õ루ÀýÈ磬net/i
pv4/arp.c£©¡£Ëü±ØÐëÖ¸ÏòÒ»¸öÓëdev->typeÆ¥ÅäµÄ»úÆ÷µØÖ·¡£É豸ÀàÐ͵ĿÉÄÜÖµ±»¶¨Òå
ÔÚ<linux/if_arp.h>£»ÒÔÌ«Íø½Ó¿ÚÓÃARPHRD_ETHER¡£ÀýÈ磬ÏÂÃæÊÇeth_type_trans´¦Àí
ÊÕµ½°üµÄÒÔÌ«Íø°üÍ·µÄ·½·¨£º

            skb->mac.raw=skb->data;

            skb_pull(skb, dev->hard_header_len);

ÔÚ×î¼òµ¥µÄÇé¿öÏ£¨ÎÞ°üÍ·µÄµãµ½µãÁ¬½Ó£©£¬skb->mac.raw¿ÉÒÔÖ¸ÏòÒ»¸öº¬ÓÐÕâ¸ö½Ó¿Ú
µÄÓ²¼þµØÖ·µÄ¾²Ì¬»º³åÇø£¬protocol¿ÉÒÔ±»ÖÃΪETH_P_IP£¬packet_typeÈÔά³ÖÆäȱʡֵ
PACKET_HOST¡£



¼ÓÔØʱÅäÖÃ



Óû§¿ÉÒÔÓü¸¸ö±ê×¼µÄ¹Ø¼ü×ÖÀ´ÅäÖýӿڡ£ÈκÎеÄÍøÂçÄ£¿é¶¼Ó¦×ñÑ­Õâ¸ö±ê×¼£º

io=


Ϊ½Ó¿ÚÉèÖÃI/O¶Ë¿ÚµÄ»ùµØÖ·¡£Èç¹ûϵͳÖа²×°Á˲»Ö»Ò»¸ö½Ó¿Ú£¬ÄÇô¿ÉÒÔÓÃÒ»¸öÓɶººÅ
·Ö¸ôµÄÁбíÀ´Ö¸¶¨¡£

irq=

ÉèÖÃÖжϺš£ºÍÉÏÃæÒ»Ñù£¬¿ÉÒÔÖ¸¶¨²»Ö¹Ò»¸öÖµ¡£



»»¾ä»°Ëµ£¬Ò»¸ö×°ÁËÁ½¸öown_eth½Ó¿ÚµÄLinuxÓû§¿ÉÄÜÓÃÏÂÃæµÄÃüÁîÐÐÀ´¼ÓÔØÄ£¿é£º

              insmod own_eth.o io=0x300, 0x320 irq=5,7

Èç¹ûÖ¸¶¨0Öµ£¬ÄÇôio=ºÍirq=Ñ¡ÏҪ±»Ì½²â¡£Òò´ËÓû§¿ÉÒÔͨ¹ýÖ¸¶¨io=0À´Ç¿ÖÆ̽²â
¡£Èç¹ûÓû§ÃûÓÅÖ¸¶¨ÈκÎÑ¡Ï¶àÊýÇý¶¯³ÌÐòͨ³£¶¼Ì½²âÒ»¸ö½Ó¿Ú£¬µ«ÓÐʱ£¬Ä£¿é¿ÉÄÜ
±»½ûֹ̽²â¡££¨¼ûne.cÖйØÓÚNE2000É豸µÄ̽²â£©¡£

É豸Çý¶¯³ÌÐòÓ¦¸ÃÏó¸Õ²ÅÃèÊöµÄÕâÑù¹¤×÷¡£ISAÉ豸µÄµäÐÍʵÏÖÈçÏÂËùʾ£¬¼ÙÉèÇý¶¯³ÌÐò
×î¶à¿ÉÒÔÖ§³ÖËĸö½Ó¿Ú£º

£¨´úÂë331£©


Õâ¶Î´úÂëȱʡ̽²âÒ»¸ö°å×Ó£¬²¢×ÜÊÇ×Ô¶¯Ì½²âÖжϣ¬µ«Óû§¿ÉÒԸıäÕâÖÖÐÐΪ¡£ÀýÈ磬i
o=0,0,0½«Ì½²âÈý¿é°å×Ó¡£

³ýÁËʹÓÃioºÍirqÍ⣬Çý¶¯³ÌÐòµÄ×÷Õß¿ÉÒÔËæÒâÔö¼ÓÆäËü¼ÓÔØʱÅäÖòÎÊý¡£Ò²Ã»ÓÐÒѽ¨Á¢
µÄÃüÃû±ê×¼¡£



ÔËÐÐʱÅäÖÃ



Óû§ÓÐʱ¿ÉÄÜÏ£ÍûÔÚÔËÐÐʱ¸Ä±ä½Ó¿ÚµÄÅäÖá£ÀýÈ磬µ±ÖжϺÅÎÞ·¨Ì½²âʱ£¬Ïë¶ÔËüÕýÈ·
ÅäÖõÄΨһ°ì·¨¾ÍÊÇ¡°³¢ÊÔ¡ª´íÎó¡±¼¼Êõ¡£Ò»¸öÓû§¿Õ¼äµÄ³ÌÐò¿ÉÒÔ»ñÈ¡É豸µÄµ±Ç°Åä
Ö㬲¢Í¨¹ýÔÚÒ»¸ö´ò¿ªµÄÌ×½Ó×ÖÉϵ÷ÓÃioctlÀ´ÉèÖÃÒ»¸öеÄÅäÖá£ÀýÈ磬ӦÓÃifconfig
ʹÓÃioctlΪ½Ó¿ÚÉèÖÃI/O¶Ë¿Ú¡£

ÎÒÃÇÇ°ÃæÖªµÀÒ»¸öΪÍøÂç½Ó¿Ú¶¨ÒåµÄ·½·¨ÖеÄÒ»¸öÊÇset_config¡£Õâ¸ö·½·¨±»ÓÃÀ´ÔÚÔË
ÐÐʱÉèÖûò¸Ä±äһЩ½Ó¿ÚÌØÕ÷¡£

µ±Ò»¸ö³ÌÐòѯÎʵ±Ç°ÅäÖÃʱ£¬ºËÐĴӽṹdeviceÖгéÈ¡Ïà¹ØÐÅÏ¢£¬¶ø²»Í¨ÖªÇý¶¯³ÌÐò£»
ÁíÒ»·½Ã棬µ±Ò»¸öеÄÅäÖñ»´«µÝ¸ø½Ó¿Úʱ£¬set_config±»µ÷Óã¬ÕâÑùÇý¶¯³ÌÐò¾Í¿ÉÒÔ
¼ì²éÕâЩֵ²¢²ÉÈ¡ÏàÓ¦µÄ¶¯×÷¡£Õâ¸öÇý¶¯³ÌÐò·½·¨¶ÔÓ¦ÏÂÃæµÄÔ­ÐΣº

              int (*set_config)(struct device *dev, struct ifmap *map);

map²ÎÊýÖ¸ÏòÒ»¸öÓÉÓû§³ÌÐò´«µÝµÄ½á¹¹µÄ¿½±´£»Õâ¸ö¿½±´ÒѾ­ÔÚºËÐĿռ䣬ËùÒÔÇý¶¯³Ì
Ðò²»ÐèÒªµ÷ÓÃmemcpy_from _fs¡£

½á¹¹ifmapµÄÓòÊÇ£º

unsigned long mem_start;

unsigned long mem_end;

unsigned short base_addr;

unsigned char irq;

unsigned char dma;

ÕâЩÓò¶ÔӦ׎ṹdeviceÖеÄÓò¡£

Unsigned char prot;
Unsigned char prot;

Õâ¸öÓò¶ÔÓ¦×ÅdevÖеÄif_port¡£map->portµÄº¬ÒåÊÇÉ豸Ìض¨µÄ¡£



µ±Ò»¸ö½ø³ÌΪÉ豸·¢³öioctl(SIOCSIFMAP)(¼´Socket I/O Control Set InterFace
MAP)ʱ£¬set_configÉ豸·½·¨±»µ÷Óá£Õâ¸ö½ø³ÌÔÚʱǿÖÆʹÓÃÐÂֵ֮ǰ£¬Ó¦¸Ã·¢³öioctl
(SIOCGIFMAP)(¼´Socket I/O Control Get InterFace MAP)£¬ÕâÑùÇý¶¯³ÌÐòÖ»ÐèÒª²é¿´d
evºÍifmap½á¹¹²»Æ¥ÅäµÄµØ·½¡£MapÖÐÈκβ»±»Çý¶¯³ÌÐòʹÓõÄÓò¾ù¿ÉÒÔÂÔ¹ý¡£ÀýÈ磬һ
¸ö²»Ê¹ÓÃDMAµÄÍøÂçÉ豸¿ÉÒÔºöÂÔmap->dma¡£

snullʵÏÖ±»Éè¼Æ³É¿ÉÒÔÏÔʾÇý¶¯³ÌÐòÊÇÈçºÎÕë¶ÔÅäÖøıä¶ø¶¯×÷µÄ¡£¶ÔsnullÀ´Ëµ£¬Ã»
ÓÐÒ»¸öÓòÓÉÎïÀíÒâÒå¡£µ«³öÓÚ˵Ã÷µÄÄ¿µÄ£¬´úÂë½ûÖ¹¸Ä±äI/OµØÖ·£¬ÔÊÐí¸Ä±äIRQºÅ£¬²¢
ºöÂÔÆäËüÑ¡Ï´Ó¶øÏÔʾÕâЩ¸Ä±äÊÇÈçºÎ±»ÏìÓ¦¡¢¾Ü¾ø¡¢»òÊǺöÂԵġ£

£¨´úÂë333 #1£©

Õâ¸ö·½·¨µÄ·µ»ØÖµ±»×÷Ϊ·¢³öµÄioctlϵͳµ÷Óõķµ»ØÖµ£¬¶ÔÓÚûÓÐʵÏÖset_configµÄÇý
¶¯³ÌÐòÔò·µ»Ø-EOPNOTSUPP¡£

Èç¹ûÄã¶Ô½Ó¿ÚÅäÖÃÈçºÎ´ÓÓû§¿Õ¼ä·ÃÎʸе½ºÃÆ棬Çë¿´misc-progs/netifconfig.c£¬Ëü
¿ÉÒÔÓÃÀ´Óëset_config±È½Ï¡£ÏÂÃæÊÇÒ»¸öʾÀýÔËÐеÄÊä³ö£º

£¨´úÂë333 #2£©



×Ô¶¨ÒåioctlÃüÁî



ÎÒÃÇÒѾ­¿´µ½ioctlϵͳµ÷ÓÃÊÇΪÌ×½Ó×ÖʵÏֵġ£SIOCSIFADDRºÍSIOCSIFMAPÊÇ¡°Ì×½Ó×Öi
octl¡±µÄÀý×ÓÏÖÔÚÈÃÎÒÃÇ¿´¿´Õâ¸öϵͳµ÷ÓõĵÚÈý¸ö²ÎÊýÊÇÈçºÎ±»ÍøÂç´úÂëʹÓõġ£

µ±ioctlϵͳµ÷ÓÃÔÚÌ×½Ó×ÖÉϱ»µ÷ÓÃʱ£¬ÆäÃüÁîºÅÊÇÔÚ<linux/sockios.h>¶¨ÒåµÄ·ûºÅÖ®
Ò»£¬²¢ÇÒº¯Êýsock_ioctlÖ±½Óµ÷ÓÃÒ»¸öЭÒéÌض¨µÄº¯Êý£¨ÕâÀïЭÒéָʹÓõÄÖ÷ÒªÍøÂçЭ
Ò飬ÈçIP»òAppleTalk£©¡£

ÈκÎЭÒé²ã²»ÈÏʶµÄioctlÃüÁî±»´«µÝ¸øÉ豸²ã¡£ÕâЩÉ豸Ïà¹ØµÄioctlÃüÁî´ÓÓû§¿Õ¼ä
½ÓÊÕµÚÈý¸ö²ÎÊý£¬¼´½á¹¹ifreq*£»Õâ¸ö½á¹¹ÔÚ<linux/if.h>Öж¨Òå¡£SIOCSIFADDRºÍSIOC
SIFMAPÃüÁîʵ¼ÊÉÏÊǹ¤×÷ÔÚifreq½á¹¹ÉÏ¡£SIOCSIFMAPµÄ¶îÍâ²ÎÊý£¬¾¡¹Ü¶¨ÒåΪifmap£¬
ÊÇifreqµÄÒ»¸öÓò¡£

³ýÁËʹÓñê×¼µÄµ÷Óã¬Ã¿¸ö½Ó¿Ú¿ÉÒÔ¶¨ÒåËü×Ô¼ºµÄioctlÃüÁî¡£ÀýÈçplip½Ó¿ÚÔÊÐíͨ¹ýio
Ó¿Ú¿ÉÒÔ¶¨ÒåËü×Ô¼ºµÄioctlÃüÁî¡£ÀýÈçplip½Ó¿ÚÔÊÐíͨ¹ýio
ctlÐÞ¸ÄÆäÄÚ²¿³¬Ê±Öµ¡£Ì×½Ó×ÖµÄioctlʵÏÖ½«16¸öÃüÁî¿´×÷¶Ô½Ó¿ÚÊÇ˽Óеģº´ÓSIOCDEV
PRIVATEµ½SIOCDEVPRIVATE+15¡£

µ±ÕâЩÃüÁîÖеÄÒ»¸ö±»ÈÏʶʱ£¬dev->do_ioctlÔÚÏà¹ØµÄ½Ó¿ÚÇý¶¯³ÌÐòÀï±»µ÷Óá£Õâ¸öº¯
Êý½ÓÊÕÓëͨÓÃÄ¿µÄµÄioctlº¯ÊýʹÓõÄÒ»ÑùµÄifreq*Ö¸Õë¡£

          Int (*do_ioctl)(struct device *dev, struct ifreq *ifr, int cmd);

IfrÖ¸ÕëÖ¸ÏòºËÐÄ¿Õ¼äµÄÒ»¸öµØÖ·£¬·ÅÓб»Óû§´«À´½á¹¹µÄÒ»¸ö¿½±´¡£ÔÚdo_ioctl·µ»Øºó
£¬Õâ¸ö½á¹¹ÓÖ±»¿½±´»ØÓû§¿Õ¼ä£»ÕâÑù£¬Çý¶¯³ÌÐò¿ÉÒÔʹÓÃ˽ÓÐÃüÁîÀ´½ÓÊպͷµ»ØÊý¾Ý
¡£

É豸Ìض¨µÄÃüÁî¿ÉÒÔÑ¡ÔñʹÓýṹifreqÖеÄÓò£¬µ«ËüÃÇÒѾ­´øÓбê×¼µÄº¬Ò壬Çý¶¯³ÌÐò
²»Ì«¿ÉÄܸù¾Ý×Ô¼ºµÄÐèÒªÊÊÅäÕâ¸ö½á¹¹¡£Óòifr_dataÊǸöcaddr_tÏһ¸öÖ¸Õ룩£¬ÓÃÓÚ
É豸Ìض¨µÄÐèÒª¡£Çý¶¯³ÌÐòºÍµ÷ÓÃioctlÃüÁîµÄ³ÌÐòÓ¦ÔÚifr_dataµÄʹÓÃÉÏÈ¡µÃÒ»Ö¡£Àý
È磬pppstatsʹÓÃÉ豸Ìض¨µÄÃüÁîÀ´´Óppp½Ó¿ÚÇý¶¯³ÌÐòÖлñÈ¡ÐÅÏ¢¡£

ÔÚÕâÀï²»ÖµµÃ¸ø³ödo_ioctlµÄÒ»¸öʵÏÖ£¬µ«¸ù¾Ý±¾ÕµÄÐÅÏ¢ºÍºËÐĵÄÀý×Ó£¬ÄãÓ¦ÄÜÔÚÐè
ÒªµÄʱºòд³öÒ»¸ö¡£²»¹ý×¢Ò⣬plipʵÏÖ²»ÕýÈ·µØʹÓÃÁËifr_data£¬²»Ó¦×öΪioctlʵÏÖ
µÄÒ»¸öÀý×Ó¡£




ͳ¼ÆÐÅÏ¢



Ò»¸öÇý¶¯³ÌÐòÐèÒªµÄ×îºóÒ»¸ö·½·¨ÊÇget_stats¡£Õâ¸ö·½·¨·µ»ØÖ¸ÏòÉ豸ͳ¼ÆÐÅÏ¢µÄÒ»¸ö
Ö¸Õë¡£ËüµÄʵÏÖÏ൱ÈÝÒ×£º

£¨´úÂë335£©

·µ»ØÓÐÒâÒåµÄͳ¼ÆÐÅÏ¢ËùÐèµÄʵ¼Ê¹¤×÷É¢²¼ÔÚÇý¶¯³ÌÐòÖУ¬²»Í¬µÄÓò·Ö±ð±»¸üС£Ï±í
¸ø³öenet_statistics½á¹¹ÖÐ×îÓÐȤµÄ¼¸¸öÓò¡£

int rx_packets;

int tx_packets;

ÕâÁ½¸öÓòº¬Óнӿڳɹ¦´«Ë͵ĽøÀ´ºÍÍâ³ö°üµÄ×ÜÊý¡£

int rx_errors;

int tx_errors;
int tx_errors;

³ö´íµÄ½ÓÊպͷ¢Ë͵ÄÊýÄ¿¡£½ÓÊÕ´í¿ÉÄÜÊÇ´íÎóµÄУÑéºÍ¡¢´íÎóµÄ°ü´óС£¬ÒÔ¼°ÆäËüÎÊÌâ
µÄ½á¹û¡£·¢ËÍ´íÎó²»Ì«³£¼û£¬Ò»°ã¶¼ÊÇÏßÀµÄÎÊÌâ¡£

int rx_dropped;

int tx_dropped;

ÔÚ½ÓÊպͷ¢ËÍʱ±»¶ªÆúµÄ°üµÄ¸öÊý¡£µ±°üÊý¾ÝûÓпÉÓÃÄÚ´æʱ£¬°ü±ã±»¶ªÆúÁË¡£tx_drop
pedºÜÉÙʹÓá£



Õâ¸ö½á¹¹»¹Óм¸¸öÓò£¬¿ÉÒÔÓÃÀ´Ï¸·Ö·¢ËͺͽÓÊÕʱ·¢ÉúµÄ´íÎ󡣸ÐÐËȤµÄ¶ÁÕß¿ÉÒÔ¿´<li
nux/if_ether.h>ÖнṹµÄ¶¨Òå¡£



Ñ¡²¥




¡°Ñ¡²¥¡±°üÊÇÖ¸Ò»¸öÍøÂç°ü£¬Ëü½«Òª±»¶àÓÚÒ»¸ö£¬µ«ÓÖ²»ÊÇÈ«²¿µÄÖ÷»ú½ÓÊÕ¡£

Õâ¸ö¹¦ÄÜÊÇͨ¹ý¸øÒ»×éÖ÷»ú¸³ÒÔÌØÊâµÄÓ²¼þµØÖ·À´»ñµÃµÄ¡£Ö¸ÏòÕâЩÌØÊâµØÖ·ÖеÄÒ»¸ö
µÄ°ü½«±»Õâ¸ö×éÖÐËùÓеÄÖ÷»úÊÕµ½¡£ÔÚÒÔÌ«ÍøµÄÇé¿öÏ£¬Ò»¸öÑ¡²¥µØÖ·Êǽ«Ä¿µÄµØÖ·ÖÐ
µÚÒ»¸ö°ËÔª×éµÄ×îµÍλÉèÖöøµÃµ½£¬¶øËùÓеÄÉ豸°å×Ó¶¼ÔÚÆäÓ²¼þµØÖ·Öн«ÕâһλÇå³ý
¡£

´¦ÀíÖ÷»ú×éÒÔ¼°Ó²¼þµØÖ·µÄ¼¬ÊÖ²¿·Ö¶¼ÓÐÓ¦ÓûòºËÐÄÍê³ÉÁË£¬½Ó¿ÚÇý¶¯³ÌÐò²¢²»ÐèÒª´¦
ÀíÕâЩÎÊÌâ¡£

Ñ¡²¥°üµÄ·¢Ëͺܼòµ¥£¬ÓëÆäËü°üÍêÈ«Ò»Ñù¡£½Ó¿ÚÔÚ´«Êä½éÖÊÉÏ·¢ËÍËüÃÇ£¬¸ù±¾²»¹ÜÄ¿µÄ
µØÖ·¡£ºËÐıØÐëÉèÖÃÒ»¸öÕýÈ·µÄÓ²¼þÄ¿µÄµØÖ·£»rebuild_headerÉ豸·½·¨£¨Èç¹û±»¶¨Òå
£©²¢²»ÐèÒª²é¿´ËüÕûÀíµÄÊý¾Ý¡£

¶øÁíÒ»·½Ã棬½ÓÊÕÑ¡²¥°üÐèÒªÉ豸µÄһЩºÏ×÷¡£µ±Ò»¸ö¡°ÓÐȤµÄ¡±Ñ¡²¥°ü±»ÊÕµ½Ê±£¨Ò²
¾ÍÊÇÒ»¸ö°üµÄÄ¿µÄµØÖ·È·¶¨Ò»×éÖ÷»ú£¬ÆäÖаüº¬ÁËÕâ¸ö½Ó¿Ú£©£¬Ó²¼þÓ¦¸Ã֪ͨ²Ù×÷ϵͳ
¡£ÕâÒâζ×ÅÓ²¼þ¹ýÂËÆ÷Ó¦±»Éè¼ÆΪÄܹ»Çø±ð²»Í¬µÄÑ¡²¥µØÖ·¡£Õâ¸ö¹ýÂËÆ÷ÔÚ½Ó¿ÚµÄÒ»°ã
²Ù×÷ÖУ¬½«ÍøÂç°üµÄµØÖ·ÓëÆä×Ô¼ºµÄÓ²¼þµØÖ·½øÐÐÆ¥Åä¡£

µäÐ͵أ¬ÔÚ¿¼ÂÇÑ¡²¥µÄÇé¿öÏ£¬Ó²¼þ¿É·ÖΪһÏÂÈýÀࣺ

l         ²»ÄÜ´¦ÀíÑ¡²¥µÄ½Ó¿Ú¡£ÕâÀà½Ó¿ÚҪô½ÓÊÕÖ¸Ïò×Ô¼ºÓ²¼þµØÖ·µÄ°ü£¨°üÀ¨²¥ËÍ
°ü£©£¬ÒªÃ´½ÚÊÕËùÓеİü¡£ËüÃǽÓÊÕÑ¡²¥°üÊÇͨ¹ý½ÓÊÕËùÓеİüʵÏֵģ¬ÕâÑù£¬²Ù×÷ϵ
ͳÖлá³ä³â×Å´óÁ¿¡°ÎÞÒâÒ塱µÄ°ü¡£Ò»°ãÎÒÃDz»ÈÏΪÕâÀà½Ó¿ÚΪ֧³ÖÑ¡²¥µÄ£¬Çý¶¯³ÌÐò
²»ÔÚdev->flagsÖÐÖÃIFF_MULTICAST¡£
µãµ½µã½Ó¿ÚÊÇÒ»ÖÖÌØÊâÇé¿ö£¬ËüÃÇͨ³£½ÓÊÕËùÓеİü£¬¸ù±¾²»½øÐÐÈκÎÓ²¼þ¹ýÂË¡£

l         ÄÜÇø±ðÑ¡²¥°üºÍÆäËü°ü£¨Ö÷»úµ½Ö÷»ú»ò²¥ËÍ£©µÄ½Ó¿Ú¡£ÕâÀà½Ó¿Ú¿ÉÒÔ±»ÒªÇó
½ÓÊÕËùÓеÄÑ¡²¥°ü£¬È»ºóÓÃÈí¼þÀ´ÅжÏ×Ô¼ºÊÇ·ñÊÇÓÐЧµÄ½ÓÊÕÕß¡£ÕâÖÖÇéÐÎÒýÈëµÄ¿ªÏú
ÊÇ¿ÉÒÔ½ÓÊյģ¬ÒòΪһ¸öµäÐ͵ÄÍøÂçÖÐÑ¡²¥°üµÄÊýÁ¿¶¼ºÜÉÙ¡£

l         Äܹ»½øÐÐÑ¡²¥µØÖ·Ó²¼þ¼ì²âµÄ½Ó¿Ú¡£¿ÉÒÔ¸øÕâÀà½Ó¿ÚÒ»×éÐèÒª½ÓÊÕµÄÑ¡²¥µØ
Ö·£¬ËüÃÇ»áºöÂÔÆäËüµÄÑ¡²¥°ü¡£Õâ¶ÔºËÐÄÀ´ËµÊÇ×îÓÅ»¯µÄÇé¿ö£¬ÒòΪ²»»áÀË·Ñ´¦ÀíÆ÷ÊÂ
¼þÈ¥¶ªÆú½Ó¿ÚÊÕµ½µÄ¡°ÎÞÒâÒ塱µÄ°ü¡£



ºËÐÄÊÔͼÀûÓø߼¶½Ó¿ÚµÄÄÜÁ¦£¬ÄÜ×îºÃµØÖ§³ÖµÚÈýÀà½Ó¿Ú£¨ÓÃ;×î¹ã£©¡£Òò´Ë£¬µ±ÓÐЧ
µÄÑ¡²¥µØÖ·±»¸Ä±äʱºËÐÄӦ֪ͨÇý¶¯³ÌÐò£¬Ëü°ÑеÄÒ»×éµØÖ·´«¸øÇý¶¯³ÌÐò£¬ÕâÑùËü¿É
ÒÔ°´ÕÕеÄÐÅÏ¢¸üÐÂÓ²¼þ¹ýÂËÆ÷¡£



ºËÐĶÔÑ¡²¥µÄÖ§³Ö
ºËÐĶÔÑ¡²¥µÄÖ§³Ö

ÏÂÃæÊÇÓëÇý¶¯³ÌÐòµÄÑ¡²¥ÄÜÁ¦Ïà¹ØµÄÊý¾Ý½á¹¹ºÍº¯ÊýµÄ¸ÅÀ¨£º

void (*dev->set_multicast_list)(struct device *dev)

µ±ÓëÉ豸Ïà¹ØµÄ»úÆ÷µØÖ·±í¸Ä±äʱµ÷ÓÃÕâ¸öÉ豸·½·¨¡£µ±dev->flags±»ÐÞ¸ÄʱËüÒ²±»µ÷
Óã¬ÒòΪÓÐЩ±êÖ¾Ò²ÒªÇóÄãÖØÐÂÅäÖÃÓ²¼þ¹ýÂËÆ÷¡£Õâ¸ö·½·¨½ÓÊÕÒ»¸öÖ¸Ïòdevice½á¹¹µÄ
Ö¸Õë×÷Ϊ²ÎÊý£¬·µ»Øvoid¡£¶ÔʵÏÖÕâ¸ö·½·¨²»¸ÐÐËȤµÄÇý¶¯³ÌÐò¿ÉÒÔÁôÓòΪNULL¡£

struct dev_mc_list *dev->mc_list

ÕâÊÇÓòÉ豸Ïà¹ØµÄËùÓÐÑ¡²¥µØÖ·µÄÁ´±í¡£Õâ¸ö½á¹¹µÄʵ¼Ê¶¨ÒåÔÚ±¾½Ú½áÊøʱ½éÉÜ¡£

int dev->mc_count

Á´±íÏîÊý¡£Õâ¸öÐÅÏ¢ÓеãÈßÓ࣬µ«¼ì²émc_countÊÇ·ñΪ0ÊÇÓÅÓÚÁбí¼ì²éµÄÒ»¸öÓÐÓõĿì
½Ý·½Ê½¡£

IFF_MULTICAST

³ý·ÇÇý¶¯³ÌÐòÔÚdev->flagsÖÐÉèÖÃÁËÕâ¸ö±êÖ¾£¬½Ó¿Ú½«²»±Ø´¦ÀíÑ¡²¥°ü¡£µ±dev->flags
¸Ä±äʱ£¬ÖÁÉÙset_multicast_list»á±»µ÷Óá£

IFF_ALLMULTI

dev->flagsÖеÄÕâ¸ö±êÖ¾±»ÍøÂçÈí¼þÉèÖÃÒÔ¸æËßÇý¶¯³ÌÐò´ÓÍøÂçÖгéÈ¡ËùÓв¥ËÍ°ü¡£Õâ
ÔÚmulticast-routing±»Ê¹ÓÃʱ·¢Éú¡£Èç¹ûÕâ¸ö±êÖ¾±»ÖÃ룬dev->mc_list½«²»ÔÙʹÓÃÈ¥
¹ýÂËÑ¡²¥°ü¡£

IFF_PROMISC

µ±½Ó¿Ú±»ÖÃΪÔÓÂÒģʽʱ£¬dev->flagsÖеÄÕâ¸ö±êÖ¾±»ÉèÖá£ËùÓеİü¶¼±»½Ó¿Ú³éÈ¡£¬
²»¿¼ÂÇdev->mc_list¡£



Çý¶¯³ÌÐò¿ª·¢ÕßÐèÒªµÄ×îºóÒ»µãÐÅÏ¢Êǽṹdev_mc_listµÄ¶¨Ò壬Ëü¾ÓÓÚ<linux/netdevi
ce.h>ÖС£

£¨´úÂë337£©

ÓÉÓÚÑ¡²¥ºÍÓ²¼þµØÖ·Óë°üµÄʵ¼Ê·¢ËÍÎ޹أ¬Õâ¸ö½á¹¹¿ÉÔÚ²»Í¬µÄÍøÂçʵÏÖÉÏÒÆÖ²£¬Ã¿¸ö
µØÖ·ÓÉÒ»´®°ËÔª×éºÍÒ»¸ö³¤¶ÈÈ·¶¨£¬¾ÍÏódev->dev_addr¡£




Ò»¸öµäÐ͵ÄʵÏÖ

ÃèÊöset_multicast_listÉè¼ÆµÄ×îºÅ°ì·¨ÊǸø³öһЩα´úÂë¡£

ÏÂÃæµÄº¯ÊýÊÇÕâ¸öº¯ÊýÔÚÒ»¸öÈ«ÌØÕ÷(ff)Çý¶¯³ÌÐòÖеÄÒ»¸öµäÐÍʵÏÖ¡£ËµÕâ¸öÇý¶¯³ÌÐò
ÊÇÈ«ÌØÕ÷µÄÊÇÒòΪËü¿ØÖƵĽӿÚÓÐÒ»¸ö¸´ÔÓµÄÓ²¼þ°ü¹ýÂËÆ÷£¬Ëü¿ÉÒÔ´æ·ÅÒ»¸öÓɱ¾»ú½Ó
ÊÕµÄÑ¡²¥µØÖ·±í¡£Õâ¸ö±íµÄ×î´ó³ß´çÊÇFF_TABLE_SIZE¡£

ËùÓÉ´øÓÐǰ׺ff_µÄº¯ÊýÊÇ·ÅÖÃÓ²¼þÌض¨²Ù×÷µÄµØ·½¡£

£¨´úÂë338£©

Èç¹ûÕâ¸ö½Ó¿Ú²»ÄÜÔÚÓ²¼þ¹ýÂËÆ÷Öд洢µ½À´°üµÄÑ¡²¥±í£¬ÄÇôÕâ¸öʵÏÖ»¹¿ÉÒÔ¼ò»¯¡£ÔÚ
ÕâÖÖÇé¿öÏ£¬FF_TABLE_SIZE¼õΪ0£¬´úÂëµÄ×îºóËÄÐÐÒ²²»ÐèÒªÁË¡£

ÏÖÔÚ£¬½Ó¿Ú°åÒ»°ã²»Äܴ洢ѡ²¥±í¡£²»¹ý£¬Õâ²¢²»ÊÇÒ»¸ö´óÎÊÌ⣬ÒòΪÍøÂç´úÂëµÄ¸ß²ã
»á¸ºÔ𽫲»ÐèÒªµÄ°ü¶ªÆú¡£

ÈçÎÒÇ°Ã潨ÒéµÄ£¬¼´Ê¹²»ÄÜ´¦ÀíÑ¡²¥°üµÄ½Ó¿ÚÒ²ÐèҪʵÏÖset_multicast_list·½·¨£¬Õâ
Ñùµ±dev->flags·¢Éú¸Ä±äʱ¿ÉÒÔ±»Í¨Öª¡£ÎÒ³ÆÕâ¸öΪ¡°ÎÞÌØÕ÷¡±(nf)µÄʵÏÖ¡£Ëü·Ç³£¼ò
µ¥£¬ÈçÏÂÃæËùʾ£º

£¨´úÂë339£©

´¦ÀíIFF_PROMISCÊǺÜÖØÒªµÄ£¬ÒòΪ²»È»µÄ»°£¬Óû§½«ÎÞ·¨ÔËÐÐtcpdump»òÆäËüһЩÍøÂç
·ÖÎö¹¤¾ß¡£ÁíÒ»·½Ã棬Èç¹û½Ó¿ÚÔËÐÐÒ»¸öµãµ½µãµÄÁ¬½Ó£¬ÔòûÓÐÈκÎʵÏÖset_multicast
_listµÄ±ØÒª£¬ÒòΪËüÃǽÓÊÕËùÓеİü¡£



¿ìËٲο¼



±¾½ÚÌṩÔÚ±¾ÕÂÖнéÉܵĸÅÄîµÄ²Î¿¼¡£ËüÒ²½âÊÍÁËÇý¶¯³ÌÐòÓ¦°üº¬µÄÿ¸öÍ·ÎļþµÄ×÷ÓÃ
¡£²»¹ý£¬deviceºÍsk_buffµÄÿ¸öÓòµÄÁÐ±í£¬¾Í²»ÔÙÖظ´ÁË¡£

#include <linux/netdevice.h>

Õâ¸öÍ·Îļþº¬ÓÐstruct deviceµÄ¶¨Ò壬»¹°üº¬ÁËÍøÂçÇý¶¯³ÌÐòÐèÒªµÄ¼¸¸öÆäËüÍ·Îļþ¡£



void netif_rx(struct sk_buff *skb);

Õâ¸öº¯ÊýÔÚÖжÏʱ¿ÉÒÔ±»µ÷ÓÃ֪ͨºËÐÄÒ»¸ö°ü±»ÊÕµ½ÁË£¬²¢ÇÒ·â×°ÔÚÒ»¸öÌ×½Ó×Ö»º³åÇø
ÖС£

#include <linux/if.h>

±»netdevice.h°üº¬£¬Õâ¸öÎļþÉùÃ÷½Ó¿Ú±êÖ¾(IFF_macros)ºÍ½á¹¹ifmap£¬ËüÔÚÍøÂçÇý¶¯
³ÌÐòµÄioctlʵÏÖÖÐÓÃÖØÒªµÄ×÷Óá£

#include <linux/if_ether.h>

ETH_ALEN

ETH_P_IP

struct ethhdr;

struct enet_statistics;

±»netdevice.h°üº¬£¬if_ether.h¶¨ÒåËùÓеÄETH_macros£¬ÓÃÀ´±íʾ°ËÔª×鳤¶È£¨ÏóµØÖ·
³¤¶È£©ºÍÍøÂçЭÒ飨ÏóIP£©¡£ËüÒ²¶¨ÒåÁ˽ṹethhdrºÍenet_statistics¡£×¢Ò⣬²»Òª¿´
enet_statisticsµÄÃû×ֺͰüº¬ËüµÄÍ·Îļþ£¬ÊÂʵÉÏ£¬ËùÓеĽӿڶ¼ÒªÓõ½Ëü£¬²»½ö½öÊÇ
ÒÔÌ«Íø¡£

#include <linux/skbuff.h>

½á¹¹sk_buffºÍһЩÏà¹Ø½á¹¹µÄ¶¨Ò壬ÒÔ¼°ÔÚ»º³åÇøÉϲÙ×÷µÄÏßÈ뺯Êý¡£Õâ¸öÍ·Îļþ°üº¬
ÔÚnetdevice.hÖС£

#include <linux/etherdevice.h>

void ether_setup(struct device *dev)£»

Õâ¸öº¯ÊýΪÒÔÌ«ÍøÇý¶¯³ÌÐòÉèÖôó¶àÊýÉ豸·½·¨ÎªÍ¨ÓÃÄ¿µÄµÄʵÏÖ¡£ËüͬÑùÉèÖÃdev->fl
ags£¬²¢ÇÒÔÚÃû×ÖÖеĵÚÒ»¸ö×Ö·ûÊÇ¿Õ¸ñ»ò¿Õ×Ö·ûʱ£¬½«ÏÂÒ»¸ö¿ÉÓõÄethxÃû¸³¸ødev->n
ame¡£

unsigned short eth_type_trans(struct sk_buff *skb, struct device *dev)

µ±ÒÔÌ«Íø½Ó¿ÚÊÕµ½Ò»¸ö°ü£¬Õâ¸öº¯Êý½«±»µ÷ÓÃÀ´ÉèÖÃskb->pkt_type¡£·µ»ØÖµÊÇÒ»¸öЭÒé
ºÅ£¬Í¨³£±»´æÔÚskb->protocolÖС£

#include <linux/sockios.h>
ÊÇÒ»¸öЭÒé
ºÅ£¬Í¨³£±»´æÔÚskb->protocolÖС£

#include <linux/sockios.h>

SIOCDEVPRIVATE

ÕâÊÇ16¸öioctlÃüÁîµÄµÚÒ»¸ö£¬¿ÉÒÔ±»Ã¿¸öÇý¶¯³ÌÐòʵÏÖÒÔ¹©Ë½Óá£ËùÓеÄÍøÂçioctlÃü
ÁÔÚsockios.hÖж¨Òå¡£
  

--
¡ù À´Ô´:¡¤¹þ¹¤´ó×϶¡Ïã bbs.hit.edu.cn¡¤[FROM: 202.118.235.250]
[°Ù±¦Ïä] [·µ»ØÊ×Ò³] [Éϼ¶Ä¿Â¼] [¸ùĿ¼] [·µ»Ø¶¥²¿] [Ë¢ÐÂ] [·µ»Ø]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
Ò³ÃæÖ´ÐÐʱ¼ä£º208.819ºÁÃë