33
44use aya_ebpf:: {
55 bindings:: { TC_ACT_PIPE , TC_ACT_SHOT } ,
6+ helpers:: bpf_get_current_pid_tgid,
67 macros:: { classifier, map} ,
78 maps:: { Array , HashMap , RingBuf } ,
89 programs:: TcContext ,
@@ -18,7 +19,7 @@ use network_types::{
1819} ;
1920use oryx_common:: {
2021 protocols:: { LinkProtocol , NetworkProtocol , Protocol , TransportProtocol } ,
21- ProtoHdr , RawFrame , RawPacket , MAX_FIREWALL_RULES , MAX_RULES_PORT ,
22+ ProtoHdr , RawData , RawFrame , RawPacket , MAX_FIREWALL_RULES , MAX_RULES_PORT ,
2223} ;
2324
2425#[ map]
@@ -56,9 +57,9 @@ pub fn oryx(ctx: TcContext) -> i32 {
5657}
5758
5859#[ inline]
59- fn submit ( frame : RawFrame ) {
60- if let Some ( mut buf) = DATA . reserve :: < RawFrame > ( 0 ) {
61- unsafe { ( * buf. as_mut_ptr ( ) ) = frame } ;
60+ fn submit ( data : RawData ) {
61+ if let Some ( mut buf) = DATA . reserve :: < RawData > ( 0 ) {
62+ unsafe { ( * buf. as_mut_ptr ( ) ) = data } ;
6263 buf. submit ( 0 ) ;
6364 }
6465}
@@ -153,6 +154,12 @@ fn filter_packet(protocol: Protocol) -> bool {
153154fn process ( ctx : TcContext ) -> Result < i32 , ( ) > {
154155 let ethhdr: EthHdr = ctx. load ( 0 ) . map_err ( |_| ( ) ) ?;
155156
157+ let pid = if is_ingress ( ) {
158+ None
159+ } else {
160+ Some ( ( bpf_get_current_pid_tgid ( ) >> 32 ) as u32 )
161+ } ;
162+
156163 match ethhdr. ether_type {
157164 EtherType :: Ipv4 => {
158165 let header: Ipv4Hdr = ctx. load ( EthHdr :: LEN ) . map_err ( |_| ( ) ) ?;
@@ -183,12 +190,15 @@ fn process(ctx: TcContext) -> Result<i32, ()> {
183190 return Ok ( TC_ACT_PIPE ) ;
184191 }
185192
186- submit ( RawFrame {
187- header : ethhdr,
188- payload : RawPacket :: Ip (
189- IpHdr :: V4 ( header) ,
190- ProtoHdr :: Tcp ( unsafe { * tcphdr } ) ,
191- ) ,
193+ submit ( RawData {
194+ frame : RawFrame {
195+ header : ethhdr,
196+ payload : RawPacket :: Ip (
197+ IpHdr :: V4 ( header) ,
198+ ProtoHdr :: Tcp ( unsafe { * tcphdr } ) ,
199+ ) ,
200+ } ,
201+ pid,
192202 } ) ;
193203 }
194204 IpProto :: Udp => {
@@ -210,25 +220,31 @@ fn process(ctx: TcContext) -> Result<i32, ()> {
210220 return Ok ( TC_ACT_PIPE ) ;
211221 }
212222
213- submit ( RawFrame {
214- header : ethhdr,
215- payload : RawPacket :: Ip (
216- IpHdr :: V4 ( header) ,
217- ProtoHdr :: Udp ( unsafe { * udphdr } ) ,
218- ) ,
223+ submit ( RawData {
224+ frame : RawFrame {
225+ header : ethhdr,
226+ payload : RawPacket :: Ip (
227+ IpHdr :: V4 ( header) ,
228+ ProtoHdr :: Udp ( unsafe { * udphdr } ) ,
229+ ) ,
230+ } ,
231+ pid,
219232 } ) ;
220233 }
221234 IpProto :: Icmp => {
222235 if filter_packet ( Protocol :: Network ( NetworkProtocol :: Icmp ) ) {
223236 return Ok ( TC_ACT_PIPE ) ;
224237 }
225238 let icmphdr: * const IcmpHdr = ptr_at ( & ctx, EthHdr :: LEN + Ipv4Hdr :: LEN ) ?;
226- submit ( RawFrame {
227- header : ethhdr,
228- payload : RawPacket :: Ip (
229- IpHdr :: V4 ( header) ,
230- ProtoHdr :: Icmp ( unsafe { * icmphdr } ) ,
231- ) ,
239+ submit ( RawData {
240+ frame : RawFrame {
241+ header : ethhdr,
242+ payload : RawPacket :: Ip (
243+ IpHdr :: V4 ( header) ,
244+ ProtoHdr :: Icmp ( unsafe { * icmphdr } ) ,
245+ ) ,
246+ } ,
247+ pid,
232248 } ) ;
233249 }
234250 _ => { }
@@ -261,12 +277,15 @@ fn process(ctx: TcContext) -> Result<i32, ()> {
261277 {
262278 return Ok ( TC_ACT_PIPE ) ;
263279 }
264- submit ( RawFrame {
265- header : ethhdr,
266- payload : RawPacket :: Ip (
267- IpHdr :: V6 ( header) ,
268- ProtoHdr :: Tcp ( unsafe { * tcphdr } ) ,
269- ) ,
280+ submit ( RawData {
281+ frame : RawFrame {
282+ header : ethhdr,
283+ payload : RawPacket :: Ip (
284+ IpHdr :: V6 ( header) ,
285+ ProtoHdr :: Tcp ( unsafe { * tcphdr } ) ,
286+ ) ,
287+ } ,
288+ pid,
270289 } ) ;
271290 }
272291 IpProto :: Udp => {
@@ -287,25 +306,31 @@ fn process(ctx: TcContext) -> Result<i32, ()> {
287306 {
288307 return Ok ( TC_ACT_PIPE ) ;
289308 }
290- submit ( RawFrame {
291- header : ethhdr,
292- payload : RawPacket :: Ip (
293- IpHdr :: V6 ( header) ,
294- ProtoHdr :: Udp ( unsafe { * udphdr } ) ,
295- ) ,
309+ submit ( RawData {
310+ frame : RawFrame {
311+ header : ethhdr,
312+ payload : RawPacket :: Ip (
313+ IpHdr :: V6 ( header) ,
314+ ProtoHdr :: Udp ( unsafe { * udphdr } ) ,
315+ ) ,
316+ } ,
317+ pid,
296318 } ) ;
297319 }
298320 IpProto :: Icmp => {
299321 if filter_packet ( Protocol :: Network ( NetworkProtocol :: Icmp ) ) {
300322 return Ok ( TC_ACT_PIPE ) ;
301323 }
302324 let icmphdr: * const IcmpHdr = ptr_at ( & ctx, EthHdr :: LEN + Ipv6Hdr :: LEN ) ?;
303- submit ( RawFrame {
304- header : ethhdr,
305- payload : RawPacket :: Ip (
306- IpHdr :: V6 ( header) ,
307- ProtoHdr :: Icmp ( unsafe { * icmphdr } ) ,
308- ) ,
325+ submit ( RawData {
326+ frame : RawFrame {
327+ header : ethhdr,
328+ payload : RawPacket :: Ip (
329+ IpHdr :: V6 ( header) ,
330+ ProtoHdr :: Icmp ( unsafe { * icmphdr } ) ,
331+ ) ,
332+ } ,
333+ pid,
309334 } ) ;
310335 }
311336 _ => { }
@@ -316,9 +341,12 @@ fn process(ctx: TcContext) -> Result<i32, ()> {
316341 return Ok ( TC_ACT_PIPE ) ;
317342 }
318343 let header: ArpHdr = ctx. load ( EthHdr :: LEN ) . map_err ( |_| ( ) ) ?;
319- submit ( RawFrame {
320- header : ethhdr,
321- payload : RawPacket :: Arp ( header) ,
344+ submit ( RawData {
345+ frame : RawFrame {
346+ header : ethhdr,
347+ payload : RawPacket :: Arp ( header) ,
348+ } ,
349+ pid,
322350 } ) ;
323351 }
324352 _ => { }
0 commit comments