vppbuffer接口
头条创作挑战赛vppbuffer接口bufferVLIBbufferrepresentation。typedefunion{使用union方便在结构体和byte(内存)之间转换struct{CLIBCACHELINEALIGNMARK(cacheline0);用来做cacheline对齐signedoffsetindata〔〕,predata〔〕thatwearecurrentlyprocessing。Ifnegativecurrentheaderpointsintopredataarea。i16currentdata;Nbytesbetweencurrentdataandtheendofthisbuffer。u16currentlength;bufferflags:
VLIBBUFFERFREELISTINDEXMASK:bitsusedtostorefreelistindex,
VLIBBUFFERISTRACED:tracethisbuffer。
VLIBBUFFERNEXTPRESENT:thisisamultichunkbuffer。
VLIBBUFFERTOTALLENGTHVALID:asitsays
VLIBBUFFEREXTHDRVALID:buffercontainsvalidexternalbuffermanagerheader,settoavoidaddingittoaflowreport
VLIBBUFFERFLAGUSER(n):userdefinedbitNu32flags;Genericflowidentifieru32flowid;Referencecountforthisbuffer。volatileu8refcount;indexofbufferpoolthisbufferbelongs。u8bufferpoolindex;Errorcodeforbufferstobeenqueuedtoerrorhandler。vliberrorterror;Nextbufferforthislinkedlistofbuffers。OnlyvalidifVLIBBUFFERNEXTPRESENTflagisset。u32nextbuffer;Thefollowingfieldscanbeinaunionbecauseonceapacketentersthepuntpath,itisnolongeronafeaturearcunion{Usedbyfeaturesubgrapharcstovisitenabledfeaturenodesu32currentconfigindex;thereasonthepacketoncepuntedu32puntreason;};Opaquedatausedbysubgraphsfortheirownpurposes。u32opaque〔10〕;partofbuffermetadatawhichisinitializedonallocendshere。STRUCTMARK(templateend);startof2ndhalf(2ndcachelineonsystemswherecachelinesizeis64)CLIBALIGNMARK(secondhalf,64);SpecifiestracebufferhandleifVLIBPACKETISTRACEDflagisset。u32tracehandle;Onlyvalidforfirstbufferinchain。Currentlengthplustotallengthgivenheregivetotalnumberofbytesinbufferchain。u32totallengthnotincludingfirstbuffer;Moreopaquedata,see。。vnetvnetbuffer。hu32opaque2〔14〕;ifVLIBBUFFERTRACETRAJECTORY0tracetrajectorydataweuseaspecificcachelineforthatinthebufferwhenitiscompiledindefineVLIBBUFFERTRACETRAJECTORYMAX31defineVLIBBUFFERTRACETRAJECTORYSZ64defineVLIBBUFFERTRACETRAJECTORYINIT(b)(b)trajectorynb0CLIBALIGNMARK(trajectory,64);u16trajectorynb;u16trajectorytrace〔VLIBBUFFERTRACETRAJECTORYMAX〕;elseVLIBBUFFERTRACETRAJECTORYdefineVLIBBUFFERTRACETRAJECTORYSZ0defineVLIBBUFFERTRACETRAJECTORYINIT(b)endifVLIBBUFFERTRACETRAJECTORYstartofbufferheadroomCLIBALIGNMARK(headroom,64);Spaceforinsertingdatabeforebufferstart。Packetrewritestringwillberewrittenbackwardsandmayextendbackbeforebufferdata〔0〕。Mustcomedirectlybeforepacketdata。u8predata〔VLIBBUFFERPREDATASIZE〕;Packetdatau8data〔〕;变长数组,用来保存数据部分};ifdefCLIBHAVEVEC128u8x16asu8x16〔4〕;endififdefCLIBHAVEVEC256u8x32asu8x32〔2〕;endififdefCLIBHAVEVEC512u8x64asu8x64〔1〕;endif}vlibbuffert;常用接口增将数据data添加到buffer里,没有空余的buffer会申请新的内存,同时会将buffer的索引赋值给bufferindex,方便后续用于访问
intvlibbufferadddata(vlibmaintvm,vlibbufferfreelistindextfreelistindex,u32bufferindex,voiddata,u32ndatabytes);删alwaysinlinevoid
vlibbufferfree(vlibmaintvm,
pointertofirstbuffer
u32buffers,
numberofbufferstofree
u32nbuffers);改通过移动buffer的currentdata指针来取数据或者添加数据,并同时修改buffer的currentlength值
一般l为正数表示往前读取数据,当然也可以进行修改
一般l为负数表示往后添加数据
alwaysinlinevoidvlibbufferadvance(vlibbuffertb,wordl);查vm是vpp运行时主结构体,bufferindex是buffer的索引,一般在添加buffer时可以获取到,或者遍历buffer时获取
alwaysinlinevlibbuffertvlibgetbuffer(vlibmaintvm,u32bufferindex);
获取当前数据所在的指针位置,一般用于对buffer进行指针偏移后使用
alwaysinlinevoidvlibbuffergetcurrent(vlibbuffertb);