This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
dexter gerrit-no-reply at lists.osmocom.org
Review at https://gerrit.osmocom.org/635
Modifed version of slhc
Change-Id: I7a638e88a43b3eb9d006751a03ef2570e36613f0
---
M openbsc/include/openbsc/debug.h
R openbsc/include/openbsc/slhc.h
M openbsc/src/gprs/Makefile.am
M openbsc/src/gprs/slhc.c
4 files changed, 127 insertions(+), 176 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/openbsc refs/changes/35/635/1
diff --git a/openbsc/include/openbsc/debug.h b/openbsc/include/openbsc/debug.h
index 43ebb19..90ddca5 100644
--- a/openbsc/include/openbsc/debug.h
+++ b/openbsc/include/openbsc/debug.h
@@ -29,6 +29,7 @@
DBSSGP,
DLLC,
DSNDCP,
+ DSLHC,
DNAT,
DCTRL,
DSMPP,
diff --git a/openbsc/include/openbsc/slhc_vj.h b/openbsc/include/openbsc/slhc.h
similarity index 89%
rename from openbsc/include/openbsc/slhc_vj.h
rename to openbsc/include/openbsc/slhc.h
index 0a85dc0..2e926dd 100644
--- a/openbsc/include/openbsc/slhc_vj.h
+++ b/openbsc/include/openbsc/slhc.h
@@ -80,7 +80,6 @@
* means "IP packet".
*/
-
#include <linux/ip.h>
#include <linux/tcp.h>
@@ -109,7 +108,7 @@
* data type and sizes conversion assumptions:
*
* VJ code KA9Q style generic
- * u_char byte_t unsigned char 8 bits
+ * u_char byte_t uint8_t 8 bits
* u_short int16 unsigned short 16 bits
* u_int int16 unsigned short 16 bits
* u_long unsigned long unsigned long 32 bits
@@ -130,8 +129,8 @@
struct cstate *next; /* next in ring (xmit) */
struct iphdr cs_ip; /* ip/tcp hdr from most recent packet */
struct tcphdr cs_tcp;
- unsigned char cs_ipopt[64];
- unsigned char cs_tcpopt[64];
+ uint8_t cs_ipopt[64];
+ uint8_t cs_tcpopt[64];
int cs_hsize;
};
#define NULLSLSTATE (struct cstate *)0
@@ -173,19 +172,16 @@
#define __ARGS(x) x
/* In slhc.c: */
-struct slcompress *slhc_init __ARGS((int rslots, int tslots));
-void slhc_free __ARGS((struct slcompress *comp));
+struct slcompress *slhc_init(int rslots, int tslots);
-int slhc_compress __ARGS((struct slcompress *comp, unsigned char *icp,
- int isize, unsigned char *ocp, unsigned char **cpp,
- int compress_cid));
-int slhc_uncompress __ARGS((struct slcompress *comp, unsigned char *icp,
- int isize));
-int slhc_remember __ARGS((struct slcompress *comp, unsigned char *icp,
- int isize));
-int slhc_toss __ARGS((struct slcompress *comp));
+void slhc_free(struct slcompress *comp);
-void slhc_i_status __ARGS((struct slcompress *comp));
-void slhc_o_status __ARGS((struct slcompress *comp));
+int slhc_compress(struct slcompress *comp, uint8_t *icp, int isize, uint8_t *ocp, uint8_t **cpp, int compress_cid);
+int slhc_uncompress(struct slcompress *comp, uint8_t *icp, int isize);
+int slhc_remember(struct slcompress *comp, uint8_t *icp, int isize);
+int slhc_toss(struct slcompress *comp);
+
+void slhc_i_status(struct slcompress *comp);
+void slhc_o_status(struct slcompress *comp);
#endif /* _SLHC_H */
diff --git a/openbsc/src/gprs/Makefile.am b/openbsc/src/gprs/Makefile.am
index 6dc7e16..548b38c 100644
--- a/openbsc/src/gprs/Makefile.am
+++ b/openbsc/src/gprs/Makefile.am
@@ -23,6 +23,7 @@
$(OSMO_LIBS) $(LIBCRYPTO_LIBS) -lrt
osmo_sgsn_SOURCES = gprs_gmm.c gprs_sgsn.c gprs_sndcp.c gprs_sndcp_vty.c \
+ slhc.c \
sgsn_main.c sgsn_vty.c sgsn_libgtp.c \
gprs_llc.c gprs_llc_parse.c gprs_llc_vty.c crc24.c \
sgsn_ctrl.c sgsn_auth.c gprs_subscriber.c \
diff --git a/openbsc/src/gprs/slhc.c b/openbsc/src/gprs/slhc.c
index b1a855c..b201ddb 100644
--- a/openbsc/src/gprs/slhc.c
+++ b/openbsc/src/gprs/slhc.c
@@ -50,62 +50,71 @@
* driver code belonging close to PPP and SLIP
*/
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <net/slhc_vj.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdint.h>
+#include <arpa/inet.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/core/talloc.h>
+#include <openbsc/slhc.h>
+#include <openbsc/debug.h>
-#ifdef CONFIG_INET
-/* Entire module is for IP only */
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/socket.h>
-#include <linux/sockios.h>
-#include <linux/termios.h>
-#include <linux/in.h>
-#include <linux/fcntl.h>
-#include <linux/inet.h>
-#include <linux/netdevice.h>
-#include <net/ip.h>
-#include <net/protocol.h>
-#include <net/icmp.h>
-#include <net/tcp.h>
-#include <linux/skbuff.h>
-#include <net/sock.h>
-#include <linux/timer.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <net/checksum.h>
-#include <asm/unaligned.h>
+static uint8_t *encode(uint8_t *cp, uint16_t n);
+static long decode(uint8_t **cpp);
+static uint8_t * put16(uint8_t *cp, uint16_t x);
+static uint16_t pull16(uint8_t **cpp);
-static unsigned char *encode(unsigned char *cp, unsigned short n);
-static long decode(unsigned char **cpp);
-static unsigned char * put16(unsigned char *cp, unsigned short x);
-static unsigned short pull16(unsigned char **cpp);
+
+/* Replacement for kernel space function ip_fast_csum() */
+static uint16_t ip_fast_csum(uint8_t *iph, int ihl)
+{
+ int i;
+ uint16_t temp;
+ uint32_t accumulator = 0xFFFF;
+
+ for(i=0;i<ihl*2;i++)
+ {
+ temp = ((*iph) << 8)&0xFF00;
+ iph++;
+ temp |= (*iph)&0xFF;
+ iph++;
+
+ accumulator+=temp;
+ if(accumulator>0xFFFF)
+ {
+ accumulator++;
+ accumulator&=0xFFFF;
+ }
+ }
+
+ return (uint16_t)(htons(~accumulator)&0xFFFF);
+}
+
+/* Replacement for kernel space function put_unaligned() */
+static void put_unaligned(uint16_t val, void *ptr)
+{
+ memcpy(ptr,&val,sizeof(val));
+}
+
/* Initialize compression data structure
* slots must be in range 0 to 255 (zero meaning no compression)
*/
-struct slcompress *
-slhc_init(int rslots, int tslots)
+struct slcompress *slhc_init(int rslots, int tslots)
{
register short i;
register struct cstate *ts;
struct slcompress *comp;
- MOD_INC_USE_COUNT;
- comp = (struct slcompress *)kmalloc(sizeof(struct slcompress),
- GFP_KERNEL);
+ comp = (struct slcompress *)talloc_zero_size(NULL,sizeof(struct slcompress));
if (! comp)
goto out_fail;
memset(comp, 0, sizeof(struct slcompress));
if ( rslots > 0 && rslots < 256 ) {
size_t rsize = rslots * sizeof(struct cstate);
- comp->rstate = (struct cstate *) kmalloc(rsize, GFP_KERNEL);
+ comp->rstate = (struct cstate *) talloc_zero_size(NULL, rsize);
if (! comp->rstate)
goto out_free;
memset(comp->rstate, 0, rsize);
@@ -114,7 +123,7 @@
if ( tslots > 0 && tslots < 256 ) {
size_t tsize = tslots * sizeof(struct cstate);
- comp->tstate = (struct cstate *) kmalloc(tsize, GFP_KERNEL);
+ comp->tstate = (struct cstate *) talloc_zero_size(NULL, tsize);
if (! comp->tstate)
goto out_free2;
memset(comp->tstate, 0, tsize);
@@ -144,36 +153,34 @@
return comp;
out_free2:
- kfree((unsigned char *)comp->rstate);
+ talloc_free((uint8_t *)comp->rstate);
out_free:
- kfree((unsigned char *)comp);
+ talloc_free((uint8_t *)comp);
out_fail:
- MOD_DEC_USE_COUNT;
+
+
return NULL;
}
-
/* Free a compression data structure */
-void
-slhc_free(struct slcompress *comp)
+void slhc_free(struct slcompress *comp)
{
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_free(): Freeing compression states...\n");
+
if ( comp == NULLSLCOMPR )
return;
if ( comp->tstate != NULLSLSTATE )
- kfree( comp->tstate );
+ talloc_free(comp->tstate );
if ( comp->rstate != NULLSLSTATE )
- kfree( comp->rstate );
+ talloc_free( comp->rstate );
- kfree( comp );
- MOD_DEC_USE_COUNT;
+ talloc_free( comp );
}
-
/* Put a short in host order into a char array in network order */
-static inline unsigned char *
-put16(unsigned char *cp, unsigned short x)
+static inline uint8_t *put16(uint8_t *cp, uint16_t x)
{
*cp++ = x >> 8;
*cp++ = x;
@@ -183,8 +190,7 @@
/* Encode a number */
-unsigned char *
-encode(unsigned char *cp, unsigned short n)
+uint8_t *encode(uint8_t *cp, uint16_t n)
{
if(n >= 256 || n == 0){
*cp++ = 0;
@@ -196,8 +202,7 @@
}
/* Pull a 16-bit integer in host order from buffer in network byte order */
-static unsigned short
-pull16(unsigned char **cpp)
+static uint16_t pull16(uint8_t **cpp)
{
short rval;
@@ -208,8 +213,7 @@
}
/* Decode a number */
-long
-decode(unsigned char **cpp)
+long decode(uint8_t **cpp)
{
register int x;
@@ -228,9 +232,7 @@
* change it to ocp.
*/
-int
-slhc_compress(struct slcompress *comp, unsigned char *icp, int isize,
- unsigned char *ocp, unsigned char **cpp, int compress_cid)
+int slhc_compress(struct slcompress *comp, uint8_t *icp, int isize, uint8_t *ocp, uint8_t **cpp, int compress_cid)
{
register struct cstate *ocs = &(comp->tstate[comp->xmit_oldest]);
register struct cstate *lcs = ocs;
@@ -238,11 +240,10 @@
register unsigned long deltaS, deltaA;
register short changes = 0;
int hlen;
- unsigned char new_seq[16];
- register unsigned char *cp = new_seq;
+ uint8_t new_seq[16];
+ register uint8_t *cp = new_seq;
struct iphdr *ip;
struct tcphdr *th, *oth;
-
/*
* Don't play with runt packets.
@@ -260,11 +261,12 @@
comp->sls_o_nontcp++;
else
comp->sls_o_tcp++;
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_compress(): Not a TCP packat, will not touch...\n");
return isize;
}
- /* Extract TCP header */
- th = (struct tcphdr *)(((unsigned char *)ip) + ip->ihl*4);
+ /* Extract TCP header */
+ th = (struct tcphdr *)(((uint8_t *)ip) + ip->ihl*4);
hlen = ip->ihl*4 + th->doff*4;
/* Bail if the TCP packet isn't `compressible' (i.e., ACK isn't set or
@@ -275,8 +277,10 @@
! (th->ack)){
/* TCP connection stuff; send as regular IP */
comp->sls_o_tcp++;
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_compress(): Packet is part of a TCP connection, will not touch...\n");
return isize;
}
+
/*
* Packet is compressible -- we're going to send either a
* COMPRESSED_TCP or UNCOMPRESSED_TCP packet. Either way,
@@ -291,6 +295,9 @@
* states via linear search. If we don't find a state
* for the datagram, the oldest state is (re-)used.
*/
+
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_compress(): Compressible packet detected!\n");
+
for ( ; ; ) {
if( ip->saddr == cs->cs_ip.saddr
&& ip->daddr == cs->cs_ip.daddr
@@ -314,11 +321,14 @@
* state points to the newest and we only need to set
* xmit_oldest to update the lru linkage.
*/
+
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_compress(): Header not yet seen, will memorize header for the next turn...\n");
comp->sls_o_misses++;
comp->xmit_oldest = lcs->cs_this;
goto uncompressed;
found:
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_compress(): Header already seen, trying to compress...\n");
/*
* Found it -- move to the front on the connection list.
*/
@@ -348,6 +358,7 @@
*/
oth = &cs->cs_tcp;
+
if(ip->version != cs->cs_ip.version || ip->ihl != cs->cs_ip.ihl
|| ip->tos != cs->cs_ip.tos
|| (ip->frag_off & htons(0x4000)) != (cs->cs_ip.frag_off & htons(0x4000))
@@ -355,6 +366,7 @@
|| th->doff != cs->cs_tcp.doff
|| (ip->ihl > 5 && memcmp(ip+1,cs->cs_ipopt,((ip->ihl)-5)*4) != 0)
|| (th->doff > 5 && memcmp(th+1,cs->cs_tcpopt,((th->doff)-5)*4) != 0)){
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_compress(): The header contains unexpected changes, can't compress...\n");
goto uncompressed;
}
@@ -373,6 +385,7 @@
* implementation should never do this but RFC793
* doesn't prohibit the change so we have to deal
* with it. */
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_compress(): URG not set but urp changed, can't compress...\n");
goto uncompressed;
}
if((deltaS = ntohs(th->window) - ntohs(oth->window)) != 0){
@@ -381,13 +394,19 @@
}
if((deltaA = ntohl(th->ack_seq) - ntohl(oth->ack_seq)) != 0L){
if(deltaA > 0x0000ffff)
+ {
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_compress(): (deltaA = ntohl(th->ack_seq) - ntohl(oth->ack_seq)) != 0L, can't compress...\n");
goto uncompressed;
+ }
cp = encode(cp,deltaA);
changes |= NEW_A;
}
if((deltaS = ntohl(th->seq) - ntohl(oth->seq)) != 0L){
if(deltaS > 0x0000ffff)
+ {
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_compress(): (deltaS = ntohl(th->seq) - ntohl(oth->seq)) != 0L, can't compress...\n");
goto uncompressed;
+ }
cp = encode(cp,deltaS);
changes |= NEW_S;
}
@@ -403,6 +422,7 @@
if(ip->tot_len != cs->cs_ip.tot_len &&
ntohs(cs->cs_ip.tot_len) == hlen)
break;
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_compress(): Retransmitted packet detected, can't compress...\n");
goto uncompressed;
break;
case SPECIAL_I:
@@ -410,6 +430,7 @@
/* actual changes match one of our special case encodings --
* send packet uncompressed.
*/
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_compress(): Special case detected, can't compress...\n");
goto uncompressed;
case NEW_S|NEW_A:
if(deltaS == deltaA &&
@@ -438,7 +459,6 @@
* state with this packet's header.
*/
deltaA = ntohs(th->check);
- memcpy(&cs->cs_ip,ip,20);
memcpy(&cs->cs_tcp,th,20);
/* We want to use the original packet as our compressed packet.
* (cp - new_seq) is the number of bytes we need for compressed
@@ -471,6 +491,7 @@
* to use on future compressed packets in the protocol field).
*/
uncompressed:
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_compress(): Packet will be sent uncompressed...\n");
memcpy(&cs->cs_ip,ip,20);
memcpy(&cs->cs_tcp,th,20);
if (ip->ihl > 5)
@@ -487,8 +508,7 @@
}
-int
-slhc_uncompress(struct slcompress *comp, unsigned char *icp, int isize)
+int slhc_uncompress(struct slcompress *comp, uint8_t *icp, int isize)
{
register int changes;
long x;
@@ -496,7 +516,7 @@
register struct iphdr *ip;
register struct cstate *cs;
int len, hdrlen;
- unsigned char *cp = icp;
+ uint8_t *cp = icp;
/* We've got a compressed packet; read the change byte */
comp->sls_i_compressed++;
@@ -544,6 +564,8 @@
switch(changes & SPECIALS_MASK){
case SPECIAL_I: /* Echoed terminal traffic */
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_uncompress(): Echoed terminal traffic detected\n");
+
{
register short i;
i = ntohs(ip->tot_len) - hdrlen;
@@ -553,11 +575,13 @@
break;
case SPECIAL_D: /* Unidirectional data */
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_uncompress(): Unidirectional data detected\n");
thp->seq = htonl( ntohl(thp->seq) +
ntohs(ip->tot_len) - hdrlen);
break;
default:
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_uncompress(): default packet type detected\n");
if(changes & NEW_U){
thp->urg = 1;
if((x = decode(&cp)) == -1) {
@@ -607,6 +631,7 @@
ip->tot_len = htons(len);
ip->check = 0;
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_uncompress(): making space for the reconstructed header...\n");
memmove(icp + hdrlen, cp, len - hdrlen);
cp = icp;
@@ -618,8 +643,7 @@
cp += (ip->ihl - 5) * 4;
}
- put_unaligned(ip_fast_csum(icp, ip->ihl),
- &((struct iphdr *)icp)->check);
+ put_unaligned(ip_fast_csum(icp, ip->ihl), &((struct iphdr *)icp)->check);
memcpy(cp, thp, 20);
cp += 20;
@@ -631,22 +655,24 @@
return len;
bad:
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_uncompress(): bad packet detected!\n");
comp->sls_i_error++;
return slhc_toss( comp );
}
-int
-slhc_remember(struct slcompress *comp, unsigned char *icp, int isize)
+int slhc_remember(struct slcompress *comp, uint8_t *icp, int isize)
{
register struct cstate *cs;
unsigned ihl;
- unsigned char index;
+ uint8_t index;
+ uint16_t checksum;
if(isize < 20) {
/* The packet is shorter than a legal IP header */
comp->sls_i_runt++;
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_remember(): The packet is shorter than a legal IP header ==> slhc_toss()\n");
return slhc_toss( comp );
}
/* Peek at the IP header's IHL field to find its length */
@@ -654,18 +680,23 @@
if(ihl < 20 / 4){
/* The IP header length field is too small */
comp->sls_i_runt++;
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_remember(): The IP header length field is too small ==> slhc_toss()\n");
return slhc_toss( comp );
}
+
index = icp[9];
icp[9] = IPPROTO_TCP;
+ checksum = ip_fast_csum(icp, ihl);
- if (ip_fast_csum(icp, ihl)) {
+ if (checksum) {
/* Bad IP header checksum; discard */
comp->sls_i_badcheck++;
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_remember(): Bad IP header checksum; discard ==> slhc_toss()\n");
return slhc_toss( comp );
}
if(index > comp->rslot_limit) {
comp->sls_i_error++;
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_remember(): index > comp->rslot_limit ==> slhc_toss()\n");
return slhc_toss(comp);
}
@@ -686,10 +717,9 @@
return isize;
}
-
-int
-slhc_toss(struct slcompress *comp)
+int slhc_toss(struct slcompress *comp)
{
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_toss(): Reset compression state...\n");
if ( comp == NULLSLCOMPR )
return 0;
@@ -697,11 +727,10 @@
return 0;
}
-
void slhc_i_status(struct slcompress *comp)
{
if (comp != NULLSLCOMPR) {
- printk("\t%d Cmp, %d Uncmp, %d Bad, %d Tossed\n",
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_i_status(): %d Cmp, %d Uncmp, %d Bad, %d Tossed\n",
comp->sls_i_compressed,
comp->sls_i_uncompressed,
comp->sls_i_error,
@@ -709,92 +738,16 @@
}
}
-
void slhc_o_status(struct slcompress *comp)
{
if (comp != NULLSLCOMPR) {
- printk("\t%d Cmp, %d Uncmp, %d AsIs, %d NotTCP\n",
+ LOGP(DSLHC, LOGL_DEBUG, "slhc_o_status(): %d Cmp, %d Uncmp, %d AsIs, %d NotTCP %d Searches, %d Misses\n",
comp->sls_o_compressed,
comp->sls_o_uncompressed,
comp->sls_o_tcp,
- comp->sls_o_nontcp);
- printk("\t%10d Searches, %10d Misses\n",
+ comp->sls_o_nontcp,
comp->sls_o_searches,
comp->sls_o_misses);
}
}
-/* Should this be surrounded with "#ifdef CONFIG_MODULES" ? */
-/* VJ header compression */
-EXPORT_SYMBOL(slhc_init);
-EXPORT_SYMBOL(slhc_free);
-EXPORT_SYMBOL(slhc_remember);
-EXPORT_SYMBOL(slhc_compress);
-EXPORT_SYMBOL(slhc_uncompress);
-EXPORT_SYMBOL(slhc_toss);
-
-#ifdef MODULE
-
-int init_module(void)
-{
- printk(KERN_INFO "CSLIP: code copyright 1989 Regents of the University of California\n");
- return 0;
-}
-
-void cleanup_module(void)
-{
- return;
-}
-
-#endif /* MODULE */
-#else /* CONFIG_INET */
-
-
-int
-slhc_toss(struct slcompress *comp)
-{
- printk(KERN_DEBUG "Called IP function on non IP-system: slhc_toss");
- return -EINVAL;
-}
-int
-slhc_uncompress(struct slcompress *comp, unsigned char *icp, int isize)
-{
- printk(KERN_DEBUG "Called IP function on non IP-system: slhc_uncompress");
- return -EINVAL;
-}
-int
-slhc_compress(struct slcompress *comp, unsigned char *icp, int isize,
- unsigned char *ocp, unsigned char **cpp, int compress_cid)
-{
- printk(KERN_DEBUG "Called IP function on non IP-system: slhc_compress");
- return -EINVAL;
-}
-
-int
-slhc_remember(struct slcompress *comp, unsigned char *icp, int isize)
-{
- printk(KERN_DEBUG "Called IP function on non IP-system: slhc_remember");
- return -EINVAL;
-}
-
-void
-slhc_free(struct slcompress *comp)
-{
- printk(KERN_DEBUG "Called IP function on non IP-system: slhc_free");
- return;
-}
-struct slcompress *
-slhc_init(int rslots, int tslots)
-{
- printk(KERN_DEBUG "Called IP function on non IP-system: slhc_init");
- return NULL;
-}
-EXPORT_SYMBOL(slhc_init);
-EXPORT_SYMBOL(slhc_free);
-EXPORT_SYMBOL(slhc_remember);
-EXPORT_SYMBOL(slhc_compress);
-EXPORT_SYMBOL(slhc_uncompress);
-EXPORT_SYMBOL(slhc_toss);
-
-#endif /* CONFIG_INET */
-MODULE_LICENSE("Dual BSD/GPL");
--
To view, visit https://gerrit.osmocom.org/635
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I7a638e88a43b3eb9d006751a03ef2570e36613f0
Gerrit-PatchSet: 1
Gerrit-Project: openbsc
Gerrit-Branch: master
Gerrit-Owner: dexter <pmaier at sysmocom.de>