@@ -205,59 +205,35 @@ static __always_inline int lan_redirect_check(struct __sk_buff *skb, int current
205
205
}
206
206
207
207
if (current_eth_net_offset == 0 && lan_info -> has_mac ) {
208
- struct lan_mac_cache_key daddr = {0 };
209
- daddr .l3_protocol = context -> l3_protocol ;
210
- COPY_ADDR_FROM (daddr .ip , context -> daddr .in6_u .u6_addr8 );
211
- u8 * smac = & lan_info -> mac_addr ;
212
- struct lan_mac_cache * dmac = bpf_map_lookup_elem (& ip_mac_tab , & daddr );
213
208
bool is_ipv4 = context -> l3_protocol == LANDSCAPE_IPV4_TYPE ;
214
- if (dmac == NULL ) {
215
- bpf_log_info ("use ip: %pI6, to find mac error" , & context -> daddr .in6_u .u6_addr8 );
216
- return TC_ACT_SHOT ;
217
- }
218
-
219
209
unsigned char ethhdr [14 ];
220
- __builtin_memcpy (ethhdr , dmac -> mac , 6 );
221
- __builtin_memcpy (ethhdr + 6 , smac , 6 );
222
-
223
- // PRINT_MAC_ADDR(ethhdr);
224
- // PRINT_MAC_ADDR(ethhdr + 6);
225
-
226
210
if (is_ipv4 ) {
227
211
ethhdr [12 ] = 0x08 ;
228
212
ethhdr [13 ] = 0x00 ;
229
213
} else {
230
214
ethhdr [12 ] = 0x86 ;
231
215
ethhdr [13 ] = 0xdd ;
232
216
}
233
-
234
217
if (bpf_skb_change_head (skb , 14 , 0 )) return TC_ACT_SHOT ;
235
218
236
219
if (bpf_skb_store_bytes (skb , 0 , ethhdr , sizeof (ethhdr ), 0 )) return TC_ACT_SHOT ;
237
-
238
- skb -> mark = 1 ;
239
- ret = bpf_redirect (lan_info -> ifindex , 0 );
240
- if (ret != 7 ) {
241
- bpf_log_info ("bpf_redirect_neigh error: %d" , ret );
242
- }
243
-
220
+ }
221
+ struct bpf_redir_neigh param ;
222
+ if (context -> l3_protocol == LANDSCAPE_IPV4_TYPE ) {
223
+ param .nh_family = AF_INET ;
244
224
} else {
245
- struct bpf_redir_neigh param ;
246
- if (context -> l3_protocol == LANDSCAPE_IPV4_TYPE ) {
247
- param .nh_family = AF_INET ;
248
- } else {
249
- param .nh_family = AF_INET6 ;
250
- }
225
+ param .nh_family = AF_INET6 ;
226
+ }
251
227
252
- COPY_ADDR_FROM (param .ipv6_nh , lan_search_key .addr .in6_u .u6_addr32 );
253
- ret = bpf_redirect_neigh (lan_info -> ifindex , & param , sizeof (param ), 0 );
254
- // bpf_log_info("lan_info->ifindex: %d", lan_info->ifindex);
255
- // bpf_log_info("is_ipv4: %d", is_ipv4);
256
- // bpf_log_info("bpf_redirect_neigh ip: %pI6", lan_search_key.addr.in6_u.u6_addr8);
257
- if (ret != 7 ) {
258
- bpf_log_info ("bpf_redirect_neigh error: %d" , ret );
259
- }
228
+ COPY_ADDR_FROM (param .ipv6_nh , lan_search_key .addr .in6_u .u6_addr32 );
229
+ ret = bpf_redirect_neigh (lan_info -> ifindex , & param , sizeof (param ), 0 );
230
+ // bpf_log_info("lan_info->ifindex: %d", lan_info->ifindex);
231
+ // bpf_log_info("is_ipv4: %d", is_ipv4);
232
+ // bpf_log_info("bpf_redirect_neigh ip: %pI6", lan_search_key.addr.in6_u.u6_addr8);
233
+ if (ret != 7 ) {
234
+ bpf_log_info ("bpf_redirect_neigh error: %d" , ret );
260
235
}
236
+ // bpf_log_info("bpf_redirect_neigh result: %d", ret);
261
237
262
238
return ret ;
263
239
}
@@ -550,24 +526,13 @@ int lan_route_ingress(struct __sk_buff *skb) {
550
526
return TC_ACT_UNSPEC ;
551
527
}
552
528
553
- struct lan_mac_cache_key saddr = {0 };
554
- struct lan_mac_cache cache_mac = {0 };
555
- saddr .l3_protocol = context .l3_protocol ;
556
- COPY_ADDR_FROM (saddr .ip , context .saddr .in6_u .u6_addr8 );
557
- COPY_ADDR_FROM (cache_mac .mac , context .smac );
558
- ret = bpf_map_update_elem (& ip_mac_tab , & saddr , & cache_mac , BPF_ANY );
559
-
560
529
// if (saddr.ip[0] == 0xfe) {
561
530
// if ((saddr.ip[1] & 0xc0) == 0x80) {
562
531
// bpf_log_info("fe80 %pI6 -> %pI6", context.saddr.in6_u.u6_addr8,
563
532
// context.daddr.in6_u.u6_addr8);
564
533
// }
565
534
// }
566
535
567
- if (ret != 0 ) {
568
- bpf_log_info ("cache ip: %pI6 mac error" , saddr .ip );
569
- }
570
-
571
536
ret = lan_redirect_check (skb , current_eth_net_offset , & context );
572
537
if (ret != TC_ACT_OK ) {
573
538
return ret ;
0 commit comments