From 808d22524d883386e48277865b017fd9a6d36b99 Mon Sep 17 00:00:00 2001 From: Mohamed Mahmoud Date: Thu, 26 Oct 2023 11:29:14 -0400 Subject: [PATCH] WIP: dbg DNS over TCP NA fields Signed-off-by: Mohamed Mahmoud --- bpf/dns_tracker.h | 12 +++++++++++- bpf/flows.c | 2 ++ bpf/types.h | 2 ++ pkg/ebpf/bpf_bpfeb.go | 1 + pkg/ebpf/bpf_bpfeb.o | Bin 92752 -> 93752 bytes pkg/ebpf/bpf_bpfel.go | 1 + pkg/ebpf/bpf_bpfel.o | Bin 94504 -> 95528 bytes pkg/flow/record_test.go | 2 ++ 8 files changed, 19 insertions(+), 1 deletion(-) diff --git a/bpf/dns_tracker.h b/bpf/dns_tracker.h index 571526958..c2cdd8e7f 100644 --- a/bpf/dns_tracker.h +++ b/bpf/dns_tracker.h @@ -9,6 +9,8 @@ #define DNS_PORT 53 #define DNS_QR_FLAG 0x8000 #define UDP_MAXMSG 512 +#define EINVAL 22 +#define E2BIG 7 struct dns_header { u16 id; @@ -71,13 +73,20 @@ static __always_inline void track_dns_packet(struct __sk_buff *skb, pkt_info *pk u8 len = calc_dns_header_offset(pkt, data_end); if (!len) { + pkt->dns_errno = EINVAL; return; } struct dns_header dns; + int ret; u32 dns_offset = (long)pkt->l4_hdr - (long)skb->data + len; - if (bpf_skb_load_bytes(skb, dns_offset, &dns, sizeof(dns)) < 0) { + if (((long)skb->data + dns_offset + sizeof(dns)) > (long)skb->data_end) { + pkt->dns_errno = E2BIG; + return; + } + if ((ret = bpf_skb_load_bytes(skb, dns_offset, &dns, sizeof(dns))) < 0) { + pkt->dns_errno = -ret; return; } @@ -97,6 +106,7 @@ static __always_inline void track_dns_packet(struct __sk_buff *skb, pkt_info *pk pkt->dns_latency = ts - *value; pkt->dns_id = dns_id; pkt->dns_flags = flags; + pkt->dns_errno = -ret; bpf_map_delete_elem(&dns_flows, &dns_req); } } // end of dns response diff --git a/bpf/flows.c b/bpf/flows.c index 219660e64..fe69375c7 100644 --- a/bpf/flows.c +++ b/bpf/flows.c @@ -97,6 +97,7 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) { aggregate_flow->dns_record.id = pkt.dns_id; aggregate_flow->dns_record.flags = pkt.dns_flags; aggregate_flow->dns_record.latency = pkt.dns_latency; + aggregate_flow->dns_record.errno = pkt.dns_errno; long ret = bpf_map_update_elem(&aggregated_flows, &id, aggregate_flow, BPF_ANY); if (trace_messages && ret != 0) { // usually error -16 (-EBUSY) is printed here. @@ -119,6 +120,7 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) { .dns_record.id = pkt.dns_id, .dns_record.flags = pkt.dns_flags, .dns_record.latency = pkt.dns_latency, + .dns_record.errno = pkt.dns_errno, }; // even if we know that the entry is new, another CPU might be concurrently inserting a flow diff --git a/bpf/types.h b/bpf/types.h index f9790427b..1205da3b4 100644 --- a/bpf/types.h +++ b/bpf/types.h @@ -89,6 +89,7 @@ typedef struct flow_metrics_t { u16 id; u16 flags; u64 latency; + u8 errno; } __attribute__((packed)) dns_record; u64 flow_rtt; } __attribute__((packed)) flow_metrics; @@ -162,6 +163,7 @@ typedef struct pkt_info_t { u16 dns_id; u16 dns_flags; u64 dns_latency; + u8 dns_errno; } pkt_info; // Structure for payload metadata diff --git a/pkg/ebpf/bpf_bpfeb.go b/pkg/ebpf/bpf_bpfeb.go index bb10a1591..7f6ceebd8 100644 --- a/pkg/ebpf/bpf_bpfeb.go +++ b/pkg/ebpf/bpf_bpfeb.go @@ -25,6 +25,7 @@ type BpfDnsRecordT struct { Id uint16 Flags uint16 Latency uint64 + Errno uint8 } type BpfFlowId BpfFlowIdT diff --git a/pkg/ebpf/bpf_bpfeb.o b/pkg/ebpf/bpf_bpfeb.o index 12b4001b8b2cf7624ef8cbbdfb3d4375a891a48f..4db47cf634307c9d9c9288f12b5ce3bdb1d205ef 100644 GIT binary patch delta 19298 zcmeI3e{@yXb?48y?+N{eCkfC4f!`Gf{RTZr2!#3dBoI6>HgXI|#KZ^?APfOvNGuzY zr^I%nPMnFHOY$^MW+Hw}jT^e6M0BCXnL*S1FiqX5X4##gYta?8@p9z}URGCWgIj0b zeD^u~ym$2CwkxYM{VQiJ-E%*C?{m&RzxF-%KA3nbW9&}G;0mXw`8(my`<%=_^sf6> zW}my57!pXwy}$9Tt_4MjUZ9H*8Rv!*gLHFqAzg*Y3O~&q$1f+M-r0=uSmyJD=U)9k_bI;-rmIN6{2<*RKfw7@ zoS&xrh8h>>Urlr=`KyWjoIk<&Cph27`Qw~_ob$aZ&wVw~$$}1VbMDqyFViW?4>V|R zZ*C$I;^~OWvd&yd9HzT8c>wZmlEdvIls~Pz69gY3MtuRw)5=kOpVD$Q70HIE!n346 z1)rwes_+c)=>|RgEO%fxqU1|NHsxn7CC+*4GB@t-BYIjjF0#&COgv3|EGYDnxR`i0 zP5%t>&1$-0-MMPr4c!bX6fdYL&#LhzG8g7#K1f2EK<{2=MNIYk^d>Qzq-LDJ`OIp3 zz-kphuf_$O%X&5K;2dT({b1dlD|))YS*%yn4$jmZOQ`vWKrhoP3AGNudKq3xsPzEW z%k)Y@tqZVT=2sGGeSr1ITuG>Pa=J0O%++$ixN8S4CpxI%8xgvS;7xBq_QKdF=^jX#-$U?rpaT>#-%3}w+c1<7_+0S*E{b@qKBEsJf;^D9GF826i{miYzAGg zoz$eLH3q#IbhXF8W>VDN1Diotn*(E_C*^XYm)bejKv%4?ny|`eb?AJfS(Ikeo?gO} zLyL1?&W0S``-4JwZ|D4V%dfYCtqn}gA|jmg-pJir@GC3cE6e+~Jny}gS6BZlIx6|k z?FMgUe#N8b$?9~FSHi`_XNb>TO$<|hbBL}&JhM>u=0Jg{BtG*>Vmsx>FDCja=RFtz zf7ZK}e^d^5b7yaogQK0ZeSSIU?JEq)tKRv-FLslcbNmMR}G=OY8ZOu z2v|7=R_%aQ!(ehGMhz;@AW#i~Rl{KA2v|7=RtU^UdxtDy(0sQ{~~ z0jrS)tDy&DDq^a~YHlDe5wYoeqetbhA^943=9!Y$iUc zMhN<_X!G_JhpJkY)TOJEZlar=YP?Y@ELw<9M?}Qiv1~QA_MPI;Jk`=ouK8(~EJVN? zURErFULaU3U2g*Sm0l!RTpvE;=sM0w?GZNk!i8cM8XiV2piqyl zo9elNR~qfW+~xJ^`5=xJ>f;Xw*I69_Dkau!)wy$^S?nM|hy(i^4&FC8w(?`a3%W`xRzs(q(A`e33T)GwlE zd_o-^czgmodAv@$;$L`h=FEI@CfBt(^8D-8^|F8QnR;wt;=A6R=8(MZeTeIrw`k3^ ztkVni2zuf2Vj1;@gCXx1Ys#|!i26NG$Xj07gLSb#B;v`Hhxqu8Wvvo8i*9h7AEX?t zG|1I*FslcwPIAcA*_hlRd(7cV%Gr)y&&Ytw;FCDMn}ddPtFJS9i=QhN!HU%QsEMb0OafF zCQTlMeCd7Cx{y>D$8^8Ob2;~R&(%aNd$8yWH*YYBR9z=)~v6;d;;Mp8!&^%9u;z9_sv<3j!zlp#KRa`cVp9G|Qkz4OpkN512&Yp)$` zf8?@X?(pt?>|1iNH~iRfSv8us>-AaL?c@NS3_HC$AFq?!yu8Qj-@&IdC^qJM_YRil$dBW;0DoPh z!9%~Z+}ZuUH$J$ca1Wm967Rfn7yhvS_pJQNOG})NFMDM#l^1plsSh1OmZ6*!qT>~B z-%I67I=;(dim)VpEzRsl-j$ac9_aXU7O&7|LVs@&^h(_^>D_y&-07I|7JUWT-*}rT z`@lPatW$ayzEWP^nGNS@S$rOi(1Tyij1Zl)EfzvHf%}j*NhK=0EU&@otn=1+peAr`7a>*6R-9{d12>!?BQdm5^1mB>%OqX*_-WMqil|M@4`=< zy~W=6SLZL>8_Lv1WVhV9-{?($b^eCEQA_l&b>Cs#pGw^a|2%cS_gQcA*B)%x`+_C< zl6C(L>;AHJ|9hh&U+a&0^CzQim6az>ojh7~=J>(o8@dmiJ>b^3-6zlNKXv5DnZsuR zXO2C4_|%a~$f~N`4Q`tC{=+A`tK4&5#ZP}e+Wq!>j`zRc4tVdrlRNM5Q%{{d<*s*o zkDpyZ^(poq|6hx}6+bQ;9r){SNbm8ff5L2Z-n%b2MJ}gfN8HNFr{K$a*Lz}eRZW$< z&JCkYVGJloGjQLu1JmUwv3B(9le>L+#uXBIzx-K=H~q8T(U*VzSHA3fLR9r&&u#Wz zcz>gu_I~t!xwA)(zW4qgXSZ|;k^2|Pc@u@bn(MlSoQsckg+t8W7BZL(9OV6yUbYdQ_H~EUZHP7e@!@L2n8{Jvn7DH{!Y!Se84jQrtyM(xcFq4TXATImwLR>`ynLMNqenE)q3&3HvC(Z}+2%#F4GKaOk z86)y`3`3GR!U7D*6oxGGHdpXpg!~WmkF5#T|Rn5`+j|!ka>mRE=!Lm zbbcT6At4uGit^zw*~iu!!7vIxgFjC=d01rmx0!z;oVirtq{Z0h`BN5?{WSC63OSBN zHX9wF`Zk1xd2Km>pIe(*|f@cC%%GNAc{4#fVh1(c@%=R6#rQK_Q~xImZ4f z!Y~||W9*H7jP2hPVh8LCTw*i+0s^jJBO2?4vcOb86;^<`!HtgyaTcMtpi@_fqAC^i zXx@mt9UUm>P1Ei z8@NXpL^VR%9Xx0Pnj;lLR-(s+LFQH=YnOptntwPDApw+ym6icM;S@GA_X-)ssx6E# ze+frBv{u;3{GWyF!idn5P}TR2klkcYJ*4`H(Ls7L61M~pib;P9@m~oZ)la{oEH?O( z5O0+VQN%rH85iP393+dvtS82it%x0L`MD5-I8PR_gNm_@i=x`Tb%_ucFyuvj78im0 zG5_R1(qPbHG8krV6Ji)WD7tDf-eZc!EXD{F!7)|eze6O&u9)jG|5!gO=Jspe?~ z(GhZJ%T^)35rBR|a~;ly!!h)rWXckt$5>~&z-1f|FsF;MEJi3@gi2I}q$frh;td?> z7PI{Zj)aTZKB@0#`!_NF6bc_;2aLxduE0dXkg0$pVTc6L*zrG3r(_s zBVC9`B*Kx-6|Cn-=b{oCauwOI(p~PciF9s6>rJF{xkD`+=-d(3$2iit+=G^J9qHWL zY(R`i=T0(nq;uIp6Y1P(tv7+J)U_CEsI<~zjCg6Y=9nr#22nPkz=0K5+HNs+MQNAC z2rQ*N%pB=TZ!vSETfz;RNVn852f8xNF`*(GJSt<4Or$G|>Iye;q$}&R7!H^5khXH9 zE9+zZxQ=vXgPKjGD;r{_z=jSjQ}tv2n@G2edu$@zGH%dBy7B;5z>%)JS+j|B#pTVmu0nbB{5Si!iW^K8xT-5K`?zW(t-^8Et5AwJ=3C6XjjN_C#x|}F%q(9W z7b9E^hm(wl zTlFO7p9FYamcc3r;BnHR0z7STqYyRdK~j$fYv7b(IC>R5tZ^;IG|)ftQu^occwYl< zX2!$pI@!likPMBL^m#x8TTz9@S0`%0KKVzD#V&tVI1HFRu~6Vh0yoUtgj9o zR1N+;PR(em&a_7ytA=3GY7j$QH>LTZdK{Z!9OeohdP>L>=utSzdSXPfaJ$8%?`8f^ z_#Oa%1>Jj!hweSnjfBnGv!<%8ePrwcpgFr8o5J}ckuil!qcvihxFkdd~_m%ey-pm z-e$3=8V8tvAmlB)dNmHF>4%vAO2{|R}AL{sdqK+%oFl90#j3^X5&CpJL{JVM_|aC`j|f_96v_1sh{~j2xk%2 zRMU{+nAm9q!))-Ha9lFD#r*fesl_5~;vw5fj45lnt@Z5-gcHV^StXc%OE@c0epMFp zMSQr#(S8+opxv-dsM2Hb;3L&DjCDOelP6+F65I21@)dYQY0vkN_H8PHt! zXTs^0VDyM0n@KIhnjif#0u4r_1rC#5F_oVL$4Ky(*yreB%M=?Bqlc}ii3)tok8KDC zThSxMD}+2d9~@xbgKdbXS*vR?8fZliZHHPrS#Rn?hhnNiESl%3Kpz|Yz7WqNv~Du| zfe-`W&D;a{rBWL^^w@g+Ce+3bCH1bZ@39^s&Z9$Z;h7G#H6#9$1CM#w_n5P`b}nGJ zE3E)K^w@3ed$J$a`d!$fy>M`g;lo0l1xLlq@=)p{M$nmMG55)dmQad(|2j! z^(x-outuWn(60A{yn-o+_G|ra1fHu^-~r~1_&AMyA04#V1;>V1a0G#e1jEe#UdU_M zX3?w6R3Y|lbi`t+a9p$C6urgz>-hSO5sFUZ<>s6C32uWBm6+n_eTy+dv27@rG(drE z0gHoR{3Z2s!LG%qU|S{gK0HTAAGR2EZELoe>Wf+&!u)S*w*&~S+d3_#3c8p-kAG-H z4fI${`d*8vfqsjzZMO|rO!W_19Kif<8)m^Z3=cJM)naO3B#pfa2)zfP6^|5^NWLdmI0KfQ;v0EEdC!q;aakhYjA0yP4vryPbSb~f{2As5 z^7rsgeT4aH8joqt+spdtnM^-{sq&LrKP!U#eIb^7S#xaGAPeql!K_KmF6Bt{3lkMs zN}CUfejyTwvBsgyPR+)F%yIBN*#8naQr0b8Y`(3zY&U7Kr_?X~FkpfD#fJ(M{IN1n zzqbgi9@Ahh^$=_tq@OdyhbevDu;!$G93zT(G3E0nHETWg6#ZNwF=@sizf!ZQAio`q zDQd!3KuWV+TrdJ=MCiu=VxylE(Y)aba-`rSE;M44BjMqavPb)ZzJZZ}DNx?8*)%}! z(sl*aliDG(W@>l}qO)L!MDJZ{P4OC{*Cu<7(QA(ykx3eVq!nG-z>EN$AgO?13e0v7 zDee**2Pv-3&_^}b-a(GEtqT`xgtql--g8yAufiG`BnymdgJc7fn#~Yz2a-K1P>G@n zamQTd2s6%Fl(u)_Li$IE!2P%o_j+=FdAvI$>+;V-#9Oy;JU$$fOJfUCBHtkHIXQoV z8#c|rSexX$n389OjTApizn+q3(_C?KMsdUS(9f7A`TmEN$6H;wI7VZSByXXj8@S;D zc|j#s7hiu$o-?jQ>f$_~lIQkYa%>kS-eNy)EfP~{|Vd}d6$vG zK5EH_Qu2&Ye8&>`cmU((52Z|e@w%n5_#hpGP4eGNsWXR-6dgtMF)ikFS@O#%dG2sZ z?)!t3Jg@(2OXd6+{myQZ57E<9mrqV}qJNEGhgrk>`^QC*Ln{!vjIj6qB5< zK6t1(~LG8%~wmdp7I^RrA97^-il^tt2laq2|wL`v^?DSh5lN}f?{ z$=g$MKRwTkQ#~oU&+2rZYstyR*bgeX3QfX!+fs}xg}P+SNy#aKo8*7Rl2fNS`B&hE z8>rR|D2?yclw3t-WB<*vlp;9EQe?jGq~r(`oy+7>dSaNmi^k#u5XBNH5q$|X$)S+Q zZj|>MDRx+9O72?re%gO*U)q(j_s3K6>i(2m48j<7#jDF@Am+T4vZ{@wtbAR#=UVBr zph^C6OMcr((dW*Tyw)C6Ye~{m$0Wb*jh?|4d$e7caKrTR%p~7SDS4w+QAQ*sr%y{J z`A?$kUUQ=>C2yMeDMMj-cC_!{GB}Y{_Z`rKx>EB722GpaLO?>|?C8uMm zNxn-d`L-@=x_r5o!Y?@2)iM-23OSFfAa8q8EJtRt zLwqcy_XTi&BE|GiO2j8qTyPurCsR!SI$#E4L}CJO=Eec~=K$hhis`p%(Vb%YX?X?@ zg01rOQ?gyYwj3<$16vN#FG4f88EiRN-UYVG zR|jd~S`Ji4z*Yej)$9V)V{2R1wu3DP=sTy)jV{=#k3MVK4m8EmDroATS)ge+t-x(? zFaCJV&_^}9fmM|=?eRqi|I|BW-_|#i=SRC{3g~-hd1 z#Z4rC)?#}8QR8e+pG}n`hF5}VMKB*}iU4TW8G{|Trx7*WjeFXKh-;LZsB-Fw;q$ns zU1^v`vd7{JxIY@dvjPKt#uAU={;b76#61n5sb(UL>6vTmr_%V|Ojbu;%YIcJ-k0qP zRt3`vgu$PRzgQ<@a^H=-u>4|0j6}2$c_=C)Y22R1U1{8##{FqLn8w31IaWC`Q&2gc z#uI5gna0yIxe91^sEWp*6o1^oDq1WlUM;F35G=6_+S8aOdY`55BfjxQr_6O?H1SSK zS92weuctAs0NehpG=4jcX~r%4TIz(wdur#-6x5cb@yayboW{G-xSROKwZ~<*Pag=H-iM3TVE9BDpHJf#)A$={d@YT? zZ}`bio_^|?GbhfTI{E4IPan_vRBvDLyxkppZ_NGwaP|KBmE4ZX!~5fjgYtp+vO{u#tdDO!Bp1sy@lPC*P4nSOgRY}Kc@u7k z|LJ}?FFtxmx(im;YjuOl(K2&={LUfSQQH{S4dDkv-CvcXLt20vBM67_Sz>$K>y~A5 zEI!sPS7+bHSRxfp#P0*;t$6sb+$e9ydnucWj~td8oF}s4(<-lwhmU~wcg1^;K;07` z(b+VlIrJ5l(%}D$Hy@R&a;D$W9DXC-2QDlf)0{hiycmCn;^Rl<3TJsFK7ACm)=kF4 zJ;=ko@m`hp$468?7@t=8a6EjB^ds?J^SIaZD={$L* IC8^T?1<0-&GXMYp delta 18178 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
*B11s8Z31Vr>jvOdgGnD`{wK=dCG?2F zA#jbsq^H9x2+(M5(J9ejvcx2T(WCKBY0p~VKLgZr58g+Bi(dcfci z_@cq2AHKo1AcIjBJWUx0ocWml0h|}ap%Z66Y5{RNIKVt%3l5q2ICdMH2M#k=l0J+B z2=f;3)M50DwTsAK~=$Y3?`R$BU)CEx*l?;2kB9-{y#Q0x>})xMjLbAj07H z@c4V?Na}d5VcuM#?E5@SU(P7~s~M!nte{V0)Z)bpIKf0AKE$IgkUlICYdw7^BJN(Q z?CHXpSXY>?S514mF*WV!YKBDPw&PS z8l)>kZ<=JUhmhVnG*kI<_cm)xoAdP=LQk8osSm7Ed1xlGC%xjqInRhXhBc}X!hgJIEEsD2HQsqm(_K{&g zZi-mX>HrquRYMaPmA7X=xLD?Z*h;!u%^3TnPF8-?UqXyuQXYz zlKS6E?%Ol0Ia7bnYWg;AhV$;+Qftc8POLjx{at=jiN8>BcS3D_+dW)r6_(REjlxBg zO`)Arb@1v{Qk;z4?@+2<_g_j;^o}Hw<6Q|W!3;lhi^{AizNBQgw#-^!02K5wY&F`)~lKP|VgH zvO-Em|GvO-dUrCz2V6LPt~bMP*uK}(S%=xaW4zqmQI0PnotQ)vI;0U|&V>Aj8NRP8 z6EUSYsOv(fj+b}oLUYH<=dyh>xq1BA*DuShBL82>mg9u)W<;&B*4H>~#8cJ*HX~nS zh99wg5I68<_(v`aH}B&DHV*{6fVihooV|y$9V;JaB|c_3-BX(30%zOhvHu<0k9y?a zGsitL(<-&saeBHf zFhdvYEbK@Ru}}}0niDvlRGHTB@ofJzi+PI?|IYc-ySN#aD|wn|Ud3Yf!*0PD z>&-+${FLQm@PB6L(*y63)BjIEJx-@8GaTaL>AZ>%y{`KuE9h8ehDn^!6*pdCEwq}> zKU-myS?=g;E9hRtKTplEnytTfch0e<+|rCZGK63Lu`K10${A&`T&>3&^6w#UvJbMI zwtw9H&KzsHeK*A2tRgSB13$ci%bCt!E%?!AdHteL*LQy`}F^p%~0PEX&QHB*7~ z%~>7x$? z3+2l$p^rWkbOP-%ueZq1?}l9}Pb$(=1?cjZf@Zq>)l3bb%U%jPKf1Z3fO}_^0bNy6 zAf^O#HAz7ypqod{d+^%4t zYSQ%7Dkm>QH?jeiiRJj`8NWE+BJ2*U=;o@Gvgt_8o< z22+a~4W`w(-C$bnF@wn)95i@09f3Ox!Cn}gFt`oeZ7_BDSr7Ml_$3bydH4;JE0N)d zDFDCY;pBx7B2bs@bKkGB9=C2e|L_89ez~ppa8l8b>$8Doy^b^od0lCy4{a1Q*Lb+z z!%gGa7P0XH`K8Xxu+yXO_HeI<2RwYy;38x^GLDy{#fE^qR_aVDUbTpr{&<)IwUG9! zN|VpOzr#xM*&FykLN-49wtIM=hd<}x6COV0;paX4(s;gG{BXQLT=MWc9=__~NwZOF z1l@pqlh40-kA**MKFKap5A|6OpY!l{J^Y4;FMIes4=2yNQ724IEcEdLQR3k$53ly{ zCJ*oO@Iepn+!bqW-`mo*``-H!`|nBJx97l=oKeq|VInRBh-KzEl_qs2WeC}Q)|IcK%;XZ5H{|3&)leGW< delta 18122 zcmeI2dwf;JwZ~_lB$5LJ^5*1(kOK*M99|&_5E78XJ4TdPLBpev074?5IUXuOtULH> zO1(9@u{*8wHfgzSykdzrRPw3b60N14e`!1F{RdS=a<#lPGW2z=RP4s z9DWDKwp~IbPIu5>A;wrjRA0Ju>7c*W*%X`aSsL%$8=H6C7HJe-9xII^<)3DbVcyK_ zVcx`y+z=w=8x^NW1aELYip{szN9A$@TV27au8+!P9kZ^*jm*>#Dy2qpL&|u`r%Pod z&cZwqkGrd?r9LfYzPSHaLaeuAT0}e))aGf3XC2BU6sOQCvW%49EE7b^8#um$;{!4# zI|`BVdY13vcqhj-Wy4G5NNtWVm#KEL2x6T$;eFDitnO zt&CKuN{36wv0e>hxO6PD8qRR3mst&8xKxfl8li?UTslVS?J6~%;ZmNMRcc(rr9APf z)cA%=d16+naSoTN2@x|v5F%A-=7dYRN>yq`jr6%)rA9DZI*}8oksj@I zHL|0F!UH?f>1xf44vJb!qn)m%YPf_4rCd$nh8$U(aN4|nyNBnB8iv!ylxhsRsTD5k z^xcZ@!`%EShAvLzNx>=ABoXo7ttO%W5Xa3N+Z?MVMf^Nj{i+EOziL{<`IGmJ!h57` zU0s39J95XTB=7d$FXR0vOZpmri&HUfS4OLphLcOA^?J{vF;w>hk99gvkDF_?Iq!~} z=Mk5>FJ>H%ar!3~Pi>R-*;A#tIEDFA{e3v5Qv78lMS>O1nJEi0l;tk;5KXPMyj*uzUFpoo&bP;M8eUhyL}p%B!HLYgu7VSo zd0hn)n0Z|V$20Q~2FEe;Itr#S^E9`E=`7%N6ii{}brwuz=5-WIVn%xqBEe+lS`mdGvz;=IN}@VpcOR5}d-UW^p8#$(&2} z@V~*yEKnmJ31%=);|%@G+02ue1I#|=bmrO2Y0R^jQ<-Nn(@tzt7tUZoG8+V$lb8#c zmBWt&3z*pr1oN4vu>E{yICq3da31qy=2GTNSw0L(Sm0-aV&)9yxyj`MQZB||&BZ%Uq)wk3l7d~tcnVuf zB(GH+1zx7~Sn*OHv($NdT6W=z%TvWHSE*F3L^x)pkS~V0QP$6g zkh95J_^j;WuqPzrf2h;Jx~|B{c5cf_{s+64uhP-xXzmwdlyAAqrWY-oemeM6#IAZ5 zc6aGPla&i!t2Rqfx2;-sMp{gqn1`ou3cK)B<-(&+HS1$PQg%t|w3TL!6SRx1w}yp0 zb=e)A(%q(6AIOYP(81{I+FaaPWIk{goMfrs2M{)rp$XA$Dn%yB{;cn*x@_l`_w z=0^>hmGhRA(=m>?xFJRP68$%%Ib2}K1YMjNnErfJ0 zAf_(f>)wRFqI-YnJu69_l(zH!zrB32b8y*>*ppsawqS-jd+y@hW~~}VvD>fCmu4}v zvu38P7mbv$xLkA7@_A!-DLES4eQfy$|5vGxucT6AR{g!DW>xT@$vKG5`N}i0vvwc; zu8gzQc|sh#qgV3fb$d4}Gr^Qpqa9h+Z@RY!PkXGk?wncKmeuYopPj!nBwO%zEMRG` z`z-v89_R7df9ELz3wp+!zptJeqJ3iGr?%P|sMB=d{d{tEff(9tgA-F|*8=;%=fes##D3R2ka zS1(Etzk0to=r53V2mR`7y4zpI>B?n1(oO!wl1IA9f2Cv_{UjgE8kV7;NO09BEJ z%2kE0`Gj0mcn#z>JVDf$MuJy=B7v%L)hFbt!dFRo#J^g`qZO`H_FqS<5XQh2)Ai=* zZ!p6H$2*I+%!p09;-KX$8aKuHdP$j;=bS0YunsvFO6FNRof)P1-a0w<4IM4crqXPy z**REx!fJA6%sXK=R9710`6>6#R(kp$1OU69r*+MmQ)o1Dk5f6V%!vwq!I zJ;i9^4U4*q*1vd#_d1zLny7YSHqWuDoD%$9(Y<~1cPuBccNt`kd>=q<3iVG!al@fqQ7i(lHC_Qm~Fpy)BWB} zNQc!%e*F2Y>5?2G=;ZyfuGJU{Ro`FmSN@CvUBfajt&1(RuXwobEGkyzFrf45T>M z_T_f_-#lt{zxn&yJ+5bumE8T(yFa(OkN@$bIPdd?n3K39Ds{RpEb&&a5+ZAOdr58(%@8ZJSH{S>yXIY4g2wDasAJHH4bZq=TLR# zyTQ}X3sC_68p=8jPRsS!qRbF@b3LMl`3J}_4j0?~%$JDEJfa9EQp%vB423Q7h)RRg z!PU&EQ_=br9#PA@8}`{pEK$$g2KKhumS|$Z(-6cRw?qr`1>!DCv`6WOqVyrW15kzL zEQI|@OSCc{BJQ!oAoDBWiS?E^Z*YnY!4M0qau_^giDBkk@T})85s&Fk1;`ehvqU1Z zY{7YqFLN#I<1SjF5{D47?rvTnOV<)PUfS~d-q_-a3ZET@&?!!Z;1hB3!XK3JbGkQZ;K=t46`5`2HweNA!aXS zpg91Z2i;oy;!uGa=KCqbRE)8~>EL>U10nhebA8*lUS47UV95PkYr8 zT?Tu>Jq9O(dkyx3`wUJ4_Zv*<2bpg`{@zOXRXAE|&`}$LiK*x!7HES?Y#e0p0wusp zTNm~lVjcRKy;ow1H3~7ne3bJWG&mpmpJ!eM`_z4y3(ROghl#3y%`os+W1TZ=wU7Be z(qrQdFn=37xd~3o;B;_(RQg8dS74u+i&duB9%*4)RDw?C%q8f70t^ZBeDL&{7!reh z;9i4s!2QfSV4qNl9%eoSPF{yqC)pO_%Mhg2VwvH*M_v3nCD>t!fWec&Ma;1w=Mfm0RV0`{Log$zysmoYy?`W_)FQ*lJ63`mdyK`k5T3e_{8gueJJPH4=T z%P}Vgg=k@}0Oy@U0colN#L3{0!3p3><~`8oVlxuy7=Nn3qY(JsL5k14qlV8Yd6yiMd$htT5zTDDY&4iWVUxk+30s)8Cv0UVPiT`X>|}xVguTq#6AlxbEMwN5FvP4q;gG@P35N|PPbhL!dA4?iJuJ|kaFAJh!eN8S6UOJN474XK zVD6%IK7`%U;0fTeC=MyMg?5c)(^ZDrlZBYIzKdDAPG7#VM_XhlW7g|D#H{nHWY){N zTC%N^WAkAHy{_w-wM7%NUf0dcdR@00OrEnZDt$k*_MF4SwEt_@nOLA&L`<$Tz^p4! z38qu=57EWmA{;=XxE_2SI?pN`V&TXd4NeBPGRs%9L>zj-woX8vuiZ#c0`4`~3+`iH zg96gqvFr?v0}nFqhkjuvD#Lt=>~UU*FH{x$80_o8{!xhipDI9tEC_st0i6emn0Ks3 zhJD!InU8_fe~ckx{sTB=K!`@>36*%c9K`l)a1ywgxeEH3W$=uJ7=Nk&2^K=oY8d#z z?aYEhC-WC!pAbTiL~%d!099Ze4xP-Nt5D%;OAImx!O1o7q_!bQfMAGOCm3ed6(|U* z3hM&OnAal1gj&4YGk+fJy%T%O3}yckaWf97GZpLn?0yy`RpF3`1HnL)!FlFIq~8Ze z5~UaTFEZ4FyP!|Psn{3A13p0I-OR`(B{X#(N`X~gYD=?{;FM_>zbLnTEat*fAHSh~_ zmHi5EHYQasv(_gTEB&p|XJJmXGHd&GLvNEouVIjn4EqeG0{V>vWIq_CZz)j)eiH>2 zVb-@A90Z3-M=L~=w37LaYq0){c3>T{VA{24(H``O!Fk{=gGt}dd@bzrn{Z!%dq(QP zW^isJCZWMozyW4$-#Wrr|4GQ8ZA5@&1a4=33>oI#i5eqwD&UvkSs2r5gK5m`nG@Ec z2QViZ4Gw}^m{&tz`~Z4Lvkk#a2tv5sG7G3=z7P7;R%FO5k7P%Xp}~{EZOp%heZq0{ z5c8yJ%$aB4h?p0GGoQy0GTYkVJPT@IklzPK6qP}sOjYnO^wZ8-qQGDuxRSXWdVfE9 zh*{@f!~6>L83R~FigEsffNI#z27dxiAH*DBrUI#eUgp4csNgwF(kOl7LRG=*q0f31 zr(kBCe+ai<)WiFrPaVdPNyhm1L6C3}UCai9;3QlcwM20%v*%OL`#hqDc`=iowrGj2w~bPqUv9rOiw-3QxR;Dw;pFh~M78tel% z8Jr4kHki`4FfT^|sYN)(8=MGkGnm|T=PIm!ssJU(hM>zZ$OQKoOd0etH&6jMIrSNw z2<|u72Ocz-?h?-%oCzLUh4H5fP==I&z(Io8p#my#Vlg-ooEXIc<|oL$8uteVCxVNj zIK=z{+1KDg!Zrkn5L8ETE%O_cpcdC^1}B0Wqqv#*64}>dNDNK{w??tu&VniHk)RP{ zVsIk3D~fxW7n6MxhQQ!NaDNmJGH)jPW}F`kPHe{b3v?@Wxeh*NIcpyfBEbAQG7xR( zQf7I@(vCABbMOWnP>$im!~8N{FzC{%miap9Gftw%3{E(S@|#%jIm)01U1TubQneXO z`gVg!-^Ki0O8*Rc#9%+T-(b=Y80@zpIM0H&k-@ZHbdkXc;6$9=sE2fmikMSxgfAaP ziw#ZyS2AA<{p5@20fYVEdV_5;Xfy<5(9C=fWgxIyF+W8G`rxV!P5^f@4?&+h8QZnN zncyDgj2h?zaNW$yYB2s81L%@bfk*%kGB+W?jK)U+-m~X)eHB) zt3yU!`7Zq8z~|weJ#0tvKZD0NkJ=H(HJ|!v!1}YtTH!vQW4&V2N42q*5Ub{@gaPKy zGKawLLbWrX^qo=M!@Oa<(ho&3eN&_KgPfi|Y5fuWAZ`s1Z23)#1n($;{H8^$6VN9s z;;V2=K*2Xgi1!iyl{pZ9ITtan&z0t)Gm7bp6Q%!A66vu>>5~%mK*c;xFiwcS;87Py zA7qHNo<6V;w=GuobWuyJD@@mtraj#0&om9)Mj#%3V;FyVZkA|300a?DNWr5D1nfW8mu$?)B95q5Oa~bm>^Nq~pcd5Xg z0kT$plvqzva$_HYcLr4X(k+od8<5+9w;IWS+zheSlNX^O&;^iJAl7i&sf8E8Ob}k?PBCLm`S@8$)uB{F13HC_e2z z2`kT;8280OYn8RcO$u6Dt*LG}h_pX&KOaQeU(0IarGQJ+>A&gz6jm99vI01=N2yo4 z)(mTsQ@!O1cghUwQyVImtAroQs=!IgSZ9X5=X@%;fm+ka#nX3gGyH_@+ub(`th5+- zVfPIbXw!*+0-UA{jci9g!VKTiKK#PuLwVTKI0uOU}1gu8#HHP!ni zZe+FFG1JO#_%BWyh$@Tz4>DRV$e)qC!)OR{$=KF2>BTmGh~eWlHfsmX*9j^ub-3;cJ``y~&%w%ks+k zZux90Z^Khu5qfztLo@6wF-F|WLOlf4oSxo&%rKYjzrwmD9VcjYJLX{O(qYsL4{>+2!S$Ho z7c6g$l6SD2PEcmJm5ZT+jT!2>`{>As5FF9HzzRAUnPEI<)Z*3^SqrS{Q(rE!@-25@ zuH|!k>CezytJZSe>x!*OS5+dDB;ghDoP&jiI7tbdB-z9{?8xla~bIrc_~ z+gL@eW)ps0>~l2t$PS<(5MncaK3QMITfy`{NhpxM7C-uL2Na0w@T0H(6g0F!G#Pz&hpOEXo7 z?z%Kn575nyW@&FQ+0(_1){{M5%xK<$2fBzsNFQl2UA$1B3axi1`3~_0tn1l0 zI(KAGw;4?3_8Ls(4n=b^ga|r6`tKB)DZLJu(r(OrYo1NlmK131HsE*E;G4mn2JZ%+ zGC+AcQcb0YApIF-pTV@I=~E8{vL~ibI~0iNdq{N@ z?=jc|{hgPyEgraBAdW`y@hE;Kihmr%XQTL?D86_ZFTrc>3{(q&T0k|N9K|!Ec#+Ac z-rQ!zc#&3zaPc1vr$U~UE$Oy z&Ncbe4{pML%1!@t?T(xF?A*F*TV2DgySLPDzj;#H(&Z~p&A!<>}}TkvG2d9_{dzh3Y^w5okkI}d90F8 zLUe=s$ZggP&%hk_x!aIsQ?cubAdW9_mr?91aqp(Mpu~NS;<6Igvk!44^oYj}m#Qp7 cbKS%Htofd@o$hlaziy|JzZUCOg{>+73&J({Z2$lO diff --git a/pkg/flow/record_test.go b/pkg/flow/record_test.go index 8709af0b6..316bbe699 100644 --- a/pkg/flow/record_test.go +++ b/pkg/flow/record_test.go @@ -43,6 +43,7 @@ func TestRecordBinaryEncoding(t *testing.T) { 01, 00, // id 0x80, 00, // flags 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, // latency + 0x00, // errno // u64 flow_rtt 0xad, 0xde, 0xef, 0xbe, 0xef, 0xbe, 0xad, 0xde, })) @@ -82,6 +83,7 @@ func TestRecordBinaryEncoding(t *testing.T) { Id: 0x0001, Flags: 0x0080, Latency: 0x1817161514131211, + Errno: 0, }, FlowRtt: 0xdeadbeefbeefdead, },