aboutsummaryrefslogtreecommitdiffstats
path: root/src
AgeCommit message (Collapse)AuthorFilesLines
2023-02-10clarify API doc for osmo_pfcp_endpoint_tx()Neels Janosch Hofmeyr1-1/+6
I recently discovered some use-after-free in osmo-upf by wrong API usage of osmo_pfcp_endpoint_tx(). Highlight this pitfall in API doc. Change-Id: I637e7bb5d1296b5ad8db8ab0b8151fdbb9e7be03
2023-02-07Bump version: 0.1.2.25-9c96-dirty → 0.2.00.2.0Pau Espin Pedrol2-2/+2
Change-Id: I44bb6b839a6aefaf269e124c990ff0f0b837588d
2023-01-02silence compiler warning in gtlv_dec_enc.cNeels Janosch Hofmeyr1-1/+1
This was reported with gcc version 12.2.0: /git/libosmo-pfcp/src/libosmo-gtlv/gtlv_dec_enc.c: In function 'osmo_gtlvs_decode_unordered': /git/libosmo-pfcp/src/libosmo-gtlv/gtlv_dec_enc.c:237:42: warning: 'presence_flag_p' may be used uninitialized [-Wmaybe-uninitialized] 237 | *presence_flag_p = true; | ^ /git/libosmo-pfcp/src/libosmo-gtlv/gtlv_dec_enc.c:113:23: note: 'presence_flag_p' was declared here 113 | bool *presence_flag_p; | ^~~~~~~~~~~~~~~ There is no actual code path that will use presence_flag_p uninitialized, but it doesn't hurt to init with NULL. Change-Id: I8f4c420f2182c607abb1ee5d1c8175eaeda904af
2022-12-08gtlv: decoding error: log size limited hexdump of IENeels Janosch Hofmeyr1-2/+6
When a decoding error is encountered, log the value part of the root cause as hexdump, but at most 16 bytes (16*3 chars as hexdump). Contrived example of the change: before this patch: <-tx- PFCP seq-4 ASSOC_SETUP_RESP: 0: Invalid FQDN (-22: Invalid argument) <-tx- PFCP seq-4 ASSOC_SETUP_RESP: 0: tag 0x3c = Node ID: Error while decoding this IE (-22: Invalid argument) after this patch: <-tx- PFCP seq-4 ASSOC_SETUP_RESP: 0: Invalid FQDN (-22: Invalid argument) <-tx- PFCP seq-4 ASSOC_SETUP_RESP: 0: tag 0x3c = Node ID: Error while decoding this IE. L=20 V=[ 02 07 65 78 61 6d 70 6c 65 03 63 6f 6d 01 02 03 ...] (-22: Invalid argument) Change-Id: Ie814a117db3dfea32cf3f01cf124a2e472cb869f
2022-12-08bitmask to string: shortenNeels Janosch Hofmeyr1-3/+5
Remove braces and spaces from PFCP bits to string conversion. Instead of "( FOO BAR BAZ )", print "FOO+BAR+BAZ". Instead of "( FORW )", print "FORW". Instead of "( )", print "-". The spaces tend to break up readability of strings logged by osmo-upf. In particular, this affects UP and CP capability bits, Apply Action, Outer Header Creation. Change-Id: I38426d6381e96d4a683e46eba1bdd29c73d3f027
2022-12-08fix coding of Node ID: FQDN typeNeels Janosch Hofmeyr1-5/+8
Decode FQDN type Node IDs into "human" dotted notation instead of storing the DNS type data in the FQDN string. Related: OS#5806 Change-Id: I25d0f9b095287aa30e24498d8361c0a326ded447
2022-12-08fix coding of Network Instance IENeels Janosch Hofmeyr2-4/+19
Network instance names should be coded like in DNS, where each label is preceded by a length byte. Related: SYS#6192 Change-Id: I9d67464ef0f92b0512cfd6e48d203f8828a82a19
2022-12-01pfcp coding errmsgs: drop extra newlinesNeels Janosch Hofmeyr1-6/+6
Change-Id: I4eea1efc9bd67676b6202e50d41974b2717a2511
2022-12-01tweak comment in pfcp_ies_custom.cNeels Janosch Hofmeyr1-1/+1
Change-Id: I1530939cc63369668d2f3e5a126912713c06d0c1
2022-12-01add osmo_pfcp_ie_outer_header_creation_to_str_*()Neels Janosch Hofmeyr1-2/+12
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-11-26osmo_pfcp_ip_addrs_set(): do not set port numberNeels Janosch Hofmeyr1-0/+4
struct osmo_pfcp_ip_addrs uses an osmo_sockaddr for storing IP addresses. Even though osmo_sockaddr contains a port number, no port number gets encoded in PFCP messages. Hence always set the port to 0. I noticed that when osmo_pfcp_ip_addrs_set() is invoked with an osmo_sockaddr that incidentally has a port number set, subsequent logging of e.g. a PFCP F-TEID shows a port number, which is confusing. Change-Id: Ib29a123c06d459c99d7c1c0b9a7694fb78cd9fd8
2022-11-26add osmo_pfcp_ip_addrs_to_str_*()Neels Janosch Hofmeyr1-9/+31
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-23PFCP: add Network Instance IE in PDI IENeels Janosch Hofmeyr1-0/+1
So far the optional Network Instance IE in PDI IEs was not coded by libosmo-pfcp. Add it. Test it by adding Network Instance IEs in pfcp_test.c. osmo-upf needs this, because we are about to add support for Network Instance in PDI IEs, to determine which local interface to use for GTP tunnel mapping and encapsulation/decapsulation. Related: SYS#6192 Change-Id: I162299e70b4fb0c3fef8039d693ac7d3fe4df16a
2022-11-03Support building with -Werror=strict-prototypes / -Werror=old-style-definitionHarald Welte1-5/+5
Unfortunately "-std=c99" is not sufficient to make gcc ignore code that uses constructs of earlier C standards, which were abandoned in C99. See https://lwn.net/ml/fedora-devel/Y1kvF35WozzGBpc8@redhat.com/ for some related discussion. Change-Id: I79c51b78d1b055361f9ef5434361847353791d0d
2022-08-24gtlv: fix repeated IEIs to several struct membersNeels Hofmeyr1-20/+70
Coverity Scan has brought my attention to a problem with decoding repeated IEIs, where there are multiple struct members in the decoded struct that these are decoded to. Before this patch, gtlv aborts with an error as soon as the first struct member for a given tag is full, not parsing following IEIs into subsequent struct members. After this patch, gtlv continues to look whether subsequent entries in the message coding also decode the same tag, but to a different struct member. First commit without changing the gtlv regression test, to show that all current tests still succeed. The test for this particular issue follow in I994d0fb1f1435d2c27a8630a43fe106652ac6e41 Related: CID#275415 Related: SYS#5599 Change-Id: Ie37585178ff27306d425b75d8e407b71f92f1cdc
2022-08-24gtlv: check memory bounds 3/3: encoding to strNeels Hofmeyr2-14/+19
See Id8d997c9d5e655ff1842ec69eab6c073875c6330 Related: CID#275417 Related: SYS#5599 Change-Id: I63d52a4f5dba32d3a3887dd9c5e42e1695fb2aa3
2022-08-24gtlv: check memory bounds 2/3: decoding TLVNeels Hofmeyr2-26/+44
See Id8d997c9d5e655ff1842ec69eab6c073875c6330 Related: CID#275417 Related: SYS#5599 Change-Id: I841da89112ccf70fcd0f60eb902445fb1712eb48
2022-08-24gtlv: check memory bounds 1/3: encoding TLVNeels Hofmeyr2-10/+28
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-24pfcp_msg: check use count correctnessNeels Hofmeyr1-2/+2
Related: CID#275414 Related: SYS#5599 Change-Id: I685855da8b6f373fdc62a3c75f7f2e0af2839617
2022-08-13pfcp_cp_peer: check use count correctnessNeels Hofmeyr1-1/+1
Related: CID#275418 Change-Id: Id79a84312b3ff8d562e26a525866b8bb09f9d0bf
2022-08-12fix warnings: 'uninitialized'Neels Hofmeyr2-3/+3
Though these can never be used uninitialized, initialize to NULL to avoid compiler warnings like: pfcp_msg.c:188:66: warning: 'h_no_seid' may be used uninitialized Change-Id: Icb338b200fe3186ccd7fd3f502c1723f60947190
2022-08-09comment / whitespace tweaks in pfcp_endpoint.cNeels Hofmeyr1-5/+8
Related: SYS#5599 Change-Id: Ia2818106fe257a237d1875034b77c1d4cb136fa1
2022-08-09set LIBVERSION=0:0:0Neels Hofmeyr2-2/+2
I wrote '1:0:0', but we should start with '0:0:0', according to https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html Since the packaging for this repository is not functional yet, i.e. it was never packaged by anyone anywhere, i assume it is safe to go back from '1:0:0' to '0:0:0'. Related: SYS#5895 Change-Id: I5b80de2f486fdae62f0da1b74cb70dc9de7bb9cc
2022-07-28pfcp_endpoint: fix final PFCP retrans resp_cbNeels Hofmeyr1-7/+8
After the final retransmission of a sent request, still keep the message in the queue for its expiry period, so that a later response is matched to the request. The osmo_pfcp_msg.resp_cb() depends on the sent message to remain in the queue until it times out. That was not the case in an earlier stage of libosmo-pfcp development. I noticed this during ttcn3 testing, where osmo-hnbgw continuously resends PFCP Association Setup Requests, and fails to associate if ttcn3 happens to respond to the final retransmission of a request. Related: SYS#5599 Change-Id: Iaca396891921f7057015ce6e1e4528b955757809
2022-07-28apply code review: refactor pfcp_endpoint APINeels Hofmeyr2-13/+74
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-23clarify osmo_pfcp_msg alloc APINeels Hofmeyr3-21/+39
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-23fix wrong constants used in osmo_pfcp_tdefs (typo)Neels Hofmeyr1-2/+2
s/MSGT/TIMER Related: SYS#5599 Change-Id: Iaecce86064b65aa003e9903d09f60d760e0689c3
2022-07-20separate pfcp_queue_timer_cb() in req and respNeels Hofmeyr1-17/+30
Having separate callbacks for request and response messages makes for an easier read. No functional change. This applies code review from https://gerrit.osmocom.org/c/osmo-upf/+/28244 Ic8d42e201b63064a71b40ca45a5a40e29941e8ac (osmo-upf.git) Related: SYS#5599 Change-Id: Ic8ab71f5efd4cf669689a0b075f9a52ce66bdd5d
2022-07-19fix incorrect timeout values: milliseconds vs microsecondsVadim Yanitskiy1-2/+2
osmo_timer_schedule() takes (*timer, seconds, microseconds), so the last argument must be in microseconds, not milliseconds. Change-Id: I1e0b319033415e42ca7f4da9bae348c5cb1da38c
2022-06-17add generic PFCP CP peer implementation0.1.0Neels Hofmeyr2-0/+405
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-17add osmo_pfcp_ie_f_seid_cmpNeels Hofmeyr1-0/+25
Related: SYS#5599 Change-Id: Iacaeebfad0fe77788da40c3ed7da2ffa3b27043c
2022-06-17install libosmo-pfcpNeels Hofmeyr1-3/+10
The first user of this is osmo-hnbgw, to implement GTP mapping via a UPF. Related: SYS#5895 Change-Id: If4465095000a898296d69d5b725507f909c87aa3
2022-06-17install libosmo-gtlvNeels Hofmeyr2-4/+11
Related: SYS#5895 Change-Id: I9f4651b6bee457583aba99052dc82bbf675515e6
2022-06-16add pfcp_endpointNeels Hofmeyr2-0/+474
Related: SYS#5599 Change-Id: Ic8d42e201b63064a71b40ca45a5a40e29941e8ac
2022-06-16libosmo-pfcp: implement PFCP header and msg handlingNeels Hofmeyr3-1/+543
Related: SYS#5599 Change-Id: I3f85ea052a6b7c064244a8093777e53a47c8c61e
2022-06-16api: add osmo_pfcp_ie_node_id_to_str_c()Neels Hofmeyr1-2/+11
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-16libosmo-pfcp: implement/generate TLV and IE value codingNeels Hofmeyr3-0/+1386
Related: SYS#5599 Change-Id: I3069045b2d42dac88d955c636230adc64a7a4aa7
2022-06-16libosmo-pfcp: add pfcp_proto.h pfcp_strs.hNeels Hofmeyr2-0/+520
Related: SYS#5599 Change-Id: I568b821e89007ed52eeefcdbcb6edd8052a8b5be
2022-06-16libosmo-gtlv: add TLIV capabilityNeels Hofmeyr3-49/+127
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-16libosmo-gtlv: add C code generator for IE structs and arraysNeels Hofmeyr2-0/+418
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-16libosmo-gtlv: add auto dec/enc to/from structsNeels Hofmeyr2-0/+518
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-16libosmo-gtlv: add generic TLV de- and encoderNeels Hofmeyr3-0/+306
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-16initial osmocom boilerplate source treeNeels Hofmeyr2-0/+3
Related: SYS#5599 Depends: I0a46b147ec6a76d909df28136cfd2b764b2c75ea (libosmocore) Change-Id: I4352dd8738a1a9de6ba2fc250ee8eef69c65ff1e