@@ -39,20 +39,34 @@ extern struct data *daemon_data;
3939
4040
4141static void
42- _log_egress_rule (int action , struct pfcp_teid * t , int err )
42+ _log_egress_rule (int action , struct upf_fwd_rule * u , struct pfcp_teid * t , int err )
4343{
4444 char gtpu_str [INET6_ADDRSTRLEN ];
4545 char errmsg [GTP_XDP_STRERR_BUFSIZE ];
46+ char action_str [60 ];
4647
4748 if (err )
4849 libbpf_strerror (err , errmsg , GTP_XDP_STRERR_BUFSIZE );
4950
51+ if (action == RULE_ADD &&
52+ (u -> flags & UPF_FWD_FL_ACT_KEEP_OUTER_HEADER ) ==
53+ UPF_FWD_FL_ACT_KEEP_OUTER_HEADER ) {
54+ snprintf (action_str , sizeof (action_str ),
55+ "fwd to teid:0x%.8x remote:'%s'" ,
56+ u -> gtpu_remote_teid ,
57+ inet_ntop (AF_INET , & u -> gtpu_remote_addr ,
58+ gtpu_str , INET6_ADDRSTRLEN ));
59+ } else {
60+ strcpy (action_str , "decap" );
61+ }
62+
5063 log_message (LOG_INFO , "pfcp_bpf: %s%s XDP 'egress' rule "
51- "{local_teid:0x%.8x, local_gtpu:'%s'} %s" ,
64+ "{local_teid:0x%.8x, local_gtpu:'%s', %s } %s" ,
5265 (err ) ? "Error " : "" ,
5366 (action == RULE_ADD ) ? "adding" : "deleting" ,
5467 t -> id ,
5568 inet_ntop (AF_INET , & t -> ipv4 , gtpu_str , INET6_ADDRSTRLEN ),
69+ action_str ,
5670 (err ) ? errmsg : "" );
5771}
5872
@@ -69,12 +83,14 @@ _update_egress_rule(struct pfcp_router *r, struct upf_fwd_rule *u, struct pfcp_t
6983 };
7084 int err , i ;
7185
72- for (i = 0 ; i < nr_cpus ; i ++ )
86+ for (i = 0 ; i < nr_cpus ; i ++ ) {
7387 rule [i ] = * u ;
88+ rule [i ].gtpu_remote_teid = htonl (u -> gtpu_remote_teid );
89+ }
7490
7591 err = bpf_map__update_elem (r -> bpf_data -> user_egress , & key , sizeof (key ),
7692 rule , sizeof (rule ), flags );
77- _log_egress_rule (RULE_ADD , t , err );
93+ _log_egress_rule (RULE_ADD , u , t , err );
7894
7995 return err ? -1 : 0 ;
8096}
@@ -89,7 +105,7 @@ _delete_egress_rule(struct pfcp_router *r, struct pfcp_teid *t)
89105 };
90106 int err = bpf_map__delete_elem (r -> bpf_data -> user_egress , & key ,
91107 sizeof (key ), 0 );
92- _log_egress_rule (RULE_DEL , t , err );
108+ _log_egress_rule (RULE_DEL , NULL , t , err );
93109
94110 return err ? -1 : 0 ;
95111}
@@ -138,8 +154,10 @@ _update_ingress_rule(struct pfcp_router *r, struct upf_fwd_rule *u, struct ue_ip
138154 struct upf_ingress_key key = {};
139155 int i , err = 0 , err_cnt = 0 ;
140156
141- for (i = 0 ; i < nr_cpus ; i ++ )
157+ for (i = 0 ; i < nr_cpus ; i ++ ) {
142158 rule [i ] = * u ;
159+ rule [i ].gtpu_remote_teid = htonl (u -> gtpu_remote_teid );
160+ }
143161
144162 if (ue -> flags & UE_IPV4 ) {
145163 key .flags = UE_IPV4 ;
@@ -399,7 +417,8 @@ pfcp_bpf_vty(struct gtp_bpf_prog *p, void *ud, struct vty *vty,
399417 if ((rule [0 ].flags & UPF_FWD_FL_ACT_KEEP_OUTER_HEADER ) ==
400418 UPF_FWD_FL_ACT_KEEP_OUTER_HEADER ) {
401419 snprintf (action_str , sizeof (action_str ),
402- "Fwd to teid 0x%08x" , rule [0 ].gtpu_remote_teid );
420+ "Fwd to teid 0x%08x" ,
421+ ntohl (rule [0 ].gtpu_remote_teid ));
403422 } else {
404423 strcpy (action_str , "Decap" );
405424 }
0 commit comments