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ºÁÃë