Commit Graph

25 Commits

Author SHA1 Message Date
Neels Hofmeyr a46a126fb1 add osmo_pfcp_ip_addrs_get
This pattern shows up a lot when working with PFCP. Let's make it easier
to handle IPv4 and v6 at the same time.

Change-Id: I4338a83f26ef2443f90cf835621e73aed5eac521
2024-03-23 13:03:53 +01:00
Neels Hofmeyr 172dc5a72d osmo_gtlv_cfg: fix api doc
Change-Id: Idcbb10edf384f49bd3f685323a68cdbf8b5d009d
2024-03-19 04:40:06 +01:00
Neels Hofmeyr e6ff99d7ac pfcp_msg: refactor LOG_PFCP_MSG
It was requested during code review to make this a function and not a
macro.

One effective change: no longer log "NULL{fi=NULL}" when no
m->ctx.session_fi or .peer_fi are set.

Change-Id: Ic84090c9b1a34185577cfb2ea1efa9c07542df34
2023-04-15 00:19:34 +02:00
Neels Hofmeyr 1dd8f06ea7 add osmo_pfcp_ie_outer_header_creation_to_str_*()
Make osmo_pfcp_enc_to_str_outer_header_creation() as
osmo_pfcp_ie_outer_header_creation_to_str_*() functions.

Used by I0d4d9edcfc94b61bdc74cfd4ff837f151d1c28ae (osmo-upf)

Change-Id: I4ad1570485c8081b82284e4e6b4de4d7eed414b0
2022-12-01 01:03:41 +01:00
Neels Hofmeyr c41bfcbbf0 add osmo_pfcp_ip_addrs_to_str_*()
Move static function ip_addrs_to_str_buf() to public API as
osmo_pfcp_ip_addrs_to_str_buf() and osmo_pfcp_ip_addrs_to_str_c().

So far the static function was only used in places where it follows
other strings, so that it made sense to always start with a comma. Move
this comma out of the function to the callers.

Sensibly handle a NULL pointer and an empty address set.

Rationale: osmo-upf would like to print an osmo_pfcp_ip_addrs struct in
logging.

Change-Id: I5f67db8d347690cbb1ce273a2d072636859f1bf6
2022-11-26 03:04:13 +01:00
Neels Hofmeyr 3a86c92dce api doc: explain heartbeat handling in rx_msg_cb
Related: SYS#5599
Change-Id: I3849060d703494ea43773c0208203f1fc206067f
2022-11-11 18:59:06 +00:00
Neels Hofmeyr 035b692673 gtlv: check memory bounds 3/3: encoding to str
See Id8d997c9d5e655ff1842ec69eab6c073875c6330

Related: CID#275417
Related: SYS#5599
Change-Id: I63d52a4f5dba32d3a3887dd9c5e42e1695fb2aa3
2022-08-24 17:04:42 +02:00
Neels Hofmeyr 92860a29cd gtlv: check memory bounds 2/3: decoding TLV
See Id8d997c9d5e655ff1842ec69eab6c073875c6330

Related: CID#275417
Related: SYS#5599
Change-Id: I841da89112ccf70fcd0f60eb902445fb1712eb48
2022-08-24 17:04:42 +02:00
Neels Hofmeyr cb724a3484 gtlv: check memory bounds 1/3: encoding TLV
Introduce a maximum bound of memory access to the osmo_gtlv API.

Properly pass const-ness within the gtlv implementation. This patch adds
membof_const(). The following patch will add the non-const membof()
equivalent, which is not needed in this patch, yet.

Coverity CID#275417 drew my attention to the fact that the gtlv decoding
and encoding does not actually guard against access past the end of the
decoded struct.

We have not yet officially released libosmo-gtlv; also, osmo-upf and
osmo-hnbgw so far only use the libosmo-pfcp API, which "hides" the gtlv
API. Hence just change the API without a backwards compat shim.

Related: CID#275417
Related: SYS#5599
Change-Id: Id8d997c9d5e655ff1842ec69eab6c073875c6330
2022-08-24 17:04:42 +02:00
Neels Hofmeyr 1a9a3ad342 apply code review: refactor pfcp_endpoint API
Code review requested that the API should use functions instead of
direct access to a struct.

I have moved all user provided config to a separate struct
osmo_pfcp_endpoint_cfg, to be passed to osmo_pfcp_endpoint_create().
Halfway through those changes, I am not so certain whether that is what
reviewers had in mind. It makes sense from the point of view to keep nr
of arguments passed to osmo_pfcp_endpoint_create() small, and to allow
changing the user provided config without requiring a new
osmo_pfcp_endpoint_create2() API function. Though that again has ABI
compat problems, and makes no sense from the point of view that all
access should be done via API functions.

Personally I don't really agree with this change, which is probably the
reason why this patch ended up this way.

Related: SYS#5599
Change-Id: If80c35c6a942bf9593781b5a6bc28ba37323ce5e
2022-07-28 13:52:17 +02:00
Neels Hofmeyr 6dc91a4411 clarify osmo_pfcp_msg alloc API
Looking at the osmo_pfcp_msg_alloc API with a bit of distance now, I
found that:

- it is confusing to have a single function for req and resp. A resp
  may pass remote_addr as NULL, and a req may pass in_reply_to as NULL.
  Make this much more obvious with separate req/resp functions.

- the osmo_pfcp_endpoint_tx() implicitly puts the local Node ID into
  sent PFCP messages, so the local_node_id arg for msg alloc is
  redundant. Drop that.

Refactor without backwards compat, because we have not yet officially
released this API. This requires a fixup patch to osmo-upf.git (and
affects unmerged patches to osmo-hnbgw.git).

Related: SYS#5599
Related: I73e6da3b80f05e9408c81f41ac05d6578b8e31cf (osmo-upf)
Change-Id: I0d71134e42932cc72992eba73a15e82bc7cd11bd
2022-07-23 16:15:57 +02:00
Neels Hofmeyr 6b458fa060 add generic PFCP CP peer implementation
Will be used by osmo-hnbgw, our first PFCP Control Plane entity. The
implementation is generic enough that it can be re-used by other CP
entities.

Related: SYS#5895
Change-Id: If8c5f69f596ea6ba8bd1723f4dc57b91d3799795
2022-06-17 18:15:43 +02:00
Neels Hofmeyr 3b8fc0d694 add osmo_pfcp_ie_f_seid_cmp
Related: SYS#5599
Change-Id: Iacaeebfad0fe77788da40c3ed7da2ffa3b27043c
2022-06-17 13:34:14 +02:00
Neels Hofmeyr c8a90d83ef add pfcp_endpoint
Related: SYS#5599
Change-Id: Ic8d42e201b63064a71b40ca45a5a40e29941e8ac
2022-06-16 13:04:33 +02:00
Neels Hofmeyr 8bcc7faa62 libosmo-pfcp: implement PFCP header and msg handling
Related: SYS#5599
Change-Id: I3f85ea052a6b7c064244a8093777e53a47c8c61e
2022-06-16 13:04:33 +02:00
Neels Hofmeyr ace6adb548 api: add osmo_pfcp_ie_node_id_to_str_c()
So far we had only osmo_pfcp_enc_to_str_node_id(), used for PFCP message
to string conversion. It behaves like a common _to_str_buf() function,
but has an inconvenient void* arg (for use with libosmo-tlv).

Implement the string conversion as common _to_str_buf() and _to_str_c()
functions, and call that from osmo_pfcp_enc_to_str_node_id(). That's
useful for log messages coming up in a subsequent patch.

Related: SYS#5599
Change-Id: I5c580bc510afce58a03dea0861db9630b063b2ae
2022-06-16 13:04:33 +02:00
Neels Hofmeyr 184360f3b7 pfcp ie: tweak CP Function Features
The spec indicates three bytes of CP Function Features, but both
wireshark and ttcn3 expect only one byte. This makes sense because only
eight CP F.F. flags are defined.

Drop those two always-zero bytes, hence pass the wireshark dissector and
ttcn3 parsing without warnings.

Related: SYS#5599
Change-Id: Icda891a2f3401e58f142f229465403d5dc8befe5
2022-06-16 13:04:33 +02:00
Neels Hofmeyr 75028467e7 pfcp/Makefile.am: add missing pfcp_ies_auto.h entry
Even though it is a generated header, it must still be listed in
pfcp_HEADERS.

Related: SYS#5599
Change-Id: I6fbfe1fcd084f2d16334bb3e44d9891d9485d59f
2022-06-16 13:04:33 +02:00
Neels Hofmeyr b53c785d78 libosmo-pfcp: implement/generate TLV and IE value coding
Related: SYS#5599
Change-Id: I3069045b2d42dac88d955c636230adc64a7a4aa7
2022-06-16 13:04:33 +02:00
Neels Hofmeyr 778071cc99 libosmo-pfcp: add pfcp_proto.h pfcp_strs.h
Related: SYS#5599
Change-Id: I568b821e89007ed52eeefcdbcb6edd8052a8b5be
2022-06-16 13:04:33 +02:00
Neels Hofmeyr 8b58faa4c2 libosmo-gtlv: add TLIV capability
During code review, it was indicated that some TLV protocols that we
will likely deal with in the near future also employ an I, and instance
value of a tag. Add TLIV support.

A usage example for a manually implemented TLIV structure is found in
tests/libosmo-gtlv/gtlv_test.c.

A usage example for a generated TLIV protocol is found in
tests/libosmo-gtlv/test_tliv/.

Related: SYS#5599
Change-Id: I0a076e54dfba6038cc779cb7c8f3967d212226aa
2022-06-16 13:04:33 +02:00
Neels Hofmeyr e011b04c6b libosmo-gtlv: add C code generator for IE structs and arrays
Defining a protocol of message types with lists of IEs bears a lot of
repetitive, copy-paste-error-prone writing out of data structures.
Add a third layer to libosmo-gtlv, which allows helpful code generation.

By non-repetitive data structures that briefly describe the protocol's
messages and IEs, generate possibly repetitive IE list arrays and
decoded-struct definitions automatically, avoiding grunt work errors.

I tried C macros for this at first, but it became too convoluted.
Generating C code that can be read and grepped makes things easier.

A usage example is found in tests/libosmo-gtlv/test_gtlv_gen/.

Related: SYS#5599
Change-Id: Ifb3ea54d2797ce060b95834aa117725ec2d6c4cf
2022-06-16 13:04:33 +02:00
Neels Hofmeyr f842c8c8d0 libosmo-gtlv: add auto dec/enc to/from structs
Add osmo_gtlv_coding: describe the value part of a TLV (decode and
encode), describe a struct with its members, and get/put readily decoded
structs from/to a raw PDU, directly.

With osmo_gtlv_coding defined for a protocol's tags, we only deal with
encoded PDUs or fully decoded C structs, no TLV related
re-implementations clutter up the message handling code.

A usage example is given in gtlv_dec_enc_test. The first real use will be
the PFCP protocol in osmo-upf.git.

With osmo_gtlv_coding, there still is a lot of monkey work involved in
describing the decoded structs. A subsequent patch adds a generator for
osmo_gtlv_coding and message structs from tag value lists.

Related: SYS#5599
Change-Id: I65de793105882a452124ee58adb0e58469e6e796
2022-06-16 13:04:33 +02:00
Neels Hofmeyr 2100097ef1 libosmo-gtlv: add generic TLV de- and encoder
An all new TLV parser supporting:

- Any size of T and L (determined by callback function),
- "Grouped IEs", so that an IE payload is a nested IE structure,
- optional/mandatory/multi-occurence IEs,
- decoding unordered tags (or enforcing strict order).

Will be used for PFCP message decoding and encoding, a T16L16V protocol
which requires above features.

Upcoming patches add
- translating PDUs to plain C structs and vice versa
- TLV generator to reduce repetition a in protocol definition
- TLIV capability

Previously, the way we deal with TLVs causes a lot of code
re-implementation: the TL decoding is taken care of by the API, but for
encoding, we essentially re-implement each protocol and each encoded
message in the individual programs. This API is an improvement in that
we only once implement the TL coding (or just use osmo_t8l8v_cfg /
osmo_t16l16v_cfg), get symmetric de- and encoding of the TL, and only
need to deal with the value part of each IE.

The common pattern of
- store TL preliminarily,
- write V data and
- update L after V is complete
is conveniently done by osmo_gtlv_put_update_tl().

Related: SYS#5599
Change-Id: Ib0fd00d9f288ffe13b7e67701f3e47073587404a
2022-06-16 13:04:33 +02:00
Neels Hofmeyr cf11908f9c initial osmocom boilerplate source tree
Related: SYS#5599
Depends: I0a46b147ec6a76d909df28136cfd2b764b2c75ea (libosmocore)
Change-Id: I4352dd8738a1a9de6ba2fc250ee8eef69c65ff1e
2022-06-16 13:04:33 +02:00