Commit 933aff46 authored by Franck Messaoudi's avatar Franck Messaoudi

Fix: enforcing QoS needs these modifications

parent e1e1f74a
...@@ -131,7 +131,9 @@ WORKDIR /openair-upf/bin ...@@ -131,7 +131,9 @@ WORKDIR /openair-upf/bin
COPY --from=oai-upf-builder \ COPY --from=oai-upf-builder \
/usr/local/sbin/bpftool \ /usr/local/sbin/bpftool \
/openair-upf/build/upf/build/oai_upf \ /openair-upf/build/upf/build/oai_upf \
/openair-upf/build/upf/build/upf_app/bpf/CMakeFiles/qer_tc.dir/rules/qer/qer_tc_kernel.c.o \
/openair-upf/scripts/healthcheck.sh \ /openair-upf/scripts/healthcheck.sh \
/openair-upf/scripts/entrypoint.sh \
./ ./
WORKDIR /usr/local/lib WORKDIR /usr/local/lib
...@@ -173,3 +175,5 @@ HEALTHCHECK --interval=10s \ ...@@ -173,3 +175,5 @@ HEALTHCHECK --interval=10s \
CMD /openair-upf/bin/healthcheck.sh CMD /openair-upf/bin/healthcheck.sh
CMD ["/openair-upf/bin/oai_upf", "-c", "/openair-upf/etc/config.yaml", "-o"] CMD ["/openair-upf/bin/oai_upf", "-c", "/openair-upf/etc/config.yaml", "-o"]
ENTRYPOINT [ "sh", "/openair-upf/bin/entrypoint.sh" ]
\ No newline at end of file
#!/bin/sh
# Mount bpffs and debugfs if not present already
if [ $(/bin/mount | /bin/grep /sys/fs/bpf -c) -eq 0 ]; then
/bin/mount bpffs /sys/fs/bpf -t bpf;
fi
if [ $(/bin/mount | /bin/grep debugfs -c) -eq 0 ]; then
/bin/mount debugfs /sys/kernel/debug -t debugfs;
fi
exec "$@"
...@@ -30,67 +30,67 @@ ...@@ -30,67 +30,67 @@
#include <linux/pkt_sched.h> #include <linux/pkt_sched.h>
//--------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------
static __always_inline u32 egress_sdf_classifier(struct __sk_buff* skb) { // static __always_inline u32 egress_sdf_classifier(struct __sk_buff* skb) {
void* data = (void*) (long) skb->data; // void* data = (void*) (long) skb->data;
void* data_end = (void*) (long) skb->data_end; // void* data_end = (void*) (long) skb->data_end;
void* data_meta = (void*) (long) skb->data_meta; // void* data_meta = (void*) (long) skb->data_meta;
// struct packet_filter* filter = data_meta; // // struct packet_filter* filter = data_meta;
struct session_qfi* qos_class_metadata = data_meta; // struct session_qfi* qos_class_metadata = data_meta;
struct ethhdr* ethh = data; // struct ethhdr* ethh = data;
if ((void*) (ethh + 1) > data_end) { // if ((void*) (ethh + 1) > data_end) {
bpf_debug("Error: Invalid Ethernet header"); // bpf_debug("Error: Invalid Ethernet header");
return TC_ACT_SHOT; // return TC_ACT_SHOT;
} // }
struct iphdr* iph = (struct iphdr*) (ethh + 1); // struct iphdr* iph = (struct iphdr*) (ethh + 1);
if ((void*) (iph + 1) > data_end) { // if ((void*) (iph + 1) > data_end) {
bpf_debug("Error: Invalid IPv4 header"); // bpf_debug("Error: Invalid IPv4 header");
return TC_ACT_SHOT; // return TC_ACT_SHOT;
} // }
struct udphdr* udph = (struct udphdr*) (iph + 1); // struct udphdr* udph = (struct udphdr*) (iph + 1);
if ((void*) (udph + 1) > data_end) { // if ((void*) (udph + 1) > data_end) {
bpf_debug("Error: Invalid UDP header"); // bpf_debug("Error: Invalid UDP header");
return TC_ACT_SHOT; // return TC_ACT_SHOT;
} // }
struct gtpuhdr* gtpuh = (struct gtpuhdr*) (udph + 1); // struct gtpuhdr* gtpuh = (struct gtpuhdr*) (udph + 1);
if ((void*) (gtpuh + 1) > data_end) { // if ((void*) (gtpuh + 1) > data_end) {
bpf_debug("Error: Invalid GTPU packet"); // bpf_debug("Error: Invalid GTPU packet");
return TC_ACT_SHOT; // return TC_ACT_SHOT;
} // }
struct gtpu_extn_pdu_session_container* gtpu_ext_h = // struct gtpu_extn_pdu_session_container* gtpu_ext_h =
(struct gtpu_extn_pdu_session_container*) ((void*) (gtpuh + 1)); // (struct gtpu_extn_pdu_session_container*) ((void*) (gtpuh + 1));
if ((void*) (gtpu_ext_h + 1) > data_end) { // if ((void*) (gtpu_ext_h + 1) > data_end) {
bpf_debug("Error: Invalid GTPU Extension packet"); // bpf_debug("Error: Invalid GTPU Extension packet");
return TC_ACT_SHOT; // return TC_ACT_SHOT;
} // }
/* Check XDP gave us some data_meta */ // /* Check XDP gave us some data_meta */
if ((void*) (qos_class_metadata + 1) > data) { // if ((void*) (qos_class_metadata + 1) > data) {
bpf_debug("Error: Failed to load metadata from XDP"); // bpf_debug("Error: Failed to load metadata from XDP");
return TC_ACT_SHOT; // return TC_ACT_SHOT;
} // }
bpf_debug( // bpf_debug(
"TC: Received XDP Metadata - seid: %llu, qfi: %u", // "TC: Received XDP Metadata - seid: %llu, qfi: %u",
qos_class_metadata->seid, qos_class_metadata->qfi); // qos_class_metadata->seid, qos_class_metadata->qfi);
u16 minor_id = // u16 minor_id =
generate_minor_id(qos_class_metadata->seid, qos_class_metadata->qfi); // generate_minor_id(qos_class_metadata->seid, qos_class_metadata->qfi);
skb->tc_classid = minor_id; // skb->tc_classid = minor_id;
skb->priority = // skb->priority =
TC_H_MAKE(1, minor_id); // 1 is the HTB root handle's major number // TC_H_MAKE(1, minor_id); // 1 is the HTB root handle's major number
bpf_debug("TC: classid %d", skb->tc_classid); // bpf_debug("TC: classid %d", skb->tc_classid);
bpf_debug("TC: skb->priority set to 0x%x", skb->priority); // bpf_debug("TC: skb->priority set to 0x%x", skb->priority);
return TC_ACT_OK; // return TC_ACT_OK;
} // }
//--------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------
// static __always_inline u32 ipv4_sdf_filter(struct __sk_buff* skb) { // static __always_inline u32 ipv4_sdf_filter(struct __sk_buff* skb) {
......
...@@ -371,8 +371,8 @@ void QERProgram::setup( ...@@ -371,8 +371,8 @@ void QERProgram::setup(
} }
// Logger::upf_app().info("Attach Section tc_filter_traffic to gtp // Logger::upf_app().info("Attach Section tc_filter_traffic to gtp
// interface"); // interface"); mpLifeCycle->tcAttachEgress("tc_filter_traffic",
// mpLifeCycle->tcAttachEgress("tc_filter_traffic", GTP_INTERFACE.c_str()); // GTP_INTERFACE.c_str());
if (no_tc_filter_bpf(GTP_INTERFACE)) { if (no_tc_filter_bpf(GTP_INTERFACE)) {
Logger::upf_app().info( Logger::upf_app().info(
"Attach Section tc_filter_traffic to gtp interface"); "Attach Section tc_filter_traffic to gtp interface");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment