Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package osmo-ggsn for openSUSE:Factory 
checked in at 2026-08-26 19:52:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/osmo-ggsn (Old)
 and      /work/SRC/openSUSE:Factory/.osmo-ggsn.new.1258 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "osmo-ggsn"

Wed Aug 26 19:52:55 2026 rev:17 rq:1373690 version:1.15.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/osmo-ggsn/osmo-ggsn.changes      2026-03-15 
14:33:24.501960211 +0100
+++ /work/SRC/openSUSE:Factory/.osmo-ggsn.new.1258/osmo-ggsn.changes    
2026-08-26 19:53:24.194063182 +0200
@@ -1,0 +2,7 @@
+Tue Aug 25 16:11:48 UTC 2026 - Jan Engelhardt <[email protected]>
+
+- Update to release 1.15.0
+  * gtp: clamp GSN-Address copy to sockaddr_in size
+  * gtp: fix OOB write in PDP ctx GSN-Address decode
+
+-------------------------------------------------------------------

Old:
----
  1.14.0.tar.gz

New:
----
  1.15.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ osmo-ggsn.spec ++++++
--- /var/tmp/diff_new_pack.OnS3u9/_old  2026-08-26 19:53:26.000126968 +0200
+++ /var/tmp/diff_new_pack.OnS3u9/_new  2026-08-26 19:53:26.007127215 +0200
@@ -19,7 +19,7 @@
 %define _lto_cflags %nil
 Name:           osmo-ggsn
 %define lname   libgtp11
-Version:        1.14.0
+Version:        1.15.0
 Release:        0
 Summary:        GPRS Support Node
 License:        GPL-2.0-only AND LGPL-2.1-or-later
@@ -36,9 +36,11 @@
 BuildRequires:  systemd-rpm-macros
 BuildRequires:  xz
 BuildRequires:  pkgconfig(libgtpnl) >= 1.3.0
-BuildRequires:  pkgconfig(libosmocore) >= 1.12.0
-BuildRequires:  pkgconfig(libosmoctrl) >= 1.12.0
-BuildRequires:  pkgconfig(libosmovty) >= 1.12.0
+BuildRequires:  pkgconfig(libosmocore) >= 1.14.2
+BuildRequires:  pkgconfig(libosmoctrl) >= 1.14.2
+BuildRequires:  pkgconfig(libosmogsm) >= 1.14.2
+BuildRequires:  pkgconfig(libosmovty) >= 1.14.2
+BuildRequires:  pkgconfig(libosmo-netif) >= 1.8.0
 Obsoletes:      openggsn
 
 %description
@@ -115,8 +117,8 @@
 %files
 %license COPYING
 %doc AUTHORS README.md
+%_bindir/sgsnemu
 %_sbindir/osmo-ggsn
-%_sbindir/sgsnemu
 %_mandir/man8/osmo-ggsn.8*
 %_mandir/man8/sgsnemu.8*
 %_unitdir/%name.service

++++++ 1.14.0.tar.gz -> 1.15.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/configure.ac 
new/osmo-ggsn-1.15.0/configure.ac
--- old/osmo-ggsn-1.14.0/configure.ac   2025-12-03 19:03:41.000000000 +0100
+++ new/osmo-ggsn-1.15.0/configure.ac   2026-08-20 12:29:59.000000000 +0200
@@ -154,10 +154,11 @@
 
 AM_INIT_AUTOMAKE([foreign])
 
-PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.12.0)
-PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.12.0)
-PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.12.0)
-PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.12.0)
+PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.14.2)
+PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.14.2)
+PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.14.2)
+PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.14.2)
+PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 1.8.0)
 
 AC_ARG_ENABLE(sanitize,
        [AS_HELP_STRING(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/contrib/jenkins.sh 
new/osmo-ggsn-1.15.0/contrib/jenkins.sh
--- old/osmo-ggsn-1.14.0/contrib/jenkins.sh     2025-12-03 19:03:41.000000000 
+0100
+++ new/osmo-ggsn-1.15.0/contrib/jenkins.sh     2026-08-20 12:29:59.000000000 
+0200
@@ -24,17 +24,18 @@
 
 mkdir "$deps" || true
 
-if [ "x$GTP" == "x--enable-gtp-linux" ]; then
-       osmo-build-dep.sh libgtpnl
-fi
-osmo-build-dep.sh libosmocore "" --disable-doxygen
-
 verify_value_string_arrays_are_terminated.py $(find . -name "*.[hc]")
 
 export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
 export LD_LIBRARY_PATH="$inst/lib"
 export PATH="$inst/bin:$PATH"
 
+if [ "x$GTP" == "x--enable-gtp-linux" ]; then
+       osmo-build-dep.sh libgtpnl
+fi
+osmo-build-dep.sh libosmocore "" --disable-doxygen
+osmo-build-dep.sh libosmo-netif "" --disable-doxygen
+
 # Additional configure options and depends
 CONFIG=""
 if [ "$WITH_MANUALS" = "1" ]; then
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/debian/changelog 
new/osmo-ggsn-1.15.0/debian/changelog
--- old/osmo-ggsn-1.14.0/debian/changelog       2025-12-03 19:03:41.000000000 
+0100
+++ new/osmo-ggsn-1.15.0/debian/changelog       2026-08-20 12:29:59.000000000 
+0200
@@ -1,3 +1,14 @@
+osmo-ggsn (1.15.0) unstable; urgency=medium
+
+  [ Pau Espin Pedrol ]
+  * Depend on libosmo-netif for icmpv6 APIs
+
+  [ n0k0 ]
+  * gtp: clamp GSN-Address copy to sockaddr_in size
+  * gtp: fix OOB write in PDP ctx GSN-Address decode
+
+ -- Pau Espin Pedrol <[email protected]>  Thu, 20 Aug 2026 12:29:58 +0200
+
 osmo-ggsn (1.14.0) unstable; urgency=medium
 
   [ Daniel Willmann ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/debian/control 
new/osmo-ggsn-1.15.0/debian/control
--- old/osmo-ggsn-1.14.0/debian/control 2025-12-03 19:03:41.000000000 +0100
+++ new/osmo-ggsn-1.15.0/debian/control 2026-08-20 12:29:59.000000000 +0200
@@ -7,7 +7,8 @@
                pkg-config,
                libdpkg-perl, git,
                dh-autoreconf,
-               libosmocore-dev (>= 1.12.0),
+               libosmocore-dev (>= 1.14.2),
+               libosmo-netif-dev (>= 1.8.0),
                osmo-gsm-manuals-dev (>= 1.7.0),
                libgtpnl-dev (>= 1.3.0)
 Standards-Version: 3.9.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/ggsn/Makefile.am 
new/osmo-ggsn-1.15.0/ggsn/Makefile.am
--- old/osmo-ggsn-1.14.0/ggsn/Makefile.am       2025-12-03 19:03:41.000000000 
+0100
+++ new/osmo-ggsn-1.15.0/ggsn/Makefile.am       2026-08-20 12:29:59.000000000 
+0200
@@ -11,9 +11,17 @@
            $(LIBOSMOCORE_CFLAGS) \
            $(LIBOSMOCTRL_CFLAGS) \
            $(LIBOSMOVTY_CFLAGS) \
+           $(LIBOSMONETIF_CFLAGS) \
            $(NULL)
 
-osmo_ggsn_LDADD = @EXEC_LDADD@ -lgtp -L../gtp ../lib/libmisc.a 
$(LIBOSMOCORE_LIBS) $(LIBOSMOCTRL_LIBS) $(LIBOSMOVTY_LIBS)
+osmo_ggsn_LDADD = \
+       @EXEC_LDADD@ \
+       -lgtp -L../gtp ../lib/libmisc.a \
+       $(LIBOSMOCORE_LIBS) \
+       $(LIBOSMOCTRL_LIBS) \
+       $(LIBOSMOVTY_LIBS) \
+       $(LIBOSMONETIF_LIBS) \
+       $(NULL)
 
 if ENABLE_GTP_KERNEL
 AM_CFLAGS += -DGTP_KERNEL $(LIBGTPNL_CFLAGS)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/ggsn/ggsn.c 
new/osmo-ggsn-1.15.0/ggsn/ggsn.c
--- old/osmo-ggsn-1.14.0/ggsn/ggsn.c    2025-12-03 19:03:41.000000000 +0100
+++ new/osmo-ggsn-1.15.0/ggsn/ggsn.c    2026-08-20 12:29:59.000000000 +0200
@@ -46,6 +46,8 @@
 #include <osmocom/ctrl/control_if.h>
 #include <osmocom/gsm/apn.h>
 
+#include <osmocom/netif/icmpv6.h>
+
 #include <osmocom/gtp/pdp.h>
 #include <osmocom/gtp/gtp.h>
 
@@ -789,11 +791,13 @@
 
                if (IN6_IS_ADDR_MULTICAST(&ip6h->ip6_dst)) {
                        /* daddr: all-routers multicast addr */
-                       if (IN6_ARE_ADDR_EQUAL(&ip6h->ip6_dst, 
&all_router_mcast_addr))
+                       if (IN6_ARE_ADDR_EQUAL(&ip6h->ip6_dst, 
&osmo_icmpv6_all_router_mcast_addr))
                                return handle_router_mcast(pdp->gsn, pdp, 
&peer->addr.v6,
                                                           &apn->v6_lladdr, 
apn->cfg.mtu, pack, len);
                        /* daddr: solicited-node multicast addr */
-                       if (memcmp(&ip6h->ip6_dst.s6_addr, 
solicited_node_mcast_addr_prefix, sizeof(solicited_node_mcast_addr_prefix)) == 
0)
+                       if (memcmp(&ip6h->ip6_dst.s6_addr,
+                                  osmo_icmpv6_solicited_node_mcast_addr_prefix,
+                                  
sizeof(osmo_icmpv6_solicited_node_mcast_addr_prefix)) == 0)
                                return handle_solicited_node_mcast(pack, len);
                }
                break;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/gtp/Makefile.am 
new/osmo-ggsn-1.15.0/gtp/Makefile.am
--- old/osmo-ggsn-1.14.0/gtp/Makefile.am        2025-12-03 19:03:41.000000000 
+0100
+++ new/osmo-ggsn-1.15.0/gtp/Makefile.am        2026-08-20 12:29:59.000000000 
+0200
@@ -2,7 +2,7 @@
 # Please read chapter "Library interface versions" of the libtool documentation
 # before making any modifications: 
https://www.gnu.org/software/libtool/manual/html_node/Versioning.html
 # If major=current-age is increased, remember to update the dh_strip line in 
debian/rules!
-LIBVERSION=12:0:1
+LIBVERSION=12:1:1
 
 lib_LTLIBRARIES = libgtp.la
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/gtp/gtp.c 
new/osmo-ggsn-1.15.0/gtp/gtp.c
--- old/osmo-ggsn-1.14.0/gtp/gtp.c      2025-12-03 19:03:41.000000000 +0100
+++ new/osmo-ggsn-1.15.0/gtp/gtp.c      2026-08-20 12:29:59.000000000 +0200
@@ -1245,12 +1245,24 @@
        /* GGSN Address Ctrl */
        pdp->gsnrc.l = *ptr;
        ptr++;
+       if (pdp->gsnrc.l > sizeof(pdp->gsnrc.v)) {
+               LOGP(DLGTP, LOGL_ERROR,
+                       "PDP Context Decode: GSN Address (Ctrl) length %u 
exceeds %zu\n",
+                       pdp->gsnrc.l, sizeof(pdp->gsnrc.v));
+               return -EINVAL;
+       }
        memcpy(pdp->gsnrc.v, ptr, pdp->gsnrc.l);
        ptr += pdp->gsnrc.l;
 
        /* GGSN Address User */
        pdp->gsnru.l = *ptr;
        ptr++;
+       if (pdp->gsnru.l > sizeof(pdp->gsnru.v)) {
+               LOGP(DLGTP, LOGL_ERROR,
+                       "PDP Context Decode: GSN Address (User) length %u 
exceeds %zu\n",
+                       pdp->gsnru.l, sizeof(pdp->gsnru.v));
+               return -EINVAL;
+       }
        memcpy(pdp->gsnru.v, ptr, pdp->gsnru.l);
        ptr += pdp->gsnru.l;
 
@@ -3280,7 +3292,10 @@
        }
 
        /* If the GPDU was not from the peer GSN tell him to delete context */
-       if (memcmp(&peer->sin_addr, pdp->gsnru.v, pdp->gsnru.l)) {      /* TODO 
Range? */
+       /* Compare only the IPv4 address bytes; peer->sin_addr is 4 bytes, so
+        * bound the compare to sizeof(sin_addr) rather than the 
(attacker-influenced)
+        * gsnru length to avoid reading past sin_addr. */
+       if (memcmp(&peer->sin_addr, pdp->gsnru.v, sizeof(peer->sin_addr))) {
                rate_ctr_inc2(gsn->ctrg, GSN_CTR_ERR_UNKNOWN_PDP);
                GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Unknown GSN peer 
%s\n", inet_ntoa(peer->sin_addr));
                return gtp_error_ind_resp(gsn, version, peer, fd, pack, len);
@@ -3778,7 +3793,10 @@
 #if defined(__FreeBSD__) || defined(__APPLE__)
        addr.sin_len = sizeof(addr);
 #endif
-       memcpy(&addr.sin_addr, pdp->gsnru.v, pdp->gsnru.l);     /* TODO range 
check */
+       /* gsnru is the IPv4 GSN user-plane address for this AF_INET path; copy
+        * exactly sizeof(sin_addr) bytes so an over-long (e.g. 16-byte IPv6)
+        * address cannot write past addr on the stack. */
+       memcpy(&addr.sin_addr, pdp->gsnru.v, sizeof(addr.sin_addr));
 
        /* prepare msghdr */
        memset(&msgh, 0, sizeof(msgh));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/lib/Makefile.am 
new/osmo-ggsn-1.15.0/lib/Makefile.am
--- old/osmo-ggsn-1.14.0/lib/Makefile.am        2025-12-03 19:03:41.000000000 
+0100
+++ new/osmo-ggsn-1.15.0/lib/Makefile.am        2026-08-20 12:29:59.000000000 
+0200
@@ -1,7 +1,6 @@
 noinst_LIBRARIES = libmisc.a
 
 noinst_HEADERS = \
-                checksum.h \
                 gnugetopt.h \
                 gtp-kernel.h \
                 icmpv6.h \
@@ -21,10 +20,10 @@
            -DSBINDIR='"$(sbindir)"' \
            -I$(top_srcdir)/include \
            $(LIBOSMOCORE_CFLAGS) \
+           $(LIBOSMONETIF_CFLAGS) \
            $(NULL)
 
 libmisc_a_SOURCES = \
-                   checksum.c \
                    debug.c \
                    getopt.c \
                    getopt1.c \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/lib/checksum.c 
new/osmo-ggsn-1.15.0/lib/checksum.c
--- old/osmo-ggsn-1.14.0/lib/checksum.c 2025-12-03 19:03:41.000000000 +0100
+++ new/osmo-ggsn-1.15.0/lib/checksum.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,211 +0,0 @@
-/*
- *
- * INET                An implementation of the TCP/IP protocol suite for the 
LINUX
- *             operating system.  INET is implemented using the  BSD Socket
- *             interface as the means of communication with the user level.
- *
- *             IP/TCP/UDP checksumming routines
- *
- * Authors:    Jorge Cwik, <[email protected]>
- *             Arnt Gulbrandsen, <[email protected]>
- *             Tom May, <[email protected]>
- *             Andreas Schwab, <[email protected]>
- *             Lots of code moved from tcp.c and ip.c; see those files
- *             for more names.
- *
- * 03/02/96    Jes Sorensen, Andreas Schwab, Roman Hodek:
- *             Fixed some nasty bugs, causing some horrible crashes.
- *             A: At some points, the sum (%0) was used as
- *             length-counter instead of the length counter
- *             (%1). Thanks to Roman Hodek for pointing this out.
- *             B: GCC seems to mess up if one uses too many
- *             data-registers to hold input values and one tries to
- *             specify d0 and d1 as scratch registers. Letting gcc
- *             choose these registers itself solves the problem.
- *
- *             This program is free software; you can redistribute it and/or
- *             modify it under the terms of the GNU General Public License
- *             as published by the Free Software Foundation; either version
- *             2 of the License, or (at your option) any later version.
- */
-
-/* Revised by Kenneth Albanowski for m68knommu. Basic problem: unaligned access
- kills, so most of the assembly has to go. */
-
-#if defined(__FreeBSD__)
-#define _KERNEL        /* needed on FreeBSD 10.x for s6_addr32 */
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <sys/endian.h>
-#endif
-
-#include "checksum.h"
-#include <arpa/inet.h>
-
-static inline unsigned short from32to16(unsigned int x)
-{
-       /* add up 16-bit and 16-bit for 16+c bit */
-       x = (x & 0xffff) + (x >> 16);
-       /* add up carry.. */
-       x = (x & 0xffff) + (x >> 16);
-       return x;
-}
-
-static unsigned int do_csum(const unsigned char *buff, int len)
-{
-       int odd;
-       unsigned int result = 0;
-
-       if (len <= 0)
-               goto out;
-       odd = 1 & (unsigned long) buff;
-       if (odd) {
-#if BYTE_ORDER == LITTLE_ENDIAN
-               result += (*buff << 8);
-#else
-               result = *buff;
-#endif
-               len--;
-               buff++;
-       }
-       if (len >= 2) {
-               if (2 & (unsigned long) buff) {
-                       result += *(unsigned short *) buff;
-                       len -= 2;
-                       buff += 2;
-               }
-               if (len >= 4) {
-                       const unsigned char *end = buff + ((unsigned)len & ~3);
-                       unsigned int carry = 0;
-                       do {
-                               unsigned int w = *(unsigned int *) buff;
-                               buff += 4;
-                               result += carry;
-                               result += w;
-                               carry = (w > result);
-                       } while (buff < end);
-                       result += carry;
-                       result = (result & 0xffff) + (result >> 16);
-               }
-               if (len & 2) {
-                       result += *(unsigned short *) buff;
-                       buff += 2;
-               }
-       }
-       if (len & 1)
-#if BYTE_ORDER == LITTLE_ENDIAN
-               result += *buff;
-#else
-               result += (*buff << 8);
-#endif
-       result = from32to16(result);
-       if (odd)
-               result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
-out:
-       return result;
-}
-
-/*
- *     This is a version of ip_compute_csum() optimized for IP headers,
- *     which always checksum on 4 octet boundaries.
- */
-uint16_t ip_fast_csum(const void *iph, unsigned int ihl)
-{
-       return (uint16_t)~do_csum(iph, ihl*4);
-}
-
-/*
- * computes the checksum of a memory block at buff, length len,
- * and adds in "sum" (32-bit)
- *
- * returns a 32-bit number suitable for feeding into itself
- * or csum_tcpudp_magic
- *
- * this function must be called with even lengths, except
- * for the last fragment, which may be odd
- *
- * it's best to have buff aligned on a 32-bit boundary
- */
-uint32_t csum_partial(const void *buff, int len, uint32_t wsum)
-{
-       unsigned int sum = (unsigned int)wsum;
-       unsigned int result = do_csum(buff, len);
-
-       /* add in old sum, and carry.. */
-       result += sum;
-       if (sum > result)
-               result += 1;
-       return (uint32_t)result;
-}
-
-/*
- * this routine is used for miscellaneous IP-like checksums, mainly
- * in icmp.c
- */
-uint16_t ip_compute_csum(const void *buff, int len)
-{
-       return (uint16_t)~do_csum(buff, len);
-}
-
-uint16_t csum_ipv6_magic(const struct in6_addr *saddr,
-                       const struct in6_addr *daddr,
-                       uint32_t len, uint8_t proto, uint32_t csum)
-{
-       int carry;
-       uint32_t ulen;
-       uint32_t uproto;
-       uint32_t sum = (uint32_t)csum;
-
-       sum += (uint32_t)saddr->s6_addr32[0];
-       carry = (sum < (uint32_t)saddr->s6_addr32[0]);
-       sum += carry;
-
-       sum += (uint32_t)saddr->s6_addr32[1];
-       carry = (sum < (uint32_t)saddr->s6_addr32[1]);
-       sum += carry;
-
-       sum += (uint32_t)saddr->s6_addr32[2];
-       carry = (sum < (uint32_t)saddr->s6_addr32[2]);
-       sum += carry;
-
-       sum += (uint32_t)saddr->s6_addr32[3];
-       carry = (sum < (uint32_t)saddr->s6_addr32[3]);
-       sum += carry;
-
-       sum += (uint32_t)daddr->s6_addr32[0];
-       carry = (sum < (uint32_t)daddr->s6_addr32[0]);
-       sum += carry;
-
-       sum += (uint32_t)daddr->s6_addr32[1];
-       carry = (sum < (uint32_t)daddr->s6_addr32[1]);
-       sum += carry;
-
-       sum += (uint32_t)daddr->s6_addr32[2];
-       carry = (sum < (uint32_t)daddr->s6_addr32[2]);
-       sum += carry;
-
-       sum += (uint32_t)daddr->s6_addr32[3];
-       carry = (sum < (uint32_t)daddr->s6_addr32[3]);
-       sum += carry;
-
-       ulen = (uint32_t)htonl((uint32_t) len);
-       sum += ulen;
-       carry = (sum < ulen);
-       sum += carry;
-
-       uproto = (uint32_t)htonl(proto);
-       sum += uproto;
-       carry = (sum < uproto);
-       sum += carry;
-
-       return csum_fold((uint32_t)sum);
-}
-
-/* fold a partial checksum */
-uint16_t csum_fold(uint32_t csum)
-{
-       uint32_t sum = (uint32_t)csum;
-       sum = (sum & 0xffff) + (sum >> 16);
-       sum = (sum & 0xffff) + (sum >> 16);
-       return (uint16_t)~sum;
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/lib/checksum.h 
new/osmo-ggsn-1.15.0/lib/checksum.h
--- old/osmo-ggsn-1.14.0/lib/checksum.h 2025-12-03 19:03:41.000000000 +0100
+++ new/osmo-ggsn-1.15.0/lib/checksum.h 1970-01-01 01:00:00.000000000 +0100
@@ -1,13 +0,0 @@
-#pragma once
-#include <stdint.h>
-#include <netinet/in.h>
-
-uint16_t ip_fast_csum(const void *iph, unsigned int ihl);
-uint32_t csum_partial(const void *buff, int len, uint32_t wsum);
-uint16_t ip_compute_csum(const void *buff, int len);
-
-uint16_t csum_ipv6_magic(const struct in6_addr *saddr,
-                       const struct in6_addr *daddr,
-                       uint32_t len, uint8_t proto, uint32_t csum);
-
-uint16_t csum_fold(uint32_t csum);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/lib/icmpv6.c 
new/osmo-ggsn-1.15.0/lib/icmpv6.c
--- old/osmo-ggsn-1.14.0/lib/icmpv6.c   2025-12-03 19:03:41.000000000 +0100
+++ new/osmo-ggsn-1.15.0/lib/icmpv6.c   2026-08-20 12:29:59.000000000 +0200
@@ -22,172 +22,16 @@
 #include <osmocom/core/msgb.h>
 #include <osmocom/core/utils.h>
 
+#include <osmocom/netif/icmpv6.h>
+
 #include <osmocom/gtp/gtp.h>
 #include <osmocom/gtp/pdp.h>
 
-#include "checksum.h"
 #include "ippool.h"
 #include "syserr.h"
 #include "icmpv6.h"
 #include "config.h"
 
-/* 29.061 11.2.1.3.4 IPv6 Router Configuration Variables in GGSN */
-#define GGSN_MaxRtrAdvInterval 21600           /* 6 hours */
-#define GGSN_MinRtrAdvInterval 16200           /* 4.5 hours */
-#define GGSN_AdvValidLifetime  0xffffffff      /* infinite */
-#define GGSN_AdvPreferredLifetime 0xffffffff   /* infinite */
-
-/* RFC3307 link-local scope multicast address */
-const struct in6_addr all_router_mcast_addr = {
-       .s6_addr = { 0xff,0x02,0,0,  0,0,0,0, 0,0,0,0,  0,0,0,2 }
-};
-
-/* RFC4291  link-local solicited-node multicast address, FF02:0:0:0:0:1:FF, 
104 bits = 13 bytes */
-const uint8_t solicited_node_mcast_addr_prefix[13] = {
-       0xff, 0x02, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x01,
-       0xFF
-};
-
-/* Prepends the ipv6 header and returns checksum content */
-uint16_t icmpv6_prepend_ip6hdr(struct msgb *msg, const struct in6_addr *saddr,
-                                 const struct in6_addr *daddr)
-{
-       uint32_t len;
-       uint16_t skb_csum;
-       struct ip6_hdr *i6h;
-
-       /* checksum */
-       skb_csum = csum_partial(msgb_data(msg), msgb_length(msg), 0);
-       len = msgb_length(msg);
-       skb_csum = csum_ipv6_magic(saddr, daddr, len, IPPROTO_ICMPV6, skb_csum);
-
-       /* Push IPv6 header in front of ICMPv6 packet */
-       i6h = (struct ip6_hdr *) msgb_push(msg, sizeof(*i6h));
-       /* 4 bits version, 8 bits TC, 20 bits flow-ID */
-       i6h->ip6_ctlun.ip6_un1.ip6_un1_flow = htonl(0x60000000);
-       i6h->ip6_ctlun.ip6_un1.ip6_un1_plen = htons(len);
-       i6h->ip6_ctlun.ip6_un1.ip6_un1_nxt = IPPROTO_ICMPV6;
-       i6h->ip6_ctlun.ip6_un1.ip6_un1_hlim = 255;
-       i6h->ip6_src = *saddr;
-       i6h->ip6_dst = *daddr;
-       return skb_csum;
-}
-
-/*! construct a RFC4861 compliant ICMPv6 router soliciation
- *  \param[in] saddr Source IPv6 address for router advertisement
- *  \param[in] daddr Destination IPv6 address for router advertisement IPv6 
header
- *  \param[in] prefix The single prefix to be advertised (/64 implied!)
- *  \returns callee-allocated message buffer containing router advertisement */
-struct msgb *icmpv6_construct_rs(const struct in6_addr *saddr)
-{
-       struct msgb *msg = msgb_alloc_headroom(512,128, "IPv6 RS");
-       struct icmpv6_rsol_hdr *rs;
-       OSMO_ASSERT(msg);
-       rs = (struct icmpv6_rsol_hdr *) msgb_put(msg, sizeof(*rs));
-       rs->hdr.type = 133;     /* see RFC4861 4.1 */
-       rs->hdr.code = 0;       /* see RFC4861 4.1 */
-       rs->hdr.csum = 0;       /* updated below */
-       rs->reserved = 0;       /* see RFC4861 4.1 */
-
-       rs->hdr.csum = icmpv6_prepend_ip6hdr(msg, saddr, 
&all_router_mcast_addr);
-
-       return msg;
-}
-/*! construct a 3GPP 29.061 compliant router advertisement for a given prefix
- *  \param[in] saddr Source IPv6 address for router advertisement
- *  \param[in] daddr Destination IPv6 address for router advertisement IPv6 
header
- *  \param[in] prefix The single prefix to be advertised (/64 implied!)
- *  \returns callee-allocated message buffer containing router advertisement */
-static struct msgb *icmpv6_construct_ra(const struct in6_addr *saddr,
-                                const struct in6_addr *daddr,
-                                const struct in6_addr *prefix,
-                                uint32_t mtu)
-{
-       struct msgb *msg = msgb_alloc_headroom(512,128, "IPv6 RA");
-       struct icmpv6_radv_hdr *ra;
-       struct icmpv6_opt_prefix *ra_opt_pref;
-       struct icmpv6_opt_mtu *ra_opt_mtu;
-
-       OSMO_ASSERT(msg);
-
-       ra = (struct icmpv6_radv_hdr *) msgb_put(msg, sizeof(*ra));
-       ra->hdr.type = 134;     /* see RFC4861 4.2 */
-       ra->hdr.code = 0;       /* see RFC4861 4.2 */
-       ra->hdr.csum = 0;       /* updated below */
-       ra->cur_ho_limit = 64;  /* seems reasonable? */
-       /* the GGSN shall leave the M-flag cleared in the Router
-        * Advertisement messages */
-       ra->m = 0;
-       /* The GGSN may set the O-flag if there are additional
-        * configuration parameters that need to be fetched by the MS */
-       ra->o = 0;              /* no DHCPv6 */
-       ra->res = 0;
-       /* RFC4861 Default: 3 * MaxRtrAdvInterval */
-       ra->router_lifetime = htons(3*GGSN_MaxRtrAdvInterval);
-       ra->reachable_time = 0; /* Unspecified */
-
-       /* RFC4861 Section 4.6.2 */
-       ra_opt_pref = (struct icmpv6_opt_prefix *) msgb_put(msg, 
sizeof(*ra_opt_pref));
-       ra_opt_pref->hdr.type = 3;      /* RFC4861 4.6.2 */
-       ra_opt_pref->hdr.len = 4;       /* RFC4861 4.6.2 */
-       ra_opt_pref->prefix_len = 64;   /* only prefix length as per 3GPP */
-       /* The Prefix is contained in the Prefix Information Option of
-        * the Router Advertisements and shall have the A-flag set
-        * and the L-flag cleared */
-       ra_opt_pref->a = 1;
-       ra_opt_pref->l = 0;
-       ra_opt_pref->res = 0;
-       /*  The lifetime of the prefix shall be set to infinity */
-       ra_opt_pref->valid_lifetime = htonl(GGSN_AdvValidLifetime);
-       ra_opt_pref->preferred_lifetime = htonl(GGSN_AdvPreferredLifetime);
-       ra_opt_pref->res2 = 0;
-       memcpy(ra_opt_pref->prefix, prefix, sizeof(ra_opt_pref->prefix));
-
-       /* RFC4861 Section 4.6.4, MTU */
-       ra_opt_mtu = (struct icmpv6_opt_mtu *) msgb_put(msg, 
sizeof(*ra_opt_mtu));
-       ra_opt_mtu->hdr.type = 5;       /* RFC4861 4.6.4 */
-       ra_opt_mtu->hdr.len = 1;        /* RFC4861 4.6.4 */
-       ra_opt_mtu->reserved = 0;
-       ra_opt_mtu->mtu = htonl(mtu);
-
-       /* The Prefix is contained in the Prefix Information Option of
-        * the Router Advertisements and shall have the A-flag set
-        * and the L-flag cleared */
-       ra_opt_pref->a = 1;
-       ra_opt_pref->l = 0;
-       ra_opt_pref->res = 0;
-       /*  The lifetime of the prefix shall be set to infinity */
-       ra_opt_pref->valid_lifetime = htonl(GGSN_AdvValidLifetime);
-       ra_opt_pref->preferred_lifetime = htonl(GGSN_AdvPreferredLifetime);
-       ra_opt_pref->res2 = 0;
-       memcpy(ra_opt_pref->prefix, prefix, sizeof(ra_opt_pref->prefix));
-
-       /* checksum */
-       ra->hdr.csum = icmpv6_prepend_ip6hdr(msg, saddr, daddr);
-
-       return msg;
-}
-
-/* Validate an ICMPv6 router solicitation according to RFC4861 6.1.1 */
-static bool icmpv6_validate_router_solicit(const uint8_t *pack, unsigned len)
-{
-       const struct ip6_hdr *ip6h = (struct ip6_hdr *)pack;
-       //const struct icmpv6_hdr *ic6h = (struct icmpv6_hdr *) (pack + 
sizeof(*ip6h));
-
-       /* Hop limit field must have 255 */
-       if (ip6h->ip6_ctlun.ip6_un1.ip6_un1_hlim != 255)
-               return false;
-       /* FIXME: ICMP checksum is valid */
-       /* ICMP length (derived from IP length) is 8 or more octets */
-       if (ip6h->ip6_ctlun.ip6_un1.ip6_un1_plen < 8)
-               return false;
-       /* FIXME: All included options have a length > 0 */
-       /* FIXME: If IP source is unspecified, no source link-layer addr option 
*/
-       return true;
-}
-
 /* Validate an ICMPv6 neighbor solicitation according to RFC4861 7.1.1 */
 static bool icmpv6_validate_neigh_solicit(const uint8_t *pack, unsigned len)
 {
@@ -207,37 +51,6 @@
        return true;
 }
 
-/* Validate an ICMPv6 router advertisement according to RFC4861 6.1.2.
-   Returns pointer packet header on success, NULL otherwise. */
-struct icmpv6_radv_hdr *icmpv6_validate_router_adv(const uint8_t *pack, 
unsigned len)
-{
-       const struct ip6_hdr *ip6h = (struct ip6_hdr *)pack;
-       const struct icmpv6_hdr *ic6h = (struct icmpv6_hdr *) (pack + 
sizeof(*ip6h));
-
-       /* ICMP length (derived from IP length) is 16 or more octets */
-       if (len < sizeof(*ip6h) + 16)
-               return NULL;
-
-       if (ic6h->type != 134) /* router advertismenet type */
-               return NULL;
-
-       /*Routers must use their link-local address */
-       if (!IN6_IS_ADDR_LINKLOCAL(&ip6h->ip6_src))
-               return NULL;
-       /* Hop limit field must have 255 */
-       if (ip6h->ip6_ctlun.ip6_un1.ip6_un1_hlim != 255)
-               return NULL;
-       /* ICMP Code is 0 */
-       if (ic6h->code != 0)
-               return NULL;
-       /* ICMP length (derived from IP length) is 16 or more octets */
-       if (ip6h->ip6_ctlun.ip6_un1.ip6_un1_plen < 16)
-               return NULL;
-       /* FIXME: All included options have a length > 0 */
-       /* FIXME: If IP source is unspecified, no source link-layer addr option 
*/
-       return (struct icmpv6_radv_hdr *)ic6h;
-}
-
 /* handle incoming packets to the all-routers multicast address */
 int handle_router_mcast(struct gsn_t *gsn, struct pdp_t *pdp,
                        const struct in6_addr *pdp_prefix,
@@ -246,7 +59,7 @@
                        const uint8_t *pack, unsigned len)
 {
        const struct ip6_hdr *ip6h = (struct ip6_hdr *)pack;
-       const struct icmpv6_hdr *ic6h = (struct icmpv6_hdr *) (pack + 
sizeof(*ip6h));
+       const struct osmo_icmpv6_hdr *ic6h = (struct osmo_icmpv6_hdr *) (pack + 
sizeof(*ip6h));
        struct msgb *msg;
 
        if (len < sizeof(*ip6h)) {
@@ -271,7 +84,7 @@
                        LOGP(DICMP6, LOGL_NOTICE, "ICMPv6 type 133 but code 
%d\n", ic6h->code);
                        return -1;
                }
-               if (!icmpv6_validate_router_solicit(pack, len)) {
+               if (!osmo_icmpv6_validate_router_solicit(pack, len)) {
                        LOGP(DICMP6, LOGL_NOTICE, "Invalid Router Solicitation: 
%s\n",
                                osmo_hexdump(pack, len));
                        return -1;
@@ -279,7 +92,7 @@
                /* Send router advertisement from GGSN link-local
                 * address to MS link-local address, including prefix
                 * allocated to this PDP context */
-               msg = icmpv6_construct_ra(own_ll_addr, &ip6h->ip6_src, 
pdp_prefix, mtu);
+               msg = osmo_icmpv6_construct_ra(own_ll_addr, &ip6h->ip6_src, 
pdp_prefix, mtu);
                /* Send the constructed RA to the MS */
                gtp_data_req(gsn, pdp, msgb_data(msg), msgb_length(msg));
                msgb_free(msg);
@@ -295,7 +108,7 @@
 int handle_solicited_node_mcast(const uint8_t *pack, unsigned len)
 {
        const struct ip6_hdr *ip6h = (struct ip6_hdr *)pack;
-       const struct icmpv6_hdr *ic6h = (struct icmpv6_hdr *) (pack + 
sizeof(*ip6h));
+       const struct osmo_icmpv6_hdr *ic6h = (struct osmo_icmpv6_hdr *) (pack + 
sizeof(*ip6h));
 
        if (len < sizeof(*ip6h)) {
                LOGP(DICMP6, LOGL_NOTICE, "Packet too short: %u bytes\n", len);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/lib/icmpv6.h 
new/osmo-ggsn-1.15.0/lib/icmpv6.h
--- old/osmo-ggsn-1.14.0/lib/icmpv6.h   2025-12-03 19:03:41.000000000 +0100
+++ new/osmo-ggsn-1.15.0/lib/icmpv6.h   2026-08-20 12:29:59.000000000 +0200
@@ -1,109 +1,13 @@
 #pragma once
 
-#include <stdbool.h>
-
-#include <osmocom/core/msgb.h>
-#include <osmocom/core/endian.h>
+#include <stdint.h>
 
 #include <osmocom/gtp/gtp.h>
 #include <osmocom/gtp/pdp.h>
 
-#define ICMPv6_OPT_TYPE_PREFIX_INFO 0x03
-
-#define foreach_icmpv6_opt(icmpv6_pkt, icmpv6_len, opt_hdr) \
-               for (opt_hdr = (struct icmpv6_opt_hdr *)(icmpv6_pkt)->options; \
-                    (uint8_t*)(opt_hdr) + sizeof(struct icmpv6_opt_hdr) <= 
(((uint8_t*)(icmpv6_pkt)) + (icmpv6_len)); \
-                    opt_hdr = (struct icmpv6_opt_hdr*)((uint8_t*)(opt_hdr) + 
(opt_hdr)->len) \
-                   )
-
-struct icmpv6_hdr {
-       uint8_t type;
-       uint8_t code;
-       uint16_t csum;
-} __attribute__ ((packed));
-
-struct icmpv6_echo_hdr {
-       struct icmpv6_hdr hdr;
-       uint16_t ident;         /* Identifier */
-       uint16_t seq;           /* Sequence number */
-       uint8_t data[0];        /* Data */
-} __attribute__ ((packed));
-
-/* RFC4861 Section 4.1 */
-struct icmpv6_rsol_hdr {
-       struct icmpv6_hdr hdr;
-       uint32_t reserved;
-       uint8_t options[0];
-} __attribute__ ((packed));
-
-/* RFC4861 Section 4.2 */
-struct icmpv6_radv_hdr {
-       struct icmpv6_hdr hdr;
-       uint8_t cur_ho_limit;
-#if OSMO_IS_LITTLE_ENDIAN
-       uint8_t res:6,
-               m:1,
-               o:1;
-#elif OSMO_IS_BIG_ENDIAN
-/* auto-generated from the little endian part above 
(libosmocore/contrib/struct_endianness.py) */
-       uint8_t o:1, m:1, res:6;
-#endif
-       uint16_t router_lifetime;
-       uint32_t reachable_time;
-       uint32_t retrans_timer;
-       uint8_t options[0];
-} __attribute__ ((packed));
-
-
-/* RFC4861 Section 4.6 */
-struct icmpv6_opt_hdr {
-       uint8_t type;
-       /* length in units of 8 octets, including type+len! */
-       uint8_t len;
-       uint8_t data[0];
-} __attribute__ ((packed));
-
-/* RFC4861 Section 4.6.2 */
-struct icmpv6_opt_prefix {
-       struct icmpv6_opt_hdr hdr;
-       uint8_t prefix_len;
-#if OSMO_IS_LITTLE_ENDIAN
-       uint8_t res:6,
-               a:1,
-               l:1;
-#elif OSMO_IS_BIG_ENDIAN
-/* auto-generated from the little endian part above 
(libosmocore/contrib/struct_endianness.py) */
-       uint8_t l:1, a:1, res:6;
-#endif
-       uint32_t valid_lifetime;
-       uint32_t preferred_lifetime;
-       uint32_t res2;
-       uint8_t prefix[16];
-} __attribute__ ((packed));
-
-/* RFC4861 Section 4.6.4 */
-struct icmpv6_opt_mtu {
-       struct icmpv6_opt_hdr hdr;
-       uint16_t reserved;
-       uint32_t mtu;
-} __attribute__ ((packed));
-
-uint16_t icmpv6_prepend_ip6hdr(struct msgb *msg, const struct in6_addr *saddr,
-                                 const struct in6_addr *daddr);
-
-struct msgb *icmpv6_construct_rs(const struct in6_addr *saddr);
-
 int handle_router_mcast(struct gsn_t *gsn, struct pdp_t *pdp,
                        const struct in6_addr *pdp_prefix,
                        const struct in6_addr *own_ll_addr,
                        uint32_t mtu,
                        const uint8_t *pack, unsigned len);
 int handle_solicited_node_mcast(const uint8_t *pack, unsigned len);
-
-struct icmpv6_radv_hdr *icmpv6_validate_router_adv(const uint8_t *pack, 
unsigned len);
-
-
-/* RFC3307 link-local scope multicast address */
-extern const struct in6_addr all_router_mcast_addr;
-
-extern const uint8_t solicited_node_mcast_addr_prefix[13];
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/sgsnemu/Makefile.am 
new/osmo-ggsn-1.15.0/sgsnemu/Makefile.am
--- old/osmo-ggsn-1.14.0/sgsnemu/Makefile.am    2025-12-03 19:03:41.000000000 
+0100
+++ new/osmo-ggsn-1.15.0/sgsnemu/Makefile.am    2026-08-20 12:29:59.000000000 
+0200
@@ -9,9 +9,15 @@
            -DSBINDIR='"$(sbindir)"' \
            -I$(top_srcdir)/include \
            $(LIBOSMOCORE_CFLAGS) \
+           $(LIBOSMONETIF_CFLAGS) \
            $(NULL)
 
-sgsnemu_LDADD = @EXEC_LDADD@ -lgtp -L../gtp ../lib/libmisc.a 
$(LIBOSMOCORE_LIBS)
+sgsnemu_LDADD = \
+       @EXEC_LDADD@ \
+       -lgtp -L../gtp ../lib/libmisc.a \
+       $(LIBOSMOCORE_LIBS) \
+       $(LIBOSMONETIF_LIBS) \
+       $(NULL)
 
 if ENABLE_GTP_KERNEL
 AM_CFLAGS += \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osmo-ggsn-1.14.0/sgsnemu/sgsnemu.c 
new/osmo-ggsn-1.15.0/sgsnemu/sgsnemu.c
--- old/osmo-ggsn-1.14.0/sgsnemu/sgsnemu.c      2025-12-03 19:03:41.000000000 
+0100
+++ new/osmo-ggsn-1.15.0/sgsnemu/sgsnemu.c      2026-08-20 12:29:59.000000000 
+0200
@@ -25,6 +25,8 @@
 #include <osmocom/core/msgb.h>
 #include <osmocom/core/select.h>
 
+#include <osmocom/netif/icmpv6.h>
+
 #include <ctype.h>
 #include <netdb.h>
 #include <signal.h>
@@ -178,7 +180,7 @@
 } __attribute__ ((packed));
 
 struct ip6_ping {
-       struct icmpv6_echo_hdr hdr;
+       struct osmo_icmpv6_echo_hdr hdr;
        uint8_t data[CREATEPING_MAX];   /* Data */
 } __attribute__ ((packed));
 
@@ -1265,7 +1267,7 @@
 
 static int cb_gtpu_data_ind_ping6(struct pdp_t *pdp, struct ip6_hdr *ip6h, 
unsigned len)
 {
-       const struct icmpv6_echo_hdr *ic6h = (struct icmpv6_echo_hdr *) 
((uint8_t*)ip6h + sizeof(*ip6h));
+       const struct osmo_icmpv6_echo_hdr *ic6h = (struct osmo_icmpv6_echo_hdr 
*) ((uint8_t *)ip6h + sizeof(*ip6h));
        struct timeval tv;
        struct timeval tp;
        int triptime;
@@ -1285,7 +1287,7 @@
                return 0;
        }
 
-       if (len < sizeof(struct ip6_hdr) + sizeof(struct icmpv6_echo_hdr)) {
+       if (len < sizeof(struct ip6_hdr) + sizeof(struct osmo_icmpv6_echo_hdr)) 
{
                LOGP(DSGSN, LOGL_ERROR, "Packet len too small to contain ICMPv6 
echo header (%d)\n", len);
                return 0;
        }
@@ -1305,7 +1307,7 @@
                       inet_ntop(AF_INET6, &ip6h->ip6_src, straddr, 
sizeof(straddr)),
                       ntohs(ic6h->seq));
 
-       if (len >= sizeof(struct ip6_hdr) + sizeof(struct icmpv6_echo_hdr) + 
sizeof(struct timeval)) {
+       if (len >= sizeof(struct ip6_hdr) + sizeof(struct osmo_icmpv6_echo_hdr) 
+ sizeof(struct timeval)) {
                gettimeofday(&tv, NULL);
                memcpy(&tp, ic6h->data, sizeof(struct timeval));
                if ((tv.tv_usec -= tp.tv_usec) < 0) {
@@ -1441,7 +1443,7 @@
 
        struct msgb *msg = msgb_alloc_headroom(sizeof(struct ip6_ping) + 
128,128, "ICMPv6 echo");
        OSMO_ASSERT(msg);
-       pack = (struct ip6_ping *) msgb_put(msg, sizeof(struct icmpv6_echo_hdr) 
+ datasize);
+       pack = (struct ip6_ping *) msgb_put(msg, sizeof(struct 
osmo_icmpv6_echo_hdr) + datasize);
        pack->hdr.hdr.type = 128;
        pack->hdr.hdr.code = 0;
        pack->hdr.hdr.csum = 0;  /* updated below */
@@ -1457,7 +1459,7 @@
                gettimeofday(tp, &tz);
        }
 
-       pack->hdr.hdr.csum = icmpv6_prepend_ip6hdr(msg, &src->v6, &dst->v6);
+       pack->hdr.hdr.csum = osmo_icmpv6_prepend_ip6hdr(msg, &src->v6, 
&dst->v6);
 
        ntransmitted++;
        return gtp_data_req(gsn, pdp, msgb_data(msg), msgb_length(msg));
@@ -1682,7 +1684,7 @@
                        return EOF;     /* Not a valid IP address */
                }
                SYS_ERR(DSGSN, LOGL_INFO, 0, "Sending ICMPv6 Router Soliciation 
to GGSN...");
-               msg = icmpv6_construct_rs(saddr6);
+               msg = osmo_icmpv6_construct_rs(saddr6);
                gtp_data_req(gsn, ctx->pdp, msgb_data(msg), msgb_length(msg));
                msgb_free(msg);
        }
@@ -1748,11 +1750,12 @@
        }
 }
 
-static void handle_router_adv(struct pdp_t *pdp, struct ip6_hdr *ip6h, struct 
icmpv6_radv_hdr *ra, size_t ra_len)
+static void handle_router_adv(struct pdp_t *pdp, struct ip6_hdr *ip6h,
+                             struct osmo_icmpv6_radv_hdr *ra, size_t ra_len)
 {
        struct pdp_peer_sgsnemu_ctx* ctx = (struct 
pdp_peer_sgsnemu_ctx*)pdp->peer[0];
-       struct icmpv6_opt_hdr *opt_hdr;
-       struct icmpv6_opt_prefix *opt_prefix;
+       struct osmo_icmpv6_opt_hdr *opt_hdr;
+       struct osmo_icmpv6_opt_prefix *opt_prefix;
        int rc;
        sigset_t oldmask;
        struct in6_addr rm;
@@ -1763,7 +1766,7 @@
 
        foreach_icmpv6_opt(ra, ra_len, opt_hdr) {
                if (opt_hdr->type == ICMPv6_OPT_TYPE_PREFIX_INFO) {
-                       opt_prefix = (struct icmpv6_opt_prefix *)opt_hdr;
+                       opt_prefix = (struct osmo_icmpv6_opt_prefix *)opt_hdr;
                        size_t prefix_len_bytes = (opt_prefix->prefix_len + 
7)/8;
                        SYS_ERR(DSGSN, LOGL_INFO, 0, "Parsing OPT Prefix info 
(prefix_len=%u): %s",
                                opt_prefix->prefix_len,
@@ -1821,10 +1824,10 @@
 static int cb_gtpu_data_ind(struct pdp_t *pdp, void *pack, unsigned len)
 {
        struct iphdr *iph = (struct iphdr *)pack;
-       struct icmpv6_radv_hdr *ra;
+       struct osmo_icmpv6_radv_hdr *ra;
        switch (iph->version) {
        case 6:
-               if ((ra = icmpv6_validate_router_adv(pack, len))) {
+               if ((ra = osmo_icmpv6_validate_router_adv(pack, len))) {
                        size_t ra_len = (uint8_t*)ra - (uint8_t*)pack;
                        handle_router_adv(pdp, (struct ip6_hdr *)pack, ra, 
ra_len);
                        return 0;

++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.OnS3u9/_old  2026-08-26 19:53:26.454143003 +0200
+++ /var/tmp/diff_new_pack.OnS3u9/_new  2026-08-26 19:53:26.465143391 +0200
@@ -1,5 +1,5 @@
-mtime: 1773525791
-commit: a18d76c6c6bcc25a6109cd6c976b0c2653ab3cc12562903e359d2ac9f8d9c08e
+mtime: 1787681379
+commit: b65dde2186122cba928a48cdff70cadc24d20fcb1a71b10d2756890341fedc10
 url: https://src.opensuse.org/jengelh/osmo-ggsn
 revision: master
 

++++++ build-fixes.diff ++++++
--- /var/tmp/diff_new_pack.OnS3u9/_old  2026-08-26 19:53:26.501144663 +0200
+++ /var/tmp/diff_new_pack.OnS3u9/_new  2026-08-26 19:53:26.511145016 +0200
@@ -9,39 +9,50 @@
 * remove AC_PROG_CXX, the C++ is never used
 
 ---
- ggsn/Makefile.am      |   15 +++++----------
+ ggsn/Makefile.am      |   16 +++++++++-------
  gtp/Makefile.am       |    5 +----
- lib/Makefile.am       |   12 +++++-------
+ lib/Makefile.am       |   16 +++++++++-------
  lib/gtp-kernel.c      |    1 +
- sgsnemu/Makefile.am   |   13 +++++--------
+ sgsnemu/Makefile.am   |   14 ++++++++------
  tests/gtp/Makefile.am |    2 +-
  tests/lib/Makefile.am |    4 ++--
- 7 files changed, 20 insertions(+), 32 deletions(-)
+ 7 files changed, 31 insertions(+), 27 deletions(-)
 
-Index: osmo-ggsn-1.14.0/ggsn/Makefile.am
+Index: osmo-ggsn-1.15.0/ggsn/Makefile.am
 ===================================================================
---- osmo-ggsn-1.14.0.orig/ggsn/Makefile.am
-+++ osmo-ggsn-1.14.0/ggsn/Makefile.am
-@@ -1,24 +1,19 @@
+--- osmo-ggsn-1.15.0.orig/ggsn/Makefile.am
++++ osmo-ggsn-1.15.0/ggsn/Makefile.am
+@@ -1,11 +1,9 @@
 -bin_PROGRAMS = osmo-ggsn
 +sbin_PROGRAMS = osmo-ggsn
  
  AM_LDFLAGS = @EXEC_LDFLAGS@
  
-+AM_CPPFLAGS = -D_GNU_SOURCE -DSBINDIR='"$(sbindir)"' -I$(top_srcdir)/include 
$(LIBOSMOCORE_CFLAGS) $(LIBOSMOCTRL_CFLAGS) $(LIBOSMOVTY_CFLAGS)
- AM_CFLAGS = \
--          -D_GNU_SOURCE \
-           -fno-builtin \
-           -Wall \
--          -DSBINDIR='"$(sbindir)"' \
--          -I$(top_srcdir)/include \
--          $(LIBOSMOCORE_CFLAGS) \
--          $(LIBOSMOCTRL_CFLAGS) \
--          $(LIBOSMOVTY_CFLAGS) \
+-AM_CFLAGS = \
++AM_CPPFLAGS = \
+           -D_GNU_SOURCE \
+-          -fno-builtin \
+-          -Wall \
+           -DSBINDIR='"$(sbindir)"' \
+           -I$(top_srcdir)/include \
+           $(LIBOSMOCORE_CFLAGS) \
+@@ -14,9 +12,13 @@ AM_CFLAGS = \
+           $(LIBOSMONETIF_CFLAGS) \
            $(NULL)
  
--osmo_ggsn_LDADD = @EXEC_LDADD@ -lgtp -L../gtp ../lib/libmisc.a 
$(LIBOSMOCORE_LIBS) $(LIBOSMOCTRL_LIBS) $(LIBOSMOVTY_LIBS)
-+osmo_ggsn_LDADD = @EXEC_LDADD@ ../gtp/libgtp.la ../lib/libmisc.la 
$(LIBOSMOCORE_LIBS) $(LIBOSMOCTRL_LIBS) $(LIBOSMOVTY_LIBS)
++AM_CFLAGS =
++          -fno-builtin \
++          -Wall
++
+ osmo_ggsn_LDADD = \
+       @EXEC_LDADD@ \
+-      -lgtp -L../gtp ../lib/libmisc.a \
++      -lgtp -L../gtp ../lib/libmisc.la \
+       $(LIBOSMOCORE_LIBS) \
+       $(LIBOSMOCTRL_LIBS) \
+       $(LIBOSMOVTY_LIBS) \
+@@ -24,9 +26,9 @@ osmo_ggsn_LDADD = \
+       $(NULL)
  
  if ENABLE_GTP_KERNEL
 -AM_CFLAGS += -DGTP_KERNEL $(LIBGTPNL_CFLAGS)
@@ -52,11 +63,11 @@
 -osmo_ggsn_DEPENDENCIES = ../gtp/libgtp.la ../lib/libmisc.a
 +osmo_ggsn_DEPENDENCIES = ../gtp/libgtp.la ../lib/libmisc.la
  osmo_ggsn_SOURCES = ggsn_main.c ggsn_vty.c ggsn.c ggsn.h sgsn.c sgsn.h pco.c 
pco.h
-Index: osmo-ggsn-1.14.0/gtp/Makefile.am
+Index: osmo-ggsn-1.15.0/gtp/Makefile.am
 ===================================================================
---- osmo-ggsn-1.14.0.orig/gtp/Makefile.am
-+++ osmo-ggsn-1.14.0/gtp/Makefile.am
-@@ -6,13 +6,10 @@ LIBVERSION=12:0:1
+--- osmo-ggsn-1.15.0.orig/gtp/Makefile.am
++++ osmo-ggsn-1.15.0/gtp/Makefile.am
+@@ -6,13 +6,10 @@ LIBVERSION=12:1:1
  
  lib_LTLIBRARIES = libgtp.la
  
@@ -71,35 +82,40 @@
            $(NULL)
  
  libgtp_la_SOURCES = \
-Index: osmo-ggsn-1.14.0/lib/Makefile.am
+Index: osmo-ggsn-1.15.0/lib/Makefile.am
 ===================================================================
---- osmo-ggsn-1.14.0.orig/lib/Makefile.am
-+++ osmo-ggsn-1.14.0/lib/Makefile.am
+--- osmo-ggsn-1.15.0.orig/lib/Makefile.am
++++ osmo-ggsn-1.15.0/lib/Makefile.am
 @@ -1,4 +1,4 @@
 -noinst_LIBRARIES = libmisc.a
 +noinst_LTLIBRARIES = libmisc.la
  
  noinst_HEADERS = \
-                checksum.h \
-@@ -15,15 +15,13 @@ noinst_HEADERS = \
+                gnugetopt.h \
+@@ -14,16 +14,18 @@ noinst_HEADERS = \
                 util.h \
                 $(NULL)
  
-+AM_CPPFLAGS = -DSBINDIR='"$(sbindir)"' -I$(top_srcdir)/include 
$(LIBOSMOCORE_CFLAGS)
- AM_CFLAGS = \
-           -fno-builtin \
-           -Wall \
--          -DSBINDIR='"$(sbindir)"' \
--          -I$(top_srcdir)/include \
--          $(LIBOSMOCORE_CFLAGS) \
+-AM_CFLAGS = \
+-          -fno-builtin \
+-          -Wall \
++AM_CPPFLAGS = \
+           -DSBINDIR='"$(sbindir)"' \
+           -I$(top_srcdir)/include \
+           $(LIBOSMOCORE_CFLAGS) \
+           $(LIBOSMONETIF_CFLAGS) \
            $(NULL)
  
 -libmisc_a_SOURCES = \
++AM_CFLAGS = \
++          -fno-builtin \
++          -Wall
++
 +libmisc_la_SOURCES = \
-                   checksum.c \
                    debug.c \
                    getopt.c \
-@@ -39,6 +37,6 @@ libmisc_a_SOURCES = \
+                   getopt1.c \
+@@ -38,6 +40,6 @@ libmisc_a_SOURCES = \
                    $(NULL)
  
  if ENABLE_GTP_KERNEL
@@ -108,10 +124,10 @@
 +AM_CPPFLAGS += -DGTP_KERNEL $(LIBGTPNL_CFLAGS)
 +libmisc_la_SOURCES += gtp-kernel.c
  endif
-Index: osmo-ggsn-1.14.0/lib/gtp-kernel.c
+Index: osmo-ggsn-1.15.0/lib/gtp-kernel.c
 ===================================================================
---- osmo-ggsn-1.14.0.orig/lib/gtp-kernel.c
-+++ osmo-ggsn-1.14.0/lib/gtp-kernel.c
+--- osmo-ggsn-1.15.0.orig/lib/gtp-kernel.c
++++ osmo-ggsn-1.15.0/lib/gtp-kernel.c
 @@ -54,6 +54,7 @@ static void pdp_debug(const char *prefix
                buf4, buf6, inet_ntoa(ia));
  }
@@ -120,28 +136,36 @@
  static struct {
        int                     genl_id;
        struct mnl_socket       *nl;
-Index: osmo-ggsn-1.14.0/sgsnemu/Makefile.am
+Index: osmo-ggsn-1.15.0/sgsnemu/Makefile.am
 ===================================================================
---- osmo-ggsn-1.14.0.orig/sgsnemu/Makefile.am
-+++ osmo-ggsn-1.14.0/sgsnemu/Makefile.am
-@@ -1,25 +1,22 @@
--bin_PROGRAMS = sgsnemu
-+sbin_PROGRAMS = sgsnemu
+--- osmo-ggsn-1.15.0.orig/sgsnemu/Makefile.am
++++ osmo-ggsn-1.15.0/sgsnemu/Makefile.am
+@@ -2,30 +2,32 @@ bin_PROGRAMS = sgsnemu
  
  AM_LDFLAGS = @EXEC_LDFLAGS@
  
-+AM_CPPFLAGS = -D_GNU_SOURCE -DSBINDIR='"$(sbindir)"' -I$(top_srcdir)/include 
$(LIBOSMOCORE_CFLAGS)
- AM_CFLAGS = \
--          -D_GNU_SOURCE \
-           -fno-builtin \
-           -Wall \
--          -DSBINDIR='"$(sbindir)"' \
--          -I$(top_srcdir)/include \
--          $(LIBOSMOCORE_CFLAGS) \
+-AM_CFLAGS = \
++AM_CPPFLAGS = \
+           -D_GNU_SOURCE \
+-          -fno-builtin \
+-          -Wall \
+           -DSBINDIR='"$(sbindir)"' \
+           -I$(top_srcdir)/include \
+           $(LIBOSMOCORE_CFLAGS) \
+           $(LIBOSMONETIF_CFLAGS) \
            $(NULL)
  
--sgsnemu_LDADD = @EXEC_LDADD@ -lgtp -L../gtp ../lib/libmisc.a 
$(LIBOSMOCORE_LIBS)
-+sgsnemu_LDADD = @EXEC_LDADD@ ../gtp/libgtp.la ../lib/libmisc.la 
$(LIBOSMOCORE_LIBS)
++AM_CFLAGS =
++          -fno-builtin \
++          -Wall
++
+ sgsnemu_LDADD = \
+       @EXEC_LDADD@ \
+-      -lgtp -L../gtp ../lib/libmisc.a \
++      -lgtp -L../gtp ../lib/libmisc.la \
+       $(LIBOSMOCORE_LIBS) \
+       $(LIBOSMONETIF_LIBS) \
+       $(NULL)
  
  if ENABLE_GTP_KERNEL
 -AM_CFLAGS += \
@@ -155,10 +179,10 @@
 -sgsnemu_DEPENDENCIES = ../gtp/libgtp.la ../lib/libmisc.a
 +sgsnemu_DEPENDENCIES = ../gtp/libgtp.la ../lib/libmisc.la
  sgsnemu_SOURCES = sgsnemu.c cmdline.c cmdline.h
-Index: osmo-ggsn-1.14.0/tests/gtp/Makefile.am
+Index: osmo-ggsn-1.15.0/tests/gtp/Makefile.am
 ===================================================================
---- osmo-ggsn-1.14.0.orig/tests/gtp/Makefile.am
-+++ osmo-ggsn-1.14.0/tests/gtp/Makefile.am
+--- osmo-ggsn-1.15.0.orig/tests/gtp/Makefile.am
++++ osmo-ggsn-1.15.0/tests/gtp/Makefile.am
 @@ -24,7 +24,7 @@ queue_test_SOURCES = \
        $(NULL)
  
@@ -168,10 +192,10 @@
        $(top_builddir)/gtp/libgtp.la \
        $(LIBOSMOCORE_LIBS) \
        $(NULL)
-Index: osmo-ggsn-1.14.0/tests/lib/Makefile.am
+Index: osmo-ggsn-1.15.0/tests/lib/Makefile.am
 ===================================================================
---- osmo-ggsn-1.14.0.orig/tests/lib/Makefile.am
-+++ osmo-ggsn-1.14.0/tests/lib/Makefile.am
+--- osmo-ggsn-1.15.0.orig/tests/lib/Makefile.am
++++ osmo-ggsn-1.15.0/tests/lib/Makefile.am
 @@ -19,7 +19,7 @@ ippool_test_SOURCES = \
        $(NULL)
  

++++++ build.specials.obscpio ++++++

++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore      2026-08-25 20:09:39.000000000 +0200
@@ -0,0 +1 @@
+.osc

Reply via email to