P4 ã¯ããã±ãã ã«ãŒãã£ã³ã° ã«ãŒã«ãããã°ã©ã ããããã«èšèšãããããã°ã©ãã³ã°èšèªã§ãã C ã Python ãªã©ã®æ±çšèšèªãšã¯ç°ãªããP4 ã¯ãããã¯ãŒã¯ ã«ãŒãã£ã³ã°çšã«æé©åãããå€æ°ã®èšèšãåãããã¡ã€ã³åºæã®èšèªã§ãã
P4 ã¯ãP4 Language Consortium ãšåŒã°ããéå¶å©çµç¹ã«ãã£ãŠã©ã€ã»ã³ã¹äŸäžãããç¶æãããŠãããªãŒãã³ãœãŒã¹èšèªã§ãã ãŸãããªãŒãã³ ãœãŒã¹ ãããã¯ãŒãã³ã° ãããžã§ã¯ãã®æ倧ã®çµ±æ¬çµç¹ã§ãã Open Networking Foundation (ONF) ãš Linux Foundation (LF) ã«ãã£ãŠããµããŒããããŠããŸãã
ãã®èšèªã¯ããšããš 2013 幎ã«é èªãããããããã³ã«ã«äŸåããªããã±ãã ã«ãŒãã£ã³ã° ããã»ããµ ããã°ã©ãã³ã°ããšããã¿ã€ãã«ã® 2014 幎㮠SIGCOMM CCR è«æã§èª¬æãããŸããã
P4 ã¯ãã®éå§ä»¥æ¥ãæ¥æ¿ã«æé·ããã³é²åããããã«ãããã¯ãŒã¯ ã¢ããã¿ãŒãã¹ã€ãããã«ãŒã¿ãŒãªã©ã®ãããã¯ãŒã¯ ããã€ã¹ã«ãããã±ããã®éä¿¡ãèšè¿°ããæšæºã«ãªããŸããã
Open Networking Foundation ã®ãšã°ãŒã¯ãã£ã ãã£ã¬ã¯ã¿ãŒãGuru Parulkar æ°ã¯æ¬¡ã®ããã«è¿°ã¹ãŠããŸãããSDN ã¯ãããã¯ãŒãã³ã°æ¥çãå€é©ããŸãããP4 ã¯ã«ãŒãã£ã³ã°ã«ããã°ã©ãããªãã£ãããããããšã§ãSDN ã次ã®ã¬ãã«ã«åŒãäžããŸããã
P4 èšèªã¯ããšããšãGoogleãIntelãMicrosoft ResearchãBarefootãPrincetonãStanford ã®ãšã³ãžãã¢ãšç 究è ã®ã°ã«ãŒãã«ãã£ãŠäœæãããŸããã ç®æšã¯åçŽã§ããããœãããŠã§ã¢éçºè ã XNUMX æ¥ã§ç¿åŸã§ãããããã¯ãŒã¯äžã§ãã±ãããã©ã®ããã«éä¿¡ãããããæ£ç¢ºã«èšè¿°ããããã«äœ¿çšã§ãã䜿ããããèšèªãäœæããããšã§ãã
P4 ã¯æåããã¿ãŒã²ããã«äŸåããªãããã«èšèšãããŠããŸãã (ã€ãŸããP4 ã§æžãããããã°ã©ã ã¯ãASICãFPGAãCPUãNPUãGPU ãªã©ã®ããŸããŸãªã¿ãŒã²ããã§å®è¡ããããã«å€æŽããã«ã³ã³ãã€ã«ã§ããŸã)ã
ãã®èšèªã¯ãããã³ã«ã«ãäŸåããŸãã (ã€ãŸããP4 ããã°ã©ã ã¯æ¢åã®æšæºãããã³ã«ãèšè¿°ããããæ°ããã«ã¹ã¿ã ã¢ãã¬ãã·ã³ã° ã¢ãŒããæå®ããããã«äœ¿çšãããã§ããŸã)ã
ç£æ¥çã§ã¯ãP4 ã¯ããã€ã¹ã®ããã°ã©ãã³ã°ã«äœ¿çšãããŸãã ããããå°æ¥çã«ã¯ãã€ã³ã¿ãŒããã RFC ããã³ IEEE æšæºã«ã P4 ä»æ§ãå«ãŸããããšã«ãªãã§ãããã
P4 ã¯ãããã°ã©ã å¯èœãªããã€ã¹ãšåºå®æ©èœããã€ã¹ã®äž¡æ¹ã«äœ¿çšã§ããŸãã ããšãã°ããªãŒãã³ ãœãŒã¹ã® SONiC ã¹ã€ãã OS ã§äœ¿çšãããã¹ã€ãã ã¢ãã¹ãã©ã¯ã·ã§ã³ ã€ã³ã¿ãŒãã§ã€ã¹ (SAI) API ã§ã¹ã€ãã ãã€ãã©ã€ã³ã®åäœãæ£ç¢ºã«èšé²ããããã«äœ¿çšãããŸãã P4 ã¯ãONF Stratum ãããžã§ã¯ãã§ããããŸããŸãªåºå®ããã€ã¹ãããã°ã©ã å¯èœãªããã€ã¹éã®ã¹ã€ããã³ã°åäœãèšè¿°ããããã«äœ¿çšãããŸãã
ã¹ã€ãããšãããã¯ãŒã¯ ã¢ããã¿ãŒã®åäœãèšè¿°ããããšã§ãå±éåã«ãããã¯ãŒã¯å šäœã®æ£ç¢ºãªå®è¡å¯èœã¢ãã«ãäœæã§ããããã«ãªããŸããã 倧èŠæš¡ãªã¯ã©ãŠã ãããã€ããŒã¯ããœãããŠã§ã¢ã䜿çšããŠãããã¯ãŒã¯å šäœããã¹ãããã³ãããã°ã§ãããããé«äŸ¡ãªããŒããŠã§ã¢ãå¿ èŠãšããã«ãã©ãã§ã®çžäºéçšæ§ãã¹ãã®æéãšã³ã¹ããå€§å¹ ã«åæžã§ããŸãã
P4 ã䜿çšããããšã§ããããã¯ãŒã¯æ©åšãã³ããŒã¯ãã¹ãŠã®è£œåã«ããã£ãŠå ±éã®åºç€ãšãªãã«ãŒãã£ã³ã°åäœãæåŸ ã§ããããããã¹ã ã€ã³ãã©ã¹ãã©ã¯ãã£ã®åå©çšãå¯èœã«ãªãã管çãœãããŠã§ã¢éçºãç°¡çŽ åãããæçµçã«ã¯çžäºéçšæ§ã確ä¿ãããŸãã
ãã¡ãããP4 ã䜿çšããŠããŸã£ããæ°ããã«ãŒãã£ã³ã°æ¹æ³ãèšè¿°ããããã°ã©ã ãäœæããããšãã§ããŸãã ããšãã°ãP4 ã¯ãããŒã¿ ã»ã³ã¿ãŒãäŒæ¥ããµãŒãã¹ ãããã€ããŒã®ãããã¯ãŒã¯ã«ããããã¬ã¡ããªãšæž¬å®ã«åºã䜿çšãããŠããŸãã
ç 究ã³ãã¥ããã£ã匷åãããŸããã ããã€ãã®äž»èŠãªåŠè¡ãããã¯ãŒãã³ã°ç 究ã°ã«ãŒãããããŒã ãã©ã³ã·ã³ã°ãã³ã³ã»ã³ãµã¹ ãããã³ã«ãããŒå€ã®ãã£ãã·ã¥ãªã©ãP4 ããã°ã©ã ã«åºã¥ãããšããµã€ãã£ã³ã°ãªæ°ããã¢ããªã±ãŒã·ã§ã³ãå ¬éããŠããŸãã æ°ããããã°ã©ãã³ã° ãã©ãã€ã ãçã¿åºãããã€ãããŒã·ã§ã³ãããŒããŠã§ã¢ãããœãããŠã§ã¢ã«ç§»è¡ããå€ãã®äºæãã¬æ°ããç¬åµçãªã¢ã€ãã¢ãçãŸããããšãå¯èœã«ããŠããŸãã
éçºè ã³ãã¥ããã£ã¯ãã³ã³ãã€ã©ããã€ãã©ã€ã³ãåäœã¢ãã«ãAPIããã¹ã ãã¬ãŒã ã¯ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ãªã©ã®ã³ãŒãéçºã«å€å€§ãªè²¢ç®ãããŠããŸããã AlibabaãAT&TãBarefootãCiscoãFox NetworksãGoogleãIntelãIXIAãJuniper NetworksãMellanoxãMicrosoftãNetcopeãNetronomeãVMwareãXilinxãZTE ãªã©ã®äŒæ¥ã«ã¯ãå°ä»»ã®éçºè ãããŸãã BUPTãã³ãŒãã«å€§åŠãããŒããŒã倧åŠãMITãNCTUãããªã³ã¹ãã³å€§åŠãã¹ã¿ã³ãã©ãŒã倧åŠããã¯ããªã³å€§åŠãæž è¯å€§åŠãããµãã¥ãŒã»ãã倧åŠãUSI ãªã©ã®å€§åŠããã®åæ¥çã CORDãFD.ioãOpenDaylightãONOSãOvSãSAIãStratum ãªã©ã®ãªãŒãã³ ãœãŒã¹ ãããžã§ã¯ãã¯ãP4 ãç¬ç«ããã³ãã¥ãã㣠ãããžã§ã¯ãã§ãããšããäºå®ã匷調ããŠããŸãã
P4 èšèªã®ã³ã³ãããŒã©ãŒã®äžè¬çãªçæ:
ã¢ããªã±ãŒã·ã§ã³ã®èŠéã
ãã®èšèªã¯ã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã£ã³ã°ãç®çãšããŠãããããèŠä»¶ãšèšèšãªãã·ã§ã³ã®ãªã¹ãã¯æ±çšããã°ã©ãã³ã°èšèªãšã¯ç°ãªããŸãã ãã®èšèªã®äž»ãªç¹åŸŽã¯æ¬¡ã®ãšããã§ãã
- ã¿ãŒã²ããå®è£ ããã®ç¬ç«æ§ã
- 䜿çšããããããã³ã«ã®ç¬ç«æ§ã
- ãã£ãŒã«ãã®åæ§æå¯èœæ§ã
ç®æšã®å®è£ ããã®ç¬ç«æ§
P4 ããã°ã©ã ã¯å®è£ ã«äŸåããªãããã«èšèšãããŠãããæ±çšããã»ããµãFPGAãã·ã¹ãã ãªã³ ãããããããã¯ãŒã¯ ããã»ããµãASIC ãªã©ãããŸããŸãªçš®é¡ã®å®è¡ãšã³ãžã³çšã«ã³ã³ãã€ã«ã§ããããšãæå³ããŸãã ãããã®ããŸããŸãªã¿ã€ãã®ãã·ã³ã¯ P4 ã¿ãŒã²ãããšããŠç¥ãããŠãããåã¿ãŒã²ããã«ã¯ P4 ãœãŒã¹ ã³ãŒããã¿ãŒã²ãã ã¹ã€ãã ã¢ãã«ã«å€æããã³ã³ãã€ã©ãå¿ èŠã§ãã ã³ã³ãã€ã©ã¯ãã¿ãŒã²ãã ããã€ã¹ãå€éšãœãããŠã§ã¢ãããã«ã¯ã¯ã©ãŠã ãµãŒãã¹ã«çµã¿èŸŒãããšãã§ããŸãã P4 ããã°ã©ã ã®åœåã®ã¿ãŒã²ããã®å€ãã¯åçŽãªãã±ãã亀æã§ãã£ãããããP4 ã¿ãŒã²ãããã®æ¹ãæ£ç¢ºã§ããã«ããããããããP4 ã¹ã€ããããšããçšèªãããè³ã«ããŸãã
䜿çšããããããã³ã«ã®ç¬ç«æ§
P4 ã¯ãããã³ã«ã«äŸåããŸããã ããã¯ããã®èšèªã IPãã€ãŒãµããããTCPãVxLANãMPLS ãªã©ã®äžè¬çãªãããã³ã«ããã€ãã£ãã«ãµããŒãããŠããªãããšãæå³ããŸãã 代ããã«ãP4 ããã°ã©ãã¯ããã°ã©ã å ã§å¿ èŠãªãããã³ã«ã®ããããŒåœ¢åŒãšãã£ãŒã«ãåãèšè¿°ããŸãããããã¯ãã³ã³ãã€ã«ãããããã°ã©ã ãšã¿ãŒã²ãã ããã€ã¹ã«ãã£ãŠè§£éãããåŠçãããŸãã
ãã£ãŒã«ãåæ§æå¯èœæ§
ãããã³ã«ã®ç¬ç«æ§ãšæœè±¡èšèªã¢ãã«ã«ããåæ§æãå¯èœã§ããP4 ã¿ãŒã²ããã¯ãã·ã¹ãã ã®å±éåŸã«ãã±ããåŠçãå€æŽã§ããå¿ èŠããããŸãã ãã®æ©èœã¯åŸæ¥ãåºå®æ©èœã®éç©åè·¯ã§ã¯ãªããæ±çšããã»ããµãŸãã¯ãããã¯ãŒã¯ ããã»ããµãä»ããã«ãŒãã£ã³ã°ã«é¢é£ä»ããããŠããŸããã
ãã®èšèªã«ã¯ãç¹å®ã®ãããã³ã« ã»ããã®ããã©ãŒãã³ã¹ã®æé©åã劚ãããã®ã¯äœããããŸãããããããã®æé©åã¯èšèªäœæè ã«ã¯èŠãããæçµçã«ã·ã¹ãã ãšç®æšã®æè»æ§ãããã³ãããã®åæ§æå¯èœæ§ãäœäžãããå¯èœæ§ããããŸãã
ãã®èšèªã®ãããã®ç¹æ§ã¯ãåœåããããã¯ãŒã¯ ã€ã³ãã©ã¹ãã©ã¯ãã£ã§åºã䜿çšãããããšã«çŠç¹ãåœãŠãŠããã®äœæè ã«ãã£ãŠå®ããããŸããã
ãã®èšèªã¯ãã§ã«å€ãã®äŒæ¥ã§äœ¿çšãããŠããŸãã
1) ãã€ããŒã¹ã±ãŒã« ããŒã¿ã»ã³ã¿ãŒã
äžåœäŒæ¥ãã³ã»ã³ãã¯äžçæ倧ã®æè³äŒç€Ÿã§ãããæ倧èŠæš¡ã®ãã³ãã£ãŒãã£ãã¿ã«äŒç€Ÿã®äžã€ã§ãã ãã³ã»ã³ãã®åäŒç€Ÿã¯äžåœããã³äžçååœã«ãããããŸããŸãªã€ã³ã¿ãŒããã ãµãŒãã¹ã人工ç¥èœããã³é»åãšã³ã¿ãŒãã€ã¡ã³ãåéã®éçºãªã©ããã€ã㯠ããžãã¹ã®ããŸããŸãªåéãå°éãšããŠããŸãã
P4 ãšããã°ã©ããã« ã«ãŒãã£ã³ã°ã¯ãå瀟ã®ãããã¯ãŒã¯ ã¢ãŒããã¯ãã£ã§äœ¿çšãããŠããé«åºŠãªãã¯ãããžã§ãã
Google ã¯ãåµå§è ã® 4 ã€ãšããŠããããã¯ãŒã¯æ¥çãç¹ã«ããŒã¿ã»ã³ã¿ãŒã®ã¢ãŒããã¯ãã£èšèšã«ãã㊠PXNUMX ãæ¥éã«æ¡çšãããŠããããšãèªãã«æã£ãŠããŸãã
2) å¶å©äŒæ¥ã
ãŽãŒã«ããã³ã»ãµãã¯ã¹ã¯ããªãŒãã³ãœãŒã¹ ã³ãã¥ããã£ãšã®é£æºãå ±éã®æšæºãšãœãªã¥ãŒã·ã§ã³ã®éçºã掻çšããŠããããã¯ãŒã¯ ã€ã³ãã©ã¹ãã©ã¯ãã£ãé©æ°ããããè¯ããœãªã¥ãŒã·ã§ã³ãã¯ã©ã€ã¢ã³ãã«æäŸããŸãã
3) çç£ã
ãããã¯ãŒã¯æ¥çå šäœãã転éåäœãç¬èªã«å®çŸ©ãã P4 ã®ãããªèšèªããæ©æµãåããã§ãããã ã·ã¹ã³ã¯ãŸããèªç€Ÿã®è£œåã©ã€ã³ããã®èšèªã䜿çšããããã«ç§»è¡ãããšèããŠããŸãã
ãžã¥ãããŒãããã¯ãŒã¯ã¹ã¯ãP4 ããã³ P4 ã©ã³ã¿ã€ã ãå€ãã®è£œåã«çµã¿èŸŒã¿ããžã¥ãããŒçµã¿èŸŒã¿ããã»ããµãšãã®ãœãããŠã§ã¢ ã³ãŒããžã®ããã°ã©ã ã«ããã¢ã¯ã»ã¹ãæäŸããŸãã
Ruijie Networks ã¯ãP4 ãšããããããã¯ãŒã¯ã«ããããã¡ãªããã匷åã«ãµããŒãããŠããŸãã P4 ã䜿çšããããšã§ãå瀟ã¯ã¯ã©ã¹æé«ã®ãœãªã¥ãŒã·ã§ã³ãäœæããå¹ åºã顧客ã«æäŸã§ããŸãã
4) é»æ°éä¿¡ãããã€ããŒã
AT&T 㯠P4 ã®æ©ææ¡çšè ã§ãããèªç€Ÿã®ãããã¯ãŒã¯å ã§èŠããåäœãå®çŸ©ããããã« P4 ã䜿çšããèªç€Ÿã®ãããã¯ãŒã¯äžã§ P4 ããã°ã©ã å¯èœãªè»¢éããã€ã¹ã䜿çšããæåã®äŒæ¥ã® XNUMX ã€ã§ãã
ãã€ããã¬ã³ã ã§ã¯ããã®èšèªã Access 4.0 ããã°ã©ã ã®äžéšãšããŠäž»èŠãªãããã¯ãŒã¯æ©èœã®ãããã¿ã€ãã«äœ¿çšããŠããŸãã
5) åå°äœç£æ¥ã
ãã®èšèªã«ãããBarefoot ã¯ãœãããŠã§ã¢æ©èœããããã¯ãŒã¯ ã«ãŒãã£ã³ã° ãã¬ãŒã³ã«æäŸããããã®æ°ãããã©ãã€ã ãå®è£ ã§ããããã«ãªããŸããã
ã¶ã€ãªã³ã¯ã¹ã¯ P4.org ã®åµèšè ã® 4 人ã§ãP416 èšèªã®éçºã«ç©æ¥µçã«é¢äžããããã SmartNIC ããã³ NFV ããŒããŠã§ã¢çšã® FPGA ããŒã¹ã®ããã°ã©ããã« ãã©ãããã©ãŒã ã«å®è£ ããSDNet ãã¶ã€ã³ã®äžéšãšããŠæåã® PXNUMX ã³ã³ãã€ã©ã® XNUMX ã€ããªãªãŒã¹ããŸããã
6) ãœãããŠã§ã¢ã
VMware ã¯ãP4 ãå€å€§ãªãšãã«ã®ãŒãã€ãããŒã·ã§ã³ãã³ãã¥ããã£ãçã¿åºãããããã¯ãŒã¯ã«ãããææ矩ãã€å¿ èŠãªå€é©ãæšé²ãããšä¿¡ããŠããŸãã ã€ã³ãã©ã¹ãã©ã¯ãã£ã®æ©èœãæ¡åŒµãããããææ°ã®è£œåã«å®è£ ãããœãããŠã§ã¢ ããŒã¹ã®ã¢ãããŒãã«ãã£ãŠã€ãããŒã·ã§ã³ã®æ°ããªæ³¢ãæšé²ãããŠãããããVMware ã¯åœåãããã®æ¥çã®åãã«åå ããŠããŸããã
ãããã£ãŠãP4 ã¯ãã¿ãŒã²ããã«äŸåããããããã³ã«ã«äŸåããªãããã°ã©ãã³ã°èšèªã§ããããã±ãã ã«ãŒãã£ã³ã°ã®åäœãããã°ã©ã ãšããŠç¬èªã«å®çŸ©ããããã«ç£æ¥çãåŠè¡æ©é¢ã§äœ¿çšãããŠãããè€æ°ã®ã¿ãŒã²ããåãã«ã³ã³ãã€ã«ããããšãã§ããŸãã çŸåšãã¿ãŒã²ããã«ã¯ãããŒããŠã§ã¢ããã³ãœãããŠã§ã¢ ã¹ã€ããããã€ããŒãã€ã¶ãŒ ã¹ã€ãããNPUãGPUãFPGAãSmartNICãããã³ ASIC ãå«ãŸããŸãã
ãã®èšèªã®äž»ãªæ©èœã«ããããã®é©çšç¯å²ãå€§å¹ ã«æ¡åŒµããããããã¯ãŒã¯ ã¢ãŒããã¯ãã£ãžã®è¿ éãªå®è£ ãä¿èšŒãããŸãã
ã¯ããã«
P4 ã¯ãªãŒãã³ ãããžã§ã¯ãã§ãããé¢é£æ
å ±ã¯ãã¹ãŠ Web ãµã€ãã«ãããŸãã
ãªããžããªãªã³ã¯
ã«ãŒãã«ã®äž»ãªæœè±¡åãèŠãŠã¿ãŸãããã
ããããŒã®å®çŸ© â 圌ãã®å©ããåããŠããããã³ã«ããããŒã決å®ãããŸãã
ããããŒå®çŸ©ã§ã¯æ¬¡ã®ããã«æå®ããŸãã
- ãã±ãããã©ãŒããããšããããŒãã£ãŒã«ãåã®èª¬æ
- åºå®ãã£ãŒã«ããšå¯å€ãã£ãŒã«ããèš±å¯ãããŠããŸã
äŸãã°
header Ethernet_h{
bit<48> dstAddr;
bit<48> srcAddr;
bit<16> etherType;
}
header IPv4_h{
bit<4> version;
bit<4> ihl;
bit<8> diffserv;
bit<16> totalLen;
bit<16> identification;
bit<3> flags;
bit<13> fragOffset;
bit<8> ttl;
bit<8> protocol;
bit<16> hdrChecksum;
bit<32> srcAddr;
bit<32> dstAddr;
varbit<320> options;
}
ããŒãµãŒ â 圌ãã®ä»äºã¯èŠåºãã解æããããšã§ãã
次ã®ããŒãµãŒã®äŸã¯ããã·ã³ã®æçµç¶æ ã® XNUMX ã€ã®åæç¶æ ãã XNUMX ã€ã®æçµç¶æ ã®ãããããžã®é·ç§»ã決å®ããŸãã
parser MyParser(){
state start{transition parse_ethernet;}
state parse_ethernet{
packet.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType){
TYPE_IPV4: parse_ipv4;
default: accept;
}
}âŠ
}
ããŒãã« â ãŠãŒã¶ãŒããŒãšã¢ã¯ã·ã§ã³ããªã³ã¯ãããã·ã³ç¶æ ãå«ãŸããŸãã 掻å â ããã±ãŒãžã®æäœæ¹æ³ã®èª¬æã
ããŒãã«ã«ã¯ãã±ãã転éã®ç¶æ (管çã¬ãã«ã§å®çŸ©) ãå«ãŸããŠãããMatch-Action ãŠãããã«ã€ããŠèª¬æããŸãã
ãã±ããã¯ä»¥äžã«ãã£ãŠç §åãããŸãã
- å®å šã«äžèŽ
- æé·å眮äžèŽ (LPM)
- ããªãã«ãããã³ã°ïŒãã¹ãã³ã°ïŒ
table ipv4_lpm{
reads{
ipv4.dstAddr: lpm;
} actions {
forward();
}
}
èãããããã¹ãŠã®ã¢ã¯ã·ã§ã³ãäºåã«ããŒãã«ã§å®çŸ©ããå¿ èŠããããŸãã
ã¢ã¯ã·ã§ã³ã¯ã³ãŒããšããŒã¿ã§æ§æãããŸãã ããŒã¿ã¯ç®¡çã¬ãã«ããååŸãããŸã (IP ã¢ãã¬ã¹/ããŒãçªå·ãªã©)ã ç¹å®ã®ã«ãŒãããªãŒã®ããªããã£ãã¯ã¢ã¯ã·ã§ã³å ã§çŽæ¥æå®ã§ããŸãããåœä»€ã®æ°ã¯äºæž¬å¯èœã§ããå¿ èŠããããŸãã ãããã£ãŠãã¢ã¯ã·ã§ã³ã«ã¯ã«ãŒããæ¡ä»¶ã¹ããŒãã¡ã³ããå«ããããšã¯ã§ããŸããã
action ipv4_forward(macAddr_t dstAddr, egressSpec_t port){
standard_metadata.egress_spec = port;
hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
hdr.ethernet.dstAddr = dstAddr;
hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
}
ãããã¢ã¯ã·ã§ã³ã¢ãžã¥ãŒã« - æ€çŽ¢ããŒã®äœæãããŒãã«å ã§ã®æ€çŽ¢ãã¢ã¯ã·ã§ã³ã®å®è¡ãè¡ãã¢ã¯ã·ã§ã³ã
ã¢ãžã¥ãŒã«ã®å žåçãªäŸã次ã®å³ã«ç€ºããŸãã
å¶åŸ¡ãã㌠â ã¯ãMatch-Action ã¢ãžã¥ãŒã«ã䜿çšãããé åºã瀺ããŸãã ããã¯ãé«ã¬ãã«ã®ããžãã¯ãš Match-Action ã·ãŒã±ã³ã¹ãå®çŸ©ããåœä»€åããã°ã©ã ã§ãã å¶åŸ¡ãããŒã¯ãå¶åŸ¡ã¬ãã«ãå®çŸ©ããããšã«ãã£ãŠãã¹ãŠã®ãªããžã§ã¯ãããªã³ã¯ããŸãã
å€éšãªããžã§ã¯ã æ確ã«å®çŸ©ãããã¢ãŒããã¯ãã£ãš API ã€ã³ã¿ãŒãã§ã€ã¹ãæã€ç¹å®ã®ãªããžã§ã¯ãã§ãã ããšãã°ããã§ãã¯ãµã èšç®ãã¬ãžã¹ã¿ãã«ãŠã³ã¿ãã«ãŠã³ã¿ãªã©ã§ãã
extern register{
register(bit<32> size);
void read(out T result, in bit<32> index);
void write(in bit<32> index, in T value);
}
extern Checksum16{
Checksum16(); //constructor
void clear(); //prepare unit for computation
void update(in T data); //add data to checksum
void remove(in T data); /remove data from existing checksum
bit<16> get(); //get the checksum for the data added since last clear
}
ã¡ã¿ããŒã¿ â åããã±ãŒãžã«é¢é£ä»ããããããŒã¿æ§é ã
ã¡ã¿ããŒã¿ã«ã¯ 2 çš®é¡ãããŸãã
ã«ã¹ã¿ã ã¡ã¿ããŒã¿ (ãã¹ãŠã®ããã±ãŒãžã®ç©ºã®æ§é )
ããã«ã¯äœã§ã奜ããªãã®ãå
¥ããããšãã§ããŸã
ãã€ãã©ã€ã³å
šäœã§å©çšå¯èœ
ããã±ãŒãžã®ããã·ã¥ãä¿åãããªã©ãç¬èªã®ç®çã§äœ¿çšãããšäŸ¿å©ã§ã
å
éšã¡ã¿ããŒã¿ - ã¢ãŒããã¯ãã£ã«ãã£ãŠæäŸããã
ããã§å
¥åããŒããåºåããŒããå®çŸ©ããŸã
ãã±ããããã¥ãŒã«å
¥ãããããšãã®ã¿ã€ã ã¹ã¿ã³ãããã¥ãŒã®æ·±ã
ãã«ããã£ã¹ãããã·ã¥/ãã«ããã£ã¹ããã¥ãŒ
ããã±ãŒãžã®åªå
é äœãããã±ãŒãžã®éèŠæ§
åºåããŒãã®ä»æ§ (äŸ: åºåãã¥ãŒ)
P4ã³ã³ãã€ã©
P4 ã³ã³ãã€ã© (P4C) ã¯ä»¥äžãçæããŸãã
- ããŒã¿ ãã¬ãŒã³ ã©ã³ã¿ã€ã
- ããŒã¿ãã¬ãŒã³ã§ãã·ã³ã®ç¶æ ã管çããããã® API
P4èšèªã§ã®ãœãããŠã§ã¢ã¹ã€ããã®äŸ
ãœãŒã¹ã³ãŒãã¯ãªããžããªããããŠã³ããŒãã§ããŸãã
p4lang/p4c-bm: bmv2 ã® JSON æ§æãäœæããŸã
p4lang/bmv2: bmv2 ããŒãžã§ã³ã® JSON æ§æãç解ãããœãããŠã§ã¢ ã¹ã€ãã
å³ã¯ãããžã§ã¯ãã®ã³ã³ãã€ã«å³ã瀺ããŠããŸãã
ããŒãã«ãã¬ãžã¹ã¿ãã«ãŠã³ã¿ã®èªã¿åãã«ããæäœ:
- table_set_default <table name> <action name> <action parameters>
- table_add <table name> <action name> <match fields> => <action
parameters> [priority]
- table_delete <table name> <entry handle>
ãœãŒã¹ ã³ãŒãã«ã¯ããœãããŠã§ã¢ ã¹ã€ãã API ã䟿å©ã«äœ¿çšããããã® simple_switch_CLI ããã°ã©ã ãå«ãŸããŠããŸãã
ãã®äŸãšä»ã®äŸã¯ãªããžããªããããŠã³ããŒãã§ããŸãã
PS ãã®å€ã®åããã€ã³ãã«ã¯ãã€ããŒã¹ã±ãŒã« ã¯ã©ãŠã ãŠãŒã¶ãŒã®ããŒãºã«è¿ éã«å¯Ÿå¿ããããã«ããã¢ããã ãããã¯ãŒã¯ã¹ãè²·åããå¥çŽã«çœ²åããŸããã Navin Shenoy (Intel Corporation ããŒã¿ã»ã³ã¿ãŒ ã°ã«ãŒãå·è¡å¯ç€Ÿé·å ŒãŒãã©ã« ãããŒãžã£ãŒ) ãè¿°ã¹ãããã«ãããã«ãããIntel ã¯ãã倧ããªã¯ãŒã¯ããŒããšããå€ãã®æ©äŒãããŒã¿ã»ã³ã¿ãŒé¡§å®¢ã«æäŸã§ããããã«ãªããŸãã
ç§ã®å人çãªæèŠã§ã¯ãIntel 㯠FPGA ããã補é ã®ãªãŒããŒã§ãããåªãã Quartus ç°å¢ãåããŠããããšãå¿ããŠã¯ãªããŸããã ããã¯ãIntel ã®ç»å Žã«ãããBarefoot ã®è£œåã©ã€ã³ãæ¡åŒµãããã ãã§ãªããQuartus ãš P4 Studio ãé倧ãªã¢ããããŒããåããToffino ããã³ Toffino 2 ã©ã€ã³ã«è¿œå ãããããšãæåŸ ã§ããããšãæå³ããŸãã
P4 ã³ãã¥ããã£ã®æ£åŒã¡ã³ã㌠- äŒç€Ÿ
åºæïŒ habr.com