From holger at freyther.de Thu Jun 2 23:20:06 2011 From: holger at freyther.de (Holger Hans Peter Freyther) Date: Fri, 03 Jun 2011 01:20:06 +0200 Subject: [PATCH 00/10] Control interface for OpenBSC In-Reply-To: References: Message-ID: <4DE81AA6.8040509@freyther.de> On 05/20/2011 07:06 PM, Daniel Willmann wrote: > Hello, > Hi all, I plan to merge this over the weekend, so please speak up if there is something that prevents it. There is one thing we need to solve to have this interface evolve. So such a control/stat command is quite good for machine driven interaction and the output is simple/standardized. On the other hand we have the VTY that let's us define a tree of information, add commands, is doing nice range-checking. In general we are using the VTY code for two things, runtime interaction and configuration. I am not sure but for configuration something like the below might be desirable, I am not sure about that yet.... :) | User... | Machine... | |-----------------------|-----------------------| | Telnet | Control interface | |-----------------------|-----------------------| | VTY code (libvty) | ------------------------------------------------- From admin at manateeshome.com Wed Jun 1 01:53:54 2011 From: admin at manateeshome.com (Seungju Kim) Date: Tue, 31 May 2011 21:53:54 -0400 Subject: SGSN Crash In-Reply-To: <6992944E-4A46-4BE6-A7E6-C5D7C9BEA00A@manateeshome.com> References: <3DB73071-417E-409D-8A0E-09F046F79F5E@manateeshome.com> <4DE33E9D.7090308@freyther.de> <20110530070809.GG4532@prithivi.gnumonks.org> <6992944E-4A46-4BE6-A7E6-C5D7C9BEA00A@manateeshome.com> Message-ID: By the way, increasing the headroom size defined in gsm_04_08.h temporarily got around the problem, now my iPhone successfully receives a PDP context. But the sgsn still crashes shortly after. From laforge at gnumonks.org Wed Jun 1 06:52:38 2011 From: laforge at gnumonks.org (Harald Welte) Date: Wed, 1 Jun 2011 08:52:38 +0200 Subject: SGSN Crash In-Reply-To: References: <3DB73071-417E-409D-8A0E-09F046F79F5E@manateeshome.com> <4DE33E9D.7090308@freyther.de> <20110530070809.GG4532@prithivi.gnumonks.org> <6992944E-4A46-4BE6-A7E6-C5D7C9BEA00A@manateeshome.com> Message-ID: <20110601065238.GD24380@prithivi.gnumonks.org> Hi, On Tue, May 31, 2011 at 09:53:54PM -0400, Seungju Kim wrote: > By the way, increasing the headroom size defined in gsm_04_08.h > temporarily got around the problem, now my iPhone successfully > receives a PDP context. But the sgsn still crashes shortly after. we would be more than happy to assist you, if you actually want to debug the problem. But this requires some more diligence than to say "it crashes" on this list. But it would require that you familiarize yourself with how to use gdb, how to generate backtraces and how to generally debug C programs on Linux. Also, eevery bug report should be accomodated with * a pcap file of the Gb and GTP interface of the SGSN with the last few messages before and after the crash * the log output of the SGSN with the related debug options set (at least the MM, depending on the location of the crash possibly LLC, SNDCP, BSSGP and NS subsystems) Regards, Harald -- - Harald Welte http://laforge.gnumonks.org/ ============================================================================ "Privacy in residential applications is a desirable marketing option." (ETSI EN 300 175-7 Ch. A6) From admin at manateeshome.com Thu Jun 9 22:38:54 2011 From: admin at manateeshome.com (Seungju Kim) Date: Thu, 9 Jun 2011 18:38:54 -0400 Subject: SGSN Crash In-Reply-To: <20110530070809.GG4532@prithivi.gnumonks.org> References: <3DB73071-417E-409D-8A0E-09F046F79F5E@manateeshome.com> <4DE33E9D.7090308@freyther.de> <20110530070809.GG4532@prithivi.gnumonks.org> Message-ID: <003001cc26f6$03abe8f0$0b03bad0$@manateeshome.com> I got the log with the proper debug symbols <0016> gprs_bssgp.c:346 BSSGP TLLI=0x7df722cb UPLINK-UNITDATA <0017> gprs_llc.c:428 LLC SAPI=1 C FCS=0xc64079CMD=UI DATA <0017> gprs_llc.c:700 LLC RX: unknown TLLI 0x08x, creating LLME on the fly msgb(0x8094da0): Not enough headroom msgb_push (237 < 245) backtrace() returned 14 addresses /usr/local/lib/libosmocore.so.2(osmo_panic+0x4e) [0xb7fc69de] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x80556aa] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x805117d] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x8049fea] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x804c991] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x80508ef] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x80561c8] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x8053210] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x80537cf] /usr/local/lib/libosmocore.so.2(osmo_select_main+0x1a5) [0xb7fc3675] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x804e4dc] /lib/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0xb7a66c76] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x8049dc1] Program received signal SIGABRT, Aborted. 0xb7fe2424 in __kernel_vsyscall () (gdb) backtrace #0 0xb7fe2424 in __kernel_vsyscall () #1 0xb7a7a751 in raise () from /lib/i686/cmov/libc.so.6 #2 0xb7a7db82 in abort () from /lib/i686/cmov/libc.so.6 #3 0xb7fc69e3 in osmo_panic_default ( fmt=0x805a6b8 "msgb(%p): Not enough headroom msgb_push (%u < %u)\n") at panic.c:42 #4 osmo_panic (fmt=0x805a6b8 "msgb(%p): Not enough headroom msgb_push (%u < %u)\n") at panic.c:64 #5 0x080556aa in msgb_push (msg=0x8094da0, mmctx=0x8093be8) at /usr/local/include/osmocom/core/msgb.h:162 #6 msgb_tvlv_push (msg=0x8094da0, mmctx=0x8093be8) at /usr/local/include/osmocom/gsm/tlv.h:211 #7 gprs_bssgp_tx_dl_ud (msg=0x8094da0, mmctx=0x8093be8) at gprs_bssgp.c:772 #8 0x0805117d in gprs_llc_tx_ui (msg=0x8094da0, sapi=1 '\001', command=1, mmctx=0x8093be8) at gprs_llc.c:421 #9 0x08049fea in gsm48_gmm_sendmsg (msg=0x8094da0, command=1, mm=0x8093be8) at gprs_gmm.c:240 #10 0x0804c991 in gsm48_rx_gmm_att_req (msg=0x80928c8, llme=0x8093390) at gprs_gmm.c:748 #11 gsm0408_rcv_gmm (msg=0x80928c8, llme=0x8093390) at gprs_gmm.c:1003 #12 gsm0408_gprs_rcvmsg (msg=0x80928c8, llme=0x8093390) at gprs_gmm.c:1527 #13 0x080508ef in gprs_llc_rcvmsg (msg=0x80928c8, tv=0xbfffd75c) at gprs_llc.c:767 #14 0x080561c8 in bssgp_rx_ul_ud (msg=0x80928c8) at gprs_bssgp.c:360 #15 gprs_bssgp_rx_ptp (msg=0x80928c8) at gprs_bssgp.c:501 ---Type to continue, or q to quit--- #16 gprs_bssgp_rcvmsg (msg=0x80928c8) at gprs_bssgp.c:698 #17 0x08053210 in gprs_ns_rx_unitdata (nsi=0x8081eb8, msg=0x80928c8, saddr=0xbffff01c, ll=GPRS_NS_LL_UDP) at gprs_ns.c:557 #18 gprs_ns_rcvmsg (nsi=0x8081eb8, msg=0x80928c8, saddr=0xbffff01c, ll=GPRS_NS_LL_UDP) at gprs_ns.c:773 #19 0x080537cf in handle_nsip_read (bfd=0x8081ed8, what=1) at gprs_ns.c:903 #20 nsip_fd_cb (bfd=0x8081ed8, what=1) at gprs_ns.c:936 #21 0xb7fc3675 in osmo_select_main (polling=0) at select.c:132 #22 0x0804e4dc in main (argc=1, argv=0xbffff4a4) at sgsn_main.c:279 By the way, when I changed GSM48_ALLOC_HEADROOM from 256 to 512, I could bypsss the error but I got a new error when a packet is sent to the mobile phone <0016> gprs_bssgp.c:346 BSSGP TLLI=0xed91af48 UPLINK-UNITDATA <0017> gprs_llc.c:428 LLC SAPI=3 C FCS=0x7e7a46CMD=UI DATA <0014> sgsn_libgtp.c:421 GTP DATA IND from GGSN, length=249 msgb(0x8094300): Not enough headroom msgb_push (104 < 245) backtrace() returned 12 addresses /usr/local/lib/libosmocore.so.2(osmo_panic+0x4e) [0xb7fc69de] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x80556aa] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x805117d] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x804e024] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x804f4cb] /usr/local/lib/libgtp.so.0(gtp_gpdu_ind+0x9c) [0xb7bcd5ec] /usr/local/lib/libgtp.so.0(gtp_decaps1u+0x50c) [0xb7bd062c] /usr/local/lib/libosmocore.so.2(osmo_select_main+0x1a5) [0xb7fc3675] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x804e4dc] /lib/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0xb7a66c76] /home/manatails/gsm/openbsc/openbsc/src/gprs/osmo-sgsn() [0x8049dc1] Program received signal SIGABRT, Aborted. 0xb7fe2424 in __kernel_vsyscall () (gdb) backtrace #0 0xb7fe2424 in __kernel_vsyscall () #1 0xb7a7a751 in raise () from /lib/i686/cmov/libc.so.6 #2 0xb7a7db82 in abort () from /lib/i686/cmov/libc.so.6 #3 0xb7fc69e3 in osmo_panic_default ( fmt=0x805a6b8 "msgb(%p): Not enough headroom msgb_push (%u < %u)\n") at panic.c:42 #4 osmo_panic (fmt=0x805a6b8 "msgb(%p): Not enough headroom msgb_push (%u < %u)\n") at panic.c:64 #5 0x080556aa in msgb_push (msg=0x8094300, mmctx=0x8093be8) at /usr/local/include/osmocom/core/msgb.h:162 #6 msgb_tvlv_push (msg=0x8094300, mmctx=0x8093be8) at /usr/local/include/osmocom/gsm/tlv.h:211 #7 gprs_bssgp_tx_dl_ud (msg=0x8094300, mmctx=0x8093be8) at gprs_bssgp.c:772 #8 0x0805117d in gprs_llc_tx_ui (msg=0x8094300, sapi=3 '\003', command=0, mmctx=0x8093be8) at gprs_llc.c:421 #9 0x0804e024 in sndcp_unitdata_req (msg=0x8094300, lle=0x8093534, nsapi=5 '\005', mmcontext=0x8093be8) at gprs_sndcp.c:500 #10 0x0804f4cb in cb_data_ind (lib=0xb7bd72a0, packet=0xbfffd024, len=249) at sgsn_libgtp.c:467 #11 0xb7bcd5ec in gtp_gpdu_ind (gsn=0x80921b8, version=1, peer=0xbffff01c, fd=9, pack=0xbfffd018, len=261) at gtp.c:2558 #12 0xb7bd062c in gtp_decaps1u (gsn=0x80921b8) at gtp.c:2971 #13 0xb7fc3675 in osmo_select_main (polling=0) at select.c:132 #14 0x0804e4dc in main (argc=1, argv=0xbffff4a4) at sgsn_main.c:279 -----Original Message----- From: openbsc-bounces at lists.osmocom.org [mailto:openbsc-bounces at lists.osmocom.org] On Behalf Of Harald Welte Sent: Monday, May 30, 2011 3:08 AM To: Holger Hans Peter Freyther Cc: openbsc at lists.osmocom.org Subject: Re: SGSN Crash Hi all, On Mon, May 30, 2011 at 08:52:13AM +0200, Holger Hans Peter Freyther wrote: > please make yourself gdb and git and create a patch. The struct msgb > has detected a mis-use and forced a crash. What is going wrong is in > the log, you will need to identify where this msgb got allocated (or > change the panic message to print the name of the msgb) and see why it > is using the amount of headroom it wants to use. I am quite certain it is the "MS Radio Access Capabilities IE" which for some reason seems to be _very_ large in this case. I've seen this before, but never was able to hunt it down. Everything seemed like it was _really_ that long. But it's more likely that we do something wrong while parsing it in GMM when the phone sends it. The SGSN saves this IE in its MM contaxt for the phone, and it will transmit it to the BTS in every BSSGP message. -- - Harald Welte http://laforge.gnumonks.org/ ============================================================================ "Privacy in residential applications is a desirable marketing option." (ETSI EN 300 175-7 Ch. A6) From mailman at lists.osmocom.org Wed Jun 1 03:25:43 2011 From: mailman at lists.osmocom.org (mailman at lists.osmocom.org) Date: Wed, 01 Jun 2011 05:25:43 +0200 Subject: Bounce action notification Message-ID: This is a Mailman mailing list bounce action notice: List: OpenBSC Member: galbayar at usi.mn Action: Subscription disabled. Reason: Excessive or fatal bounces. The triggering bounce notice is attached below. Questions? Contact the Mailman site administrator at mailman at lists.osmocom.org. -------------- next part -------------- An embedded message was scrubbed... From: Mail Delivery System Subject: Mail delivery failed: returning message to sender Date: Wed, 01 Jun 2011 05:25:42 +0200 Size: 3608 URL: From holger at freyther.de Fri Jun 3 14:32:32 2011 From: holger at freyther.de (Holger Hans Peter Freyther) Date: Fri, 03 Jun 2011 16:32:32 +0200 Subject: ANN: osmo-pcap a PCAP Client and Server application Message-ID: <4DE8F080.1010002@freyther.de> Hi, I wrote a very primitive client and server for PCAP. The osmo_pcap_client will use libpcap to sniff on a local link, we have the usual VTY interface to configure it, one can change the filter and the device at runtime. There is also a very simple server that authenticates clients based on the remote address, that will write the pcap files to disk. The files will be rotated based on time and size, but also when the Link Header of a client is changing. The traffic is not encrypted yet but that is on the todolist. The code can be found in our git repository[1]. holger [1] http://cgit.osmocom.org/cgit/osmo-pcap/ From holger at freyther.de Fri Jun 3 18:37:19 2011 From: holger at freyther.de (Holger Hans Peter Freyther) Date: Fri, 03 Jun 2011 20:37:19 +0200 Subject: Searching for a studendt WAS( ANN: osmo-pcap a PCAP Client and Server application) In-Reply-To: <4DE8F080.1010002@freyther.de> References: <4DE8F080.1010002@freyther.de> Message-ID: <4DE929DF.3030205@freyther.de> On 06/03/2011 04:32 PM, Holger Hans Peter Freyther wrote: Hi all, I would like to get more students involved and would be interested in acting as a mentor. For the below osmo-pcap codebase I have a set of bite sized tasks (of different size) and it would be great if we could get some students to pick some of these. The only requirement should be interest to learn to program in C, some self motivation (e.g. use your favorite search engine before asking) but besides that the skills are not that important. cheers holger > Hi, > > I wrote a very primitive client and server for PCAP. The osmo_pcap_client will > use libpcap to sniff on a local link, we have the usual VTY interface to > configure it, one can change the filter and the device at runtime. > > There is also a very simple server that authenticates clients based on the > remote address, that will write the pcap files to disk. The files will be > rotated based on time and size, but also when the Link Header of a client is > changing. The traffic is not encrypted yet but that is on the todolist. > > The code can be found in our git repository[1]. > > holger > > [1] http://cgit.osmocom.org/cgit/osmo-pcap/ > From laforge at gnumonks.org Sat Jun 4 19:06:01 2011 From: laforge at gnumonks.org (Harald Welte) Date: Sat, 4 Jun 2011 21:06:01 +0200 Subject: GSM @ Camp 2011 preparations Message-ID: <20110604190601.GN21708@prithivi.gnumonks.org> Hi Peter and others, it seems like the situation regarding the GSM network at the Camp is starting to become clearer every day. I am still arguing that two relatively large BTS with circular antennas are a good idea. Therefore, I have now applied for a test license with the regulatory authority with the following parameters: * six GSM 1800 ARFCN * two antennas, circular, 18 meters above ground * 5W output power on each ARFCN. I know one of my customers in Germany has once managed to get a license for 5W, so I thought it is a good bet we should get the same. It should be more than sufficient to cover the camp. * from August 2nd through August 15th, i.e. we have time for build-up and can also run it one more day during shutdown of the camp I should be receiving "Motorola Horizon Macro" BTSs with 3 to 6 TRX each soon. They are able to drive something like >= 20W output power, way more than we need. The only problem with those BTS is: We will need to add the Motorola A-bis dialect to OpenBSC before the Camp, which could be a tough task depending on how far they are off the standard A-bis as specified in 08.58 and 12.21. If we cannot make those BTS work, our options are somewhat limited. 1) nanoBTS based The nanoBTS are 200mW only, so we would need a booster. Those cost about 1000 EUR for 6W downlink power + 18dB uplink LNA. Who is going to fund that? Also, we would need a combiner/splitter to run something like a 3-TRX setup. 2) Ericsson RBS I should have two RBS 2308 (4TRX each) soon, but both of them are GSM 1900. It is unlikely that we ge a license, and a lot of phones probably don't support it. So unless they can somehow be converted to 1800 MHz units, they are not a good fit either :/ 3) Siemens BS-11 All of them are GSM 900. No way to get a license in Germany, sorry. So we basically _have to_ make the Motorola Horizon work... Regards, Harald -- - Harald Welte http://laforge.gnumonks.org/ ============================================================================ "Privacy in residential applications is a desirable marketing option." (ETSI EN 300 175-7 Ch. A6) From meierk at informatik.uni-freiburg.de Sun Jun 5 18:45:09 2011 From: meierk at informatik.uni-freiburg.de (Konrad Meier) Date: Sun, 05 Jun 2011 20:45:09 +0200 Subject: GSM @ Camp 2011 preparations In-Reply-To: <20110604190601.GN21708@prithivi.gnumonks.org> References: <20110604190601.GN21708@prithivi.gnumonks.org> Message-ID: <4DEBCEB5.70106@informatik.uni-freiburg.de> Hi Harald, Am 04.06.2011 21:06, schrieb Harald Welte: > Hi Peter and others, > > it seems like the situation regarding the GSM network at the Camp is > starting to become clearer every day. > > I am still arguing that two relatively large BTS with circular antennas > are a good idea. Therefore, I have now applied for a test license with > the regulatory authority with the following parameters: > * six GSM 1800 ARFCN > * two antennas, circular, 18 meters above ground > * 5W output power on each ARFCN. I know one of my customers in Germany > has once managed to get a license for 5W, so I thought it is a good > bet we should get the same. It should be more than sufficient to > cover the camp. > * from August 2nd through August 15th, i.e. we have time for build-up > and can also run it one more day during shutdown of the camp I can confirm that a 5W test license is possible. At the Univeristy of Freiburg we have a license for three ARFCN with 5W ERP max. The license was pretty easy to get. The application was just an e-mail with an the addition that we like to have a licence with the most possible transmission power. The Bundesnetzagentur also confirmed that a license in Karlsruhe with 5W as part of the GPN 2011 [1] is possible. The 18 meters above ground could be a problem in combination with the high output power. Our test license is limited to some meters above ground. At the moment I don't have the exact maximum height but I thing is is something between 5 and 8 meters. > 1) nanoBTS based > The nanoBTS are 200mW only, so we would need a booster. Those cost > about 1000 EUR for 6W downlink power + 18dB uplink LNA. Who is going > to fund that? Also, we would need a combiner/splitter to run > something like a 3-TRX setup. > We have two nanoBTS-Booster 1800 here at the university. If for some reason the Ericsson RBS is not working it should be possible to lend you the two bossters for the time of the camp. We also have a splitter and combiner. I will test the splitter/combiner in combination with a booster at the GPN end of this month. Best Regards Konrad [1] http://events.ccc.de/tag/gpn/ From laforge at gnumonks.org Mon Jun 6 09:35:26 2011 From: laforge at gnumonks.org (Harald Welte) Date: Mon, 6 Jun 2011 11:35:26 +0200 Subject: GSM @ Camp 2011 preparations In-Reply-To: <4DEBCEB5.70106@informatik.uni-freiburg.de> References: <20110604190601.GN21708@prithivi.gnumonks.org> <4DEBCEB5.70106@informatik.uni-freiburg.de> Message-ID: <20110606093526.GF12563@prithivi.gnumonks.org> Hi Konrad, On Sun, Jun 05, 2011 at 08:45:09PM +0200, Konrad Meier wrote: > >1) nanoBTS based > > The nanoBTS are 200mW only, so we would need a booster. Those cost > > about 1000 EUR for 6W downlink power + 18dB uplink LNA. Who is going > > to fund that? Also, we would need a combiner/splitter to run > > something like a 3-TRX setup. > > We have two nanoBTS-Booster 1800 here at the university. If for some > reason the Ericsson RBS is not working it should be possible to lend > you the two bossters for the time of the camp. We also have a > splitter and combiner. I will test the splitter/combiner in > combination with a booster at the GPN end of this month. This is great news. I would be more than happy to accept the offfer, if the Motorola BTS idea doesn't work out. I already have another company that would be able to give us 3 or 4 other booster kits (lna+pa+duplexer+filter) for nanoBTS 1800. Regards, Harald -- - Harald Welte http://laforge.gnumonks.org/ ============================================================================ "Privacy in residential applications is a desirable marketing option." (ETSI EN 300 175-7 Ch. A6) From Andreas.Eversberg at versatel.de Mon Jun 6 07:35:50 2011 From: Andreas.Eversberg at versatel.de (Andreas.Eversberg) Date: Mon, 6 Jun 2011 09:35:50 +0200 Subject: AW: GSM @ Camp 2011 preparations Message-ID: > 1) nanoBTS based > The nanoBTS are 200mW only, so we would need a booster. Those cost > about 1000 EUR for 6W downlink power + 18dB uplink LNA. Who is going > to fund that? Also, we would need a combiner/splitter to run > something like a 3-TRX setup. i could get 3 amplifiers by R&S from a friend. each one has 20 watts output power max. here is a similar device: http://www.radiosurplus.it/pdf/TSAMPG.pdf From laforge at gnumonks.org Mon Jun 6 09:33:28 2011 From: laforge at gnumonks.org (Harald Welte) Date: Mon, 6 Jun 2011 11:33:28 +0200 Subject: GSM @ Camp 2011 preparations In-Reply-To: References: Message-ID: <20110606093328.GE12563@prithivi.gnumonks.org> Hi Andreas, On Mon, Jun 06, 2011 at 09:35:50AM +0200, Andreas.Eversberg wrote: > i could get 3 amplifiers by R&S from a friend. each one has 20 watts > output power max. here is a similar device: > http://www.radiosurplus.it/pdf/TSAMPG.pdf thanks a lot. The problem is that the TX PA alone isn't of much use if we don't have a duplexer/circulater, as well as uplink LNA that goes with it. -- - Harald Welte http://laforge.gnumonks.org/ ============================================================================ "Privacy in residential applications is a desirable marketing option." (ETSI EN 300 175-7 Ch. A6) From datacop at wireloss.net Fri Jun 10 13:18:06 2011 From: datacop at wireloss.net (Clemens Hopfer) Date: Fri, 10 Jun 2011 15:18:06 +0200 Subject: GSM @ Camp 2011 preparations In-Reply-To: <20110604190601.GN21708@prithivi.gnumonks.org> References: <20110604190601.GN21708@prithivi.gnumonks.org> Message-ID: <201106101518.06291.datacop@wireloss.net> Hi, On Saturday 04 June 2011 21:06:01 Harald Welte wrote: > * two antennas, circular, 18 meters above ground Are you sure that this is possible? (because of the airfield) The Chaoswelle Camp2007 page[0] states that 12m was the maximum antenna/mast height, but that might also be a myth (some chaoswelle guys I asked couldn't remember). one more thing: We (the ham radio guys from metalab/Vienna in cooperation with Chaoswelle) are planning to do some 2m (144MHz) EME[1] communications. The path of the moon will be south with pretty low elevation, so our communications path will be almost directly above your heads ;-) More about the setup on the camp wiki[2], but expect abt. 30dBW PA output. Professional equipment should have no problems with that, however wideband hardware like the WBX, Funcube Dongle etc. might not like it. > * from August 2nd through August 15th, i.e. we have time for build-up > and can also run it one more day during shutdown of the camp We will be there 3-4 Days prior the opening event, if you need some hands for build-up (mechanical/HF/whatever) we'll be glad to help. regards, Clemens Hopfer, OE1RFC [0] http://www.chaoswelle.de/Camp2007 (german, look at "Regeln") [1] http://en.wikipedia.org/wiki/EME_%28communications%29 [2] https://events.ccc.de/camp/2011/wiki/Moonbounce From bthomas at mailbox.hu Wed Jun 8 21:06:50 2011 From: bthomas at mailbox.hu (Bthomas) Date: Wed, 8 Jun 2011 23:06:50 +0200 Subject: huawei uap 3801e Message-ID: Dear OpenBSC users and developers! I beseech you, help me with some information. Today I bought a 4 pack auction Huawei femtocell UAP 3801. Next to them there's no documentation, Huawei has not yet responded to my questions. I want them to operate with OpenBSC. Do you think this tool will work with it? If anyone are having operating instructions, configuration instructions, please share it with me. Thanks, bthomyka -------------- next part -------------- An HTML attachment was scrubbed... URL: From laforge at gnumonks.org Thu Jun 9 06:40:01 2011 From: laforge at gnumonks.org (Harald Welte) Date: Thu, 9 Jun 2011 08:40:01 +0200 Subject: huawei uap 3801e In-Reply-To: References: Message-ID: <20110609064000.GK16054@prithivi.gnumonks.org> On Wed, Jun 08, 2011 at 11:06:50PM +0200, Bthomas wrote: > Dear OpenBSC users and developers! > I beseech you, help me with some information. > Today I bought a 4 pack auction Huawei femtocell UAP 3801. Next to them > there's no documentation, Huawei has not yet responded to my questions. > I want them to operate with OpenBSC. Do you think this tool will work with > it? I think even for somebody with detailed protocol knowledge, it would be a multi-man-month development effort to get it working. You are talking about WCDMA femtocells, while we have only worked with GSM BTSs. first of all, this is 3G not 2G. This means a different system, with different procedures and different protocols (IuB/IuH, RANAP, etc.) Only the higher layers like CC and SMS are identical to 2G. Secondly, the existing femtocells speak mostly proprietary protocols between the femtocell and the femtocell-gateway inside the operator. So the first thing I would be looking for is protocol traces of the femtocells in action, i.e. when they talk to their normal femto-gw. Based on that, you can start to reverse engineer the protocol. It can be done, we have done it for several other femtocell protocols of other vendors before. But even after that, we didn't have any time (or funding) for writing actual code implementing it. -- - Harald Welte http://laforge.gnumonks.org/ ============================================================================ "Privacy in residential applications is a desirable marketing option." (ETSI EN 300 175-7 Ch. A6) From bthomas at mailbox.hu Fri Jun 10 16:29:33 2011 From: bthomas at mailbox.hu (Bthomas) Date: Fri, 10 Jun 2011 18:29:33 +0200 Subject: huawei uap 3801e Message-ID: Dear Developers! Currently, the only tool I have found this information: http://users.atw.hu/helvei/UAP3801E.rar?atw_referer=http% 3A% 2F% 2Fmobil- telefon.vatera.hu 2Fmobiltelefon_tartozek%%% 2Fegyeb 2F4_db_huawei_ap_femtocella_mobil_bazisallomas_1459406466.html This is a power point presentation, the pages visible to a certain set of procedures. Although I do not know how much help in the development, but I share with you. Consulted during a programmer who is interested in finding a "reverse engineering" and curious about the possibility of the device, the communication. I am confident that if he succeeds, much of the project promotes the development of OpenBSC. Regards, bthomyka -------------- next part -------------- An HTML attachment was scrubbed... URL: From pablo at netfilter.org Sun Jun 12 14:30:35 2011 From: pablo at netfilter.org (Pablo Neira Ayuso) Date: Sun, 12 Jun 2011 16:30:35 +0200 Subject: [PATCH] socket: extend infrastructure to support non-blocking sockets Message-ID: <20110612143035.18290.35287.stgit@decadence> From: Pablo Neira Ayuso * add OSMO_SOCK_F_[CONNECT|BIND|NON_BLOCK] flags * osmo_sock_connect() to call connect once the non-blocking connect becomes ready. This extends the socket infrastructure in libosmocore to allow to create non-blocking sockets. Basically, it replaces the connect0_bind1 parameter by one flags parameter. --- include/osmocom/core/socket.h | 11 ++++++++--- src/gsmtap_util.c | 6 ++++-- src/socket.c | 38 ++++++++++++++++++++++++++++---------- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h index b2601c7..612b12c 100644 --- a/include/osmocom/core/socket.h +++ b/include/osmocom/core/socket.h @@ -5,14 +5,19 @@ struct sockaddr; +/* flags for osmo_sock_init. */ +#define OSMO_SOCK_F_CONNECT (1 << 0) +#define OSMO_SOCK_F_BIND (1 << 1) +#define OSMO_SOCK_F_NONBLOCK (1 << 2) + int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, - const char *host, uint16_t port, int connect0_bind1); + const char *host, uint16_t port, unsigned int flags); int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto, - const char *host, uint16_t port, int connect0_bind1); + const char *host, uint16_t port, unsigned int flags); int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type, - uint8_t proto, int connect0_bind1); + uint8_t proto, unsigned int flags); /* determine if the given address is a local address */ int osmo_sockaddr_is_local(struct sockaddr *addr, unsigned int addrlen); diff --git a/src/gsmtap_util.c b/src/gsmtap_util.c index eddde04..47fa37d 100644 --- a/src/gsmtap_util.c +++ b/src/gsmtap_util.c @@ -124,7 +124,8 @@ int gsmtap_source_init_fd(const char *host, uint16_t port) if (host == NULL) host = "localhost"; - return osmo_sock_init(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, host, port, 0); + return osmo_sock_init(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, host, port, + OSMO_SOCK_F_CONNECT); } int gsmtap_source_add_sink_fd(int gsmtap_fd) @@ -138,7 +139,8 @@ int gsmtap_source_add_sink_fd(int gsmtap_fd) return rc; if (osmo_sockaddr_is_local((struct sockaddr *)&ss, ss_len) == 1) { - rc = osmo_sock_init_sa((struct sockaddr *)&ss, SOCK_DGRAM, IPPROTO_UDP, 1); + rc = osmo_sock_init_sa((struct sockaddr *)&ss, SOCK_DGRAM, + IPPROTO_UDP, OSMO_SOCK_F_BIND); if (rc >= 0) return rc; } diff --git a/src/socket.c b/src/socket.c index 0be98b9..f1fcccd 100644 --- a/src/socket.c +++ b/src/socket.c @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -18,12 +19,16 @@ #include int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, - const char *host, uint16_t port, int connect0_bind1) + const char *host, uint16_t port, unsigned int flags) { struct addrinfo hints, *result, *rp; int sfd, rc, on = 1; char portbuf[16]; + if ((flags & (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT)) == + (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT)) + return -EINVAL; + sprintf(portbuf, "%u", port); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = family; @@ -31,7 +36,7 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, hints.ai_flags = 0; hints.ai_protocol = proto; - if (connect0_bind1) + if (flags & OSMO_SOCK_F_BIND) hints.ai_flags |= AI_PASSIVE; rc = getaddrinfo(host, portbuf, &hints, &result); @@ -44,10 +49,24 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if (sfd == -1) continue; - if (connect0_bind1 == 0) { - if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1) + if (flags & OSMO_SOCK_F_NONBLOCK) { + if (ioctl(sfd, FIONBIO, (unsigned char *)&on) < 0) { + perror("cannot set this socket unblocking"); + close(sfd); + return -EINVAL; + } + } + if (flags & OSMO_SOCK_F_CONNECT) { + rc = connect(sfd, rp->ai_addr, rp->ai_addrlen); + if (rc != -1 || (rc == -1 && errno == EINPROGRESS)) break; } else { + rc = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, + &on, sizeof(on)); + if (rc < 0) { + perror("cannot setsockopt socket"); + break; + } if (bind(sfd, rp->ai_addr, rp->ai_addrlen) != -1) break; } @@ -63,7 +82,7 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); /* Make sure to call 'listen' on a bound, connection-oriented sock */ - if (connect0_bind1 == 1) { + if (flags & OSMO_SOCK_F_BIND) { switch (type) { case SOCK_STREAM: case SOCK_SEQPACKET: @@ -75,11 +94,11 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, } int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto, - const char *host, uint16_t port, int connect0_bind1) + const char *host, uint16_t port, unsigned int flags) { int sfd, rc; - sfd = osmo_sock_init(family, type, proto, host, port, connect0_bind1); + sfd = osmo_sock_init(family, type, proto, host, port, flags); if (sfd < 0) return sfd; @@ -96,7 +115,7 @@ int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto, } int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type, - uint8_t proto, int connect0_bind1) + uint8_t proto, unsigned int flags) { char host[NI_MAXHOST]; uint16_t port; @@ -127,8 +146,7 @@ int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type, return s; } - return osmo_sock_init(ss->sa_family, type, proto, host, - port, connect0_bind1); + return osmo_sock_init(ss->sa_family, type, proto, host, port, flags); } static int sockaddr_equal(const struct sockaddr *a, From pablo at gnumonks.org Sun Jun 12 14:34:28 2011 From: pablo at gnumonks.org (Pablo Neira Ayuso) Date: Sun, 12 Jun 2011 16:34:28 +0200 Subject: [PATCH] socket: extend infrastructure to support non-blocking sockets In-Reply-To: <20110612143035.18290.35287.stgit@decadence> References: <20110612143035.18290.35287.stgit@decadence> Message-ID: <4DF4CE74.6000200@gnumonks.org> This description is wrong, I've resend this patch with the good one. On 12/06/11 16:30, Pablo Neira Ayuso wrote: > From: Pablo Neira Ayuso > > * add OSMO_SOCK_F_[CONNECT|BIND|NON_BLOCK] flags > * osmo_sock_connect() to call connect once the non-blocking connect > becomes ready. > > This extends the socket infrastructure in libosmocore to allow > to create non-blocking sockets. > > Basically, it replaces the connect0_bind1 parameter by one > flags parameter. > --- > include/osmocom/core/socket.h | 11 ++++++++--- > src/gsmtap_util.c | 6 ++++-- > src/socket.c | 38 ++++++++++++++++++++++++++++---------- > 3 files changed, 40 insertions(+), 15 deletions(-) > > diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h > index b2601c7..612b12c 100644 > --- a/include/osmocom/core/socket.h > +++ b/include/osmocom/core/socket.h > @@ -5,14 +5,19 @@ > > struct sockaddr; > > +/* flags for osmo_sock_init. */ > +#define OSMO_SOCK_F_CONNECT (1 << 0) > +#define OSMO_SOCK_F_BIND (1 << 1) > +#define OSMO_SOCK_F_NONBLOCK (1 << 2) > + > int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, > - const char *host, uint16_t port, int connect0_bind1); > + const char *host, uint16_t port, unsigned int flags); > > int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto, > - const char *host, uint16_t port, int connect0_bind1); > + const char *host, uint16_t port, unsigned int flags); > > int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type, > - uint8_t proto, int connect0_bind1); > + uint8_t proto, unsigned int flags); > > /* determine if the given address is a local address */ > int osmo_sockaddr_is_local(struct sockaddr *addr, unsigned int addrlen); > diff --git a/src/gsmtap_util.c b/src/gsmtap_util.c > index eddde04..47fa37d 100644 > --- a/src/gsmtap_util.c > +++ b/src/gsmtap_util.c > @@ -124,7 +124,8 @@ int gsmtap_source_init_fd(const char *host, uint16_t port) > if (host == NULL) > host = "localhost"; > > - return osmo_sock_init(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, host, port, 0); > + return osmo_sock_init(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, host, port, > + OSMO_SOCK_F_CONNECT); > } > > int gsmtap_source_add_sink_fd(int gsmtap_fd) > @@ -138,7 +139,8 @@ int gsmtap_source_add_sink_fd(int gsmtap_fd) > return rc; > > if (osmo_sockaddr_is_local((struct sockaddr *)&ss, ss_len) == 1) { > - rc = osmo_sock_init_sa((struct sockaddr *)&ss, SOCK_DGRAM, IPPROTO_UDP, 1); > + rc = osmo_sock_init_sa((struct sockaddr *)&ss, SOCK_DGRAM, > + IPPROTO_UDP, OSMO_SOCK_F_BIND); > if (rc >= 0) > return rc; > } > diff --git a/src/socket.c b/src/socket.c > index 0be98b9..f1fcccd 100644 > --- a/src/socket.c > +++ b/src/socket.c > @@ -6,6 +6,7 @@ > #include > #include > > +#include > #include > #include > > @@ -18,12 +19,16 @@ > #include > > int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, > - const char *host, uint16_t port, int connect0_bind1) > + const char *host, uint16_t port, unsigned int flags) > { > struct addrinfo hints, *result, *rp; > int sfd, rc, on = 1; > char portbuf[16]; > > + if ((flags & (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT)) == > + (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT)) > + return -EINVAL; > + > sprintf(portbuf, "%u", port); > memset(&hints, 0, sizeof(struct addrinfo)); > hints.ai_family = family; > @@ -31,7 +36,7 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, > hints.ai_flags = 0; > hints.ai_protocol = proto; > > - if (connect0_bind1) > + if (flags & OSMO_SOCK_F_BIND) > hints.ai_flags |= AI_PASSIVE; > > rc = getaddrinfo(host, portbuf, &hints, &result); > @@ -44,10 +49,24 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, > sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); > if (sfd == -1) > continue; > - if (connect0_bind1 == 0) { > - if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1) > + if (flags & OSMO_SOCK_F_NONBLOCK) { > + if (ioctl(sfd, FIONBIO, (unsigned char *)&on) < 0) { > + perror("cannot set this socket unblocking"); > + close(sfd); > + return -EINVAL; > + } > + } > + if (flags & OSMO_SOCK_F_CONNECT) { > + rc = connect(sfd, rp->ai_addr, rp->ai_addrlen); > + if (rc != -1 || (rc == -1 && errno == EINPROGRESS)) > break; > } else { > + rc = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, > + &on, sizeof(on)); > + if (rc < 0) { > + perror("cannot setsockopt socket"); > + break; > + } > if (bind(sfd, rp->ai_addr, rp->ai_addrlen) != -1) > break; > } > @@ -63,7 +82,7 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, > setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); > > /* Make sure to call 'listen' on a bound, connection-oriented sock */ > - if (connect0_bind1 == 1) { > + if (flags & OSMO_SOCK_F_BIND) { > switch (type) { > case SOCK_STREAM: > case SOCK_SEQPACKET: > @@ -75,11 +94,11 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, > } > > int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto, > - const char *host, uint16_t port, int connect0_bind1) > + const char *host, uint16_t port, unsigned int flags) > { > int sfd, rc; > > - sfd = osmo_sock_init(family, type, proto, host, port, connect0_bind1); > + sfd = osmo_sock_init(family, type, proto, host, port, flags); > if (sfd < 0) > return sfd; > > @@ -96,7 +115,7 @@ int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto, > } > > int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type, > - uint8_t proto, int connect0_bind1) > + uint8_t proto, unsigned int flags) > { > char host[NI_MAXHOST]; > uint16_t port; > @@ -127,8 +146,7 @@ int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type, > return s; > } > > - return osmo_sock_init(ss->sa_family, type, proto, host, > - port, connect0_bind1); > + return osmo_sock_init(ss->sa_family, type, proto, host, port, flags); > } > > static int sockaddr_equal(const struct sockaddr *a, > > From pablo at netfilter.org Sun Jun 12 14:31:12 2011 From: pablo at netfilter.org (Pablo Neira Ayuso) Date: Sun, 12 Jun 2011 16:31:12 +0200 Subject: [PATCH] socket: add OSMO_SOCK_F_[CONNECT|BIND|NON_BLOCK] flags Message-ID: <20110612143112.18371.68918.stgit@decadence> From: Pablo Neira Ayuso This extends the socket infrastructure in libosmocore to allow to create non-blocking sockets. Basically, it replaces the connect0_bind1 parameter by one flags parameter. --- include/osmocom/core/socket.h | 11 ++++++++--- src/gsmtap_util.c | 6 ++++-- src/socket.c | 38 ++++++++++++++++++++++++++++---------- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h index b2601c7..612b12c 100644 --- a/include/osmocom/core/socket.h +++ b/include/osmocom/core/socket.h @@ -5,14 +5,19 @@ struct sockaddr; +/* flags for osmo_sock_init. */ +#define OSMO_SOCK_F_CONNECT (1 << 0) +#define OSMO_SOCK_F_BIND (1 << 1) +#define OSMO_SOCK_F_NONBLOCK (1 << 2) + int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, - const char *host, uint16_t port, int connect0_bind1); + const char *host, uint16_t port, unsigned int flags); int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto, - const char *host, uint16_t port, int connect0_bind1); + const char *host, uint16_t port, unsigned int flags); int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type, - uint8_t proto, int connect0_bind1); + uint8_t proto, unsigned int flags); /* determine if the given address is a local address */ int osmo_sockaddr_is_local(struct sockaddr *addr, unsigned int addrlen); diff --git a/src/gsmtap_util.c b/src/gsmtap_util.c index eddde04..47fa37d 100644 --- a/src/gsmtap_util.c +++ b/src/gsmtap_util.c @@ -124,7 +124,8 @@ int gsmtap_source_init_fd(const char *host, uint16_t port) if (host == NULL) host = "localhost"; - return osmo_sock_init(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, host, port, 0); + return osmo_sock_init(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, host, port, + OSMO_SOCK_F_CONNECT); } int gsmtap_source_add_sink_fd(int gsmtap_fd) @@ -138,7 +139,8 @@ int gsmtap_source_add_sink_fd(int gsmtap_fd) return rc; if (osmo_sockaddr_is_local((struct sockaddr *)&ss, ss_len) == 1) { - rc = osmo_sock_init_sa((struct sockaddr *)&ss, SOCK_DGRAM, IPPROTO_UDP, 1); + rc = osmo_sock_init_sa((struct sockaddr *)&ss, SOCK_DGRAM, + IPPROTO_UDP, OSMO_SOCK_F_BIND); if (rc >= 0) return rc; } diff --git a/src/socket.c b/src/socket.c index 0be98b9..f1fcccd 100644 --- a/src/socket.c +++ b/src/socket.c @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -18,12 +19,16 @@ #include int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, - const char *host, uint16_t port, int connect0_bind1) + const char *host, uint16_t port, unsigned int flags) { struct addrinfo hints, *result, *rp; int sfd, rc, on = 1; char portbuf[16]; + if ((flags & (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT)) == + (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT)) + return -EINVAL; + sprintf(portbuf, "%u", port); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = family; @@ -31,7 +36,7 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, hints.ai_flags = 0; hints.ai_protocol = proto; - if (connect0_bind1) + if (flags & OSMO_SOCK_F_BIND) hints.ai_flags |= AI_PASSIVE; rc = getaddrinfo(host, portbuf, &hints, &result); @@ -44,10 +49,24 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if (sfd == -1) continue; - if (connect0_bind1 == 0) { - if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1) + if (flags & OSMO_SOCK_F_NONBLOCK) { + if (ioctl(sfd, FIONBIO, (unsigned char *)&on) < 0) { + perror("cannot set this socket unblocking"); + close(sfd); + return -EINVAL; + } + } + if (flags & OSMO_SOCK_F_CONNECT) { + rc = connect(sfd, rp->ai_addr, rp->ai_addrlen); + if (rc != -1 || (rc == -1 && errno == EINPROGRESS)) break; } else { + rc = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, + &on, sizeof(on)); + if (rc < 0) { + perror("cannot setsockopt socket"); + break; + } if (bind(sfd, rp->ai_addr, rp->ai_addrlen) != -1) break; } @@ -63,7 +82,7 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); /* Make sure to call 'listen' on a bound, connection-oriented sock */ - if (connect0_bind1 == 1) { + if (flags & OSMO_SOCK_F_BIND) { switch (type) { case SOCK_STREAM: case SOCK_SEQPACKET: @@ -75,11 +94,11 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, } int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto, - const char *host, uint16_t port, int connect0_bind1) + const char *host, uint16_t port, unsigned int flags) { int sfd, rc; - sfd = osmo_sock_init(family, type, proto, host, port, connect0_bind1); + sfd = osmo_sock_init(family, type, proto, host, port, flags); if (sfd < 0) return sfd; @@ -96,7 +115,7 @@ int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto, } int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type, - uint8_t proto, int connect0_bind1) + uint8_t proto, unsigned int flags) { char host[NI_MAXHOST]; uint16_t port; @@ -127,8 +146,7 @@ int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type, return s; } - return osmo_sock_init(ss->sa_family, type, proto, host, - port, connect0_bind1); + return osmo_sock_init(ss->sa_family, type, proto, host, port, flags); } static int sockaddr_equal(const struct sockaddr *a, From laforge at gnumonks.org Mon Jun 13 06:23:47 2011 From: laforge at gnumonks.org (Harald Welte) Date: Mon, 13 Jun 2011 08:23:47 +0200 Subject: [PATCH] socket: add OSMO_SOCK_F_[CONNECT|BIND|NON_BLOCK] flags In-Reply-To: <20110612143112.18371.68918.stgit@decadence> References: <20110612143112.18371.68918.stgit@decadence> Message-ID: <6002c092-b0dd-4752-94f6-cc4eae99d686@email.android.com> hi pablo, the patch looks fine to me, feel free to commit it to master (I'm on ahort holidays until tuesday). Please make sure to fix all callers at least in openbsc, osmoxom-bb, insideclibosmocore (gsmtap) and osmo-tetra. I don't fully recall which code uses the function and which not. Regards, Harald -- Sent from a mobile device, excuse my short response -------------- next part -------------- An HTML attachment was scrubbed... URL: From pablo at gnumonks.org Mon Jun 13 17:14:24 2011 From: pablo at gnumonks.org (Pablo Neira Ayuso) Date: Mon, 13 Jun 2011 19:14:24 +0200 Subject: [PATCH] socket: add OSMO_SOCK_F_[CONNECT|BIND|NON_BLOCK] flags In-Reply-To: <6002c092-b0dd-4752-94f6-cc4eae99d686@email.android.com> References: <20110612143112.18371.68918.stgit@decadence> <6002c092-b0dd-4752-94f6-cc4eae99d686@email.android.com> Message-ID: <4DF64570.3030606@gnumonks.org> On 13/06/11 08:23, Harald Welte wrote: > hi pablo, > > the patch looks fine to me, feel free to commit it to master (I'm on > ahort holidays until tuesday). > > Please make sure to fix all callers at least in openbsc, osmoxom-bb, > insideclibosmocore (gsmtap) and osmo-tetra. I don't fully recall which > code uses the function and which not. grep shows no clients of these functions outside libosmocore yet, so it's the moment to change the API :-). I'm going to push the patch. From bthomas at mailbox.hu Mon Jun 13 15:03:26 2011 From: bthomas at mailbox.hu (Bthomas) Date: Mon, 13 Jun 2011 17:03:26 +0200 Subject: Linux based 3g picocell sourcecode - vodafone rebranded Message-ID: Dear OpenBSC Developers! Although I can not help much in development, but once you split a link which is available in a 3G pico(?)cell rebranded by vodafone firmware. link: https://forge.betavine.net/frs/download.php/650/foss_fbsr-02.01.51.46.tar.gz sincerely bthomyka -------------- next part -------------- An HTML attachment was scrubbed... URL: From laforge at gnumonks.org Tue Jun 14 08:58:58 2011 From: laforge at gnumonks.org (Harald Welte) Date: Tue, 14 Jun 2011 10:58:58 +0200 Subject: Linux based 3g picocell sourcecode - vodafone rebranded In-Reply-To: References: Message-ID: <20110614085858.GM4708@prithivi.gnumonks.org> Hi Thomas, On Mon, Jun 13, 2011 at 05:03:26PM +0200, Bthomas wrote: > Although I can not help much in development, but once you split a link which > is available in a 3G pico(?)cell rebranded by vodafone firmware. JFYI: This is not the 'picocell source code' but the source code to the Linux kernel + other operating systems components on top of which they run the picocell. I've seen that when the product was first released, probably some 1.5 years ago.. but thanks anyway. -- - Harald Welte http://laforge.gnumonks.org/ ============================================================================ "Privacy in residential applications is a desirable marketing option." (ETSI EN 300 175-7 Ch. A6) From pablo at gnumonks.org Tue Jun 14 17:14:48 2011 From: pablo at gnumonks.org (pablo at gnumonks.org) Date: Tue, 14 Jun 2011 19:14:48 +0200 Subject: [PATCH 0/4] use standalone libtalloc instead of own copy Message-ID: <1308071692-6041-1-git-send-email-pablo@gnumonks.org> From: Pablo Neira Ayuso Hi! With these patches, libosmocore, libosmo-sccp, openbsc and osmo-tetra does not use anymore our own copy of talloc and they rely on the standalone library that is provided by major distributors. The osmocom-bb part is still missing, my idea is to include a copy of libtalloc in the tree in the shared/ directory via rsync. This patch will follow later since we can still rely on the outdated copy of libosmocore. Please, apply. From pablo at gnumonks.org Tue Jun 14 17:14:49 2011 From: pablo at gnumonks.org (pablo at gnumonks.org) Date: Tue, 14 Jun 2011 19:14:49 +0200 Subject: [PATCH 1/4] [libosmocore] src: remove our own copy of talloc In-Reply-To: <1308071692-6041-1-git-send-email-pablo@gnumonks.org> References: <1308071692-6041-1-git-send-email-pablo@gnumonks.org> Message-ID: <1308071692-6041-2-git-send-email-pablo@gnumonks.org> From: Pablo Neira Ayuso With this patch, we check for the libtalloc version installed in the system. This patch also replaces all references to: #include by: #include I did this with this command: find ./ -type f -exec sed -i "s/osmocom\/core\/talloc.h/talloc.h/g" {} \; Make sure you skip .git directory in this replacement, otherwise you'll get a corrupted git repository. --- configure.ac | 9 +- include/osmocom/core/Makefile.am | 4 - include/osmocom/core/talloc.h | 192 ---- src/Makefile.am | 6 +- src/gsmtap_util.c | 2 +- src/logging.c | 2 +- src/logging_syslog.c | 2 +- src/msgb.c | 2 +- src/msgfile.c | 2 +- src/rate_ctr.c | 2 +- src/signal.c | 2 +- src/statistics.c | 2 +- src/talloc.c | 1804 -------------------------------------- src/vty/buffer.c | 2 +- src/vty/command.c | 2 +- src/vty/logging_vty.c | 2 +- src/vty/telnet_interface.c | 2 +- src/vty/utils.c | 2 +- src/vty/vector.c | 2 +- src/vty/vty.c | 2 +- 20 files changed, 18 insertions(+), 2027 deletions(-) delete mode 100644 include/osmocom/core/talloc.h delete mode 100644 src/talloc.c diff --git a/configure.ac b/configure.ac index b923a21..cf6e15c 100644 --- a/configure.ac +++ b/configure.ac @@ -34,14 +34,6 @@ AC_SUBST(SYMBOL_VISIBILITY) dnl Generate the output AM_CONFIG_HEADER(config.h) -AC_ARG_ENABLE(talloc, - [AS_HELP_STRING( - [--disable-talloc], - [Disable building talloc memory allocator] - )], - [enable_talloc=0], [enable_talloc=1]) -AM_CONDITIONAL(ENABLE_TALLOC, test "x$enable_talloc" = "x1") - AC_ARG_ENABLE(plugin, [AS_HELP_STRING( [--disable-plugin], @@ -96,6 +88,7 @@ AC_ARG_ENABLE(msgfile, [enable_msgfile=0], [enable_msgfile=1]) AM_CONDITIONAL(ENABLE_MSGFILE, test "x$enable_msgfile" = "x1") +PKG_CHECK_MODULES([LIBTALLOC], [talloc >= 2.0.1]) AC_OUTPUT( libosmocore.pc diff --git a/include/osmocom/core/Makefile.am b/include/osmocom/core/Makefile.am index 3c30362..f04f1d3 100644 --- a/include/osmocom/core/Makefile.am +++ b/include/osmocom/core/Makefile.am @@ -5,8 +5,4 @@ osmocore_HEADERS = signal.h linuxlist.h timer.h select.h msgb.h bits.h \ plugin.h crc16.h panic.h process.h msgfile.h \ backtrace.h conv.h application.h -if ENABLE_TALLOC -osmocore_HEADERS += talloc.h -endif - osmocoredir = $(includedir)/osmocom/core diff --git a/include/osmocom/core/talloc.h b/include/osmocom/core/talloc.h deleted file mode 100644 index f7f7643..0000000 --- a/include/osmocom/core/talloc.h +++ /dev/null @@ -1,192 +0,0 @@ -#ifndef _TALLOC_H_ -#define _TALLOC_H_ -/* - Unix SMB/CIFS implementation. - Samba temporary memory allocation functions - - Copyright (C) Andrew Tridgell 2004-2005 - Copyright (C) Stefan Metzmacher 2006 - - ** NOTE! The following LGPL license applies to the talloc - ** library. This does NOT imply that all of Samba is released - ** under the LGPL - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 3 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, see . -*/ - -#include -#include -#include - -#define HAVE_VA_COPY - -/* this is only needed for compatibility with the old talloc */ -typedef void TALLOC_CTX; - -/* - this uses a little trick to allow __LINE__ to be stringified -*/ -#ifndef __location__ -#define __TALLOC_STRING_LINE1__(s) #s -#define __TALLOC_STRING_LINE2__(s) __TALLOC_STRING_LINE1__(s) -#define __TALLOC_STRING_LINE3__ __TALLOC_STRING_LINE2__(__LINE__) -#define __location__ __FILE__ ":" __TALLOC_STRING_LINE3__ -#endif - -#ifndef TALLOC_DEPRECATED -#define TALLOC_DEPRECATED 0 -#endif - -#ifndef PRINTF_ATTRIBUTE -#if (__GNUC__ >= 3) -/** Use gcc attribute to check printf fns. a1 is the 1-based index of - * the parameter containing the format, and a2 the index of the first - * argument. Note that some gcc 2.x versions don't handle this - * properly **/ -#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2))) -#else -#define PRINTF_ATTRIBUTE(a1, a2) -#endif -#endif - -/* try to make talloc_set_destructor() and talloc_steal() type safe, - if we have a recent gcc */ -#if (__GNUC__ >= 3) -#define _TALLOC_TYPEOF(ptr) __typeof__(ptr) -#define talloc_set_destructor(ptr, function) \ - do { \ - int (*_talloc_destructor_fn)(_TALLOC_TYPEOF(ptr)) = (function); \ - _talloc_set_destructor((ptr), (int (*)(void *))_talloc_destructor_fn); \ - } while(0) -/* this extremely strange macro is to avoid some braindamaged warning - stupidity in gcc 4.1.x */ -#define talloc_steal(ctx, ptr) ({ _TALLOC_TYPEOF(ptr) __talloc_steal_ret = (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)); __talloc_steal_ret; }) -#else -#define talloc_set_destructor(ptr, function) \ - _talloc_set_destructor((ptr), (int (*)(void *))(function)) -#define _TALLOC_TYPEOF(ptr) void * -#define talloc_steal(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)) -#endif - -#define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference((ctx),(ptr)) -#define talloc_move(ctx, ptr) (_TALLOC_TYPEOF(*(ptr)))_talloc_move((ctx),(void *)(ptr)) - -/* useful macros for creating type checked pointers */ -#define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) -#define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) -#define talloc_ptrtype(ctx, ptr) (_TALLOC_TYPEOF(ptr))talloc_size(ctx, sizeof(*(ptr))) - -#define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__) - -#define talloc_zero(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type) -#define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__) - -#define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type) -#define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type) -#define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__) -#define talloc_array_ptrtype(ctx, ptr, count) (_TALLOC_TYPEOF(ptr))talloc_array_size(ctx, sizeof(*(ptr)), count) -#define talloc_array_length(ctx) (talloc_get_size(ctx)/sizeof(*ctx)) - -#define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p, sizeof(type), count, #type) -#define talloc_realloc_size(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__) - -#define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__) - -#define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type) -#define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type) -#define talloc_get_type_abort(ptr, type) (type *)_talloc_get_type_abort(ptr, #type, __location__) - -#define talloc_find_parent_bytype(ptr, type) (type *)talloc_find_parent_byname(ptr, #type) - -#if TALLOC_DEPRECATED -#define talloc_zero_p(ctx, type) talloc_zero(ctx, type) -#define talloc_p(ctx, type) talloc(ctx, type) -#define talloc_array_p(ctx, type, count) talloc_array(ctx, type, count) -#define talloc_realloc_p(ctx, p, type, count) talloc_realloc(ctx, p, type, count) -#define talloc_destroy(ctx) talloc_free(ctx) -#define talloc_append_string(c, s, a) (s?talloc_strdup_append(s,a):talloc_strdup(c, a)) -#endif - -#define TALLOC_FREE(ctx) do { talloc_free(ctx); ctx=NULL; } while(0) - -/* The following definitions come from talloc.c */ -void *_talloc(const void *context, size_t size); -void *talloc_pool(const void *context, size_t size); -void _talloc_set_destructor(const void *ptr, int (*_destructor)(void *)); -int talloc_increase_ref_count(const void *ptr); -size_t talloc_reference_count(const void *ptr); -void *_talloc_reference(const void *context, const void *ptr); -int talloc_unlink(const void *context, void *ptr); -const char *talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); -void talloc_set_name_const(const void *ptr, const char *name); -void *talloc_named(const void *context, size_t size, - const char *fmt, ...) PRINTF_ATTRIBUTE(3,4); -void *talloc_named_const(const void *context, size_t size, const char *name); -const char *talloc_get_name(const void *ptr); -void *talloc_check_name(const void *ptr, const char *name); -void *_talloc_get_type_abort(const void *ptr, const char *name, const char *location); -void *talloc_parent(const void *ptr); -const char *talloc_parent_name(const void *ptr); -void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); -int talloc_free(void *ptr); -void talloc_free_children(void *ptr); -void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name); -void *_talloc_steal(const void *new_ctx, const void *ptr); -void *_talloc_move(const void *new_ctx, const void *pptr); -size_t talloc_total_size(const void *ptr); -size_t talloc_total_blocks(const void *ptr); -void talloc_report_depth_cb(const void *ptr, int depth, int max_depth, - void (*callback)(const void *ptr, - int depth, int max_depth, - int is_ref, - void *private_data), - void *private_data); -void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f); -void talloc_report_full(const void *ptr, FILE *f); -void talloc_report(const void *ptr, FILE *f); -void talloc_enable_null_tracking(void); -void talloc_disable_null_tracking(void); -void talloc_enable_leak_report(void); -void talloc_enable_leak_report_full(void); -void *_talloc_zero(const void *ctx, size_t size, const char *name); -void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name); -void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name); -void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name); -void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); -void *talloc_realloc_fn(const void *context, void *ptr, size_t size); -void *talloc_autofree_context(void); -size_t talloc_get_size(const void *ctx); -void *talloc_find_parent_byname(const void *ctx, const char *name); -void talloc_show_parents(const void *context, FILE *file); -int talloc_is_parent(const void *context, const void *ptr); - -char *talloc_strdup(const void *t, const char *p); -char *talloc_strdup_append(char *s, const char *a); -char *talloc_strdup_append_buffer(char *s, const char *a); - -char *talloc_strndup(const void *t, const char *p, size_t n); -char *talloc_strndup_append(char *s, const char *a, size_t n); -char *talloc_strndup_append_buffer(char *s, const char *a, size_t n); - -char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); -char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); -char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); - -char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); -char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); -char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); - -void talloc_set_abort_fn(void (*abort_fn)(const char *reason)); - -#endif diff --git a/src/Makefile.am b/src/Makefile.am index 1ae3cff..251d2a5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -9,6 +9,8 @@ AM_CFLAGS = -fPIC -Wall lib_LTLIBRARIES = libosmocore.la +libosmocore_la_LIBADD = ${LIBTALLOC_LIBS} + libosmocore_la_SOURCES = timer.c select.c signal.c msgb.c bits.c \ bitvec.c statistics.c \ write_queue.c utils.c socket.c \ @@ -23,10 +25,6 @@ else libosmocore_la_LDFLAGS = -version-info $(LIBVERSION) endif -if ENABLE_TALLOC -libosmocore_la_SOURCES += talloc.c -endif - if ENABLE_MSGFILE libosmocore_la_SOURCES += msgfile.c endif diff --git a/src/gsmtap_util.c b/src/gsmtap_util.c index c8c26c6..47fa37d 100644 --- a/src/gsmtap_util.c +++ b/src/gsmtap_util.c @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/logging.c b/src/logging.c index 3c9dc03..8c4d270 100644 --- a/src/logging.c +++ b/src/logging.c @@ -34,7 +34,7 @@ #include #include -#include +#include #include #include diff --git a/src/logging_syslog.c b/src/logging_syslog.c index 4f043b1..9c9d91f 100644 --- a/src/logging_syslog.c +++ b/src/logging_syslog.c @@ -33,7 +33,7 @@ #include #endif -#include +#include #include #include diff --git a/src/msgb.c b/src/msgb.c index d2c167a..f22a756 100644 --- a/src/msgb.c +++ b/src/msgb.c @@ -25,7 +25,7 @@ #include //#include -#include +#include //#include void *tall_msgb_ctx; diff --git a/src/msgfile.c b/src/msgfile.c index d2b180d..22e0c34 100644 --- a/src/msgfile.c +++ b/src/msgfile.c @@ -22,7 +22,7 @@ */ #include -#include +#include #include #include diff --git a/src/rate_ctr.c b/src/rate_ctr.c index 6d771a4..927c763 100644 --- a/src/rate_ctr.c +++ b/src/rate_ctr.c @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include diff --git a/src/signal.c b/src/signal.c index bc339bb..f23d1e3 100644 --- a/src/signal.c +++ b/src/signal.c @@ -19,7 +19,7 @@ */ #include -#include +#include #include #include #include diff --git a/src/statistics.c b/src/statistics.c index e28541b..0e559d8 100644 --- a/src/statistics.c +++ b/src/statistics.c @@ -23,7 +23,7 @@ #include #include -#include +#include #include static LLIST_HEAD(counters); diff --git a/src/talloc.c b/src/talloc.c deleted file mode 100644 index d3a0690..0000000 --- a/src/talloc.c +++ /dev/null @@ -1,1804 +0,0 @@ -/* - Samba Unix SMB/CIFS implementation. - - Samba trivial allocation library - new interface - - NOTE: Please read talloc_guide.txt for full documentation - - Copyright (C) Andrew Tridgell 2004 - Copyright (C) Stefan Metzmacher 2006 - - ** NOTE! The following LGPL license applies to the talloc - ** library. This does NOT imply that all of Samba is released - ** under the LGPL - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 3 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, see . -*/ - -/* - inspired by http://swapped.cc/halloc/ -*/ - -#ifdef _SAMBA_BUILD_ -#include "version.h" -#if (SAMBA_VERSION_MAJOR<4) -#include "includes.h" -/* This is to circumvent SAMBA3's paranoid malloc checker. Here in this file - * we trust ourselves... */ -#ifdef malloc -#undef malloc -#endif -#ifdef realloc -#undef realloc -#endif -#define _TALLOC_SAMBA3 -#endif /* (SAMBA_VERSION_MAJOR<4) */ -#endif /* _SAMBA_BUILD_ */ - -#ifndef _TALLOC_SAMBA3 -//#include "replace.h" -#include -#include -#include -#define __USE_GNU -#include -#undef __USE_GNU -#include -#define MIN(x,y) ((x) < (y) ? (x) : (y)) -#endif /* not _TALLOC_SAMBA3 */ - -/* use this to force every realloc to change the pointer, to stress test - code that might not cope */ -#define ALWAYS_REALLOC 0 - - -#define MAX_TALLOC_SIZE 0x10000000 -#define TALLOC_MAGIC 0xe814ec70 -#define TALLOC_FLAG_FREE 0x01 -#define TALLOC_FLAG_LOOP 0x02 -#define TALLOC_FLAG_POOL 0x04 /* This is a talloc pool */ -#define TALLOC_FLAG_POOLMEM 0x08 /* This is allocated in a pool */ -#define TALLOC_MAGIC_REFERENCE ((const char *)1) - -/* by default we abort when given a bad pointer (such as when talloc_free() is called - on a pointer that came from malloc() */ -#ifndef TALLOC_ABORT -#define TALLOC_ABORT(reason) abort() -#endif - -#ifndef discard_const_p -#if defined(__intptr_t_defined) || defined(HAVE_INTPTR_T) -# define discard_const_p(type, ptr) ((type *)((intptr_t)(ptr))) -#else -# define discard_const_p(type, ptr) ((type *)(ptr)) -#endif -#endif - -/* these macros gain us a few percent of speed on gcc */ -#if (__GNUC__ >= 3) -/* the strange !! is to ensure that __builtin_expect() takes either 0 or 1 - as its first argument */ -#ifndef likely -#define likely(x) __builtin_expect(!!(x), 1) -#endif -#ifndef unlikely -#define unlikely(x) __builtin_expect(!!(x), 0) -#endif -#else -#ifndef likely -#define likely(x) (x) -#endif -#ifndef unlikely -#define unlikely(x) (x) -#endif -#endif - -#ifdef __APPLE__ -/* taken from http://insanecoding.blogspot.com/2007/03/methods-for-safe-string-handling.html */ -size_t strnlen(const char *s, size_t n) -{ - const char *p = (const char *)memchr(s, 0, n); - return(p ? p-s : n); -} -#endif - -/* this null_context is only used if talloc_enable_leak_report() or - talloc_enable_leak_report_full() is called, otherwise it remains - NULL -*/ -static void *null_context; -static void *autofree_context; - -struct talloc_reference_handle { - struct talloc_reference_handle *next, *prev; - void *ptr; -}; - -typedef int (*talloc_destructor_t)(void *); - -struct talloc_chunk { - struct talloc_chunk *next, *prev; - struct talloc_chunk *parent, *child; - struct talloc_reference_handle *refs; - talloc_destructor_t destructor; - const char *name; - size_t size; - unsigned flags; - - /* - * "pool" has dual use: - * - * For the talloc pool itself (i.e. TALLOC_FLAG_POOL is set), "pool" - * marks the end of the currently allocated area. - * - * For members of the pool (i.e. TALLOC_FLAG_POOLMEM is set), "pool" - * is a pointer to the struct talloc_chunk of the pool that it was - * allocated from. This way children can quickly find the pool to chew - * from. - */ - void *pool; -}; - -/* 16 byte alignment seems to keep everyone happy */ -#define TC_HDR_SIZE ((sizeof(struct talloc_chunk)+15)&~15) -#define TC_PTR_FROM_CHUNK(tc) ((void *)(TC_HDR_SIZE + (char*)tc)) - -static void (*talloc_abort_fn)(const char *reason); - -void talloc_set_abort_fn(void (*abort_fn)(const char *reason)) -{ - talloc_abort_fn = abort_fn; -} - -static void talloc_abort(const char *reason) -{ - if (!talloc_abort_fn) { - TALLOC_ABORT(reason); - } - - talloc_abort_fn(reason); -} - -static void talloc_abort_double_free(void) -{ - talloc_abort("Bad talloc magic value - double free"); -} - -static void talloc_abort_unknown_value(void) -{ - talloc_abort("Bad talloc magic value - unknown value"); -} - -/* panic if we get a bad magic value */ -static inline struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr) -{ - const char *pp = (const char *)ptr; - struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, pp - TC_HDR_SIZE); - if (unlikely((tc->flags & (TALLOC_FLAG_FREE | ~0xF)) != TALLOC_MAGIC)) { - if (tc->flags & TALLOC_FLAG_FREE) { - talloc_abort_double_free(); - } else { - talloc_abort_unknown_value(); - } - } - return tc; -} - -/* hook into the front of the list */ -#define _TLIST_ADD(list, p) \ -do { \ - if (!(list)) { \ - (list) = (p); \ - (p)->next = (p)->prev = NULL; \ - } else { \ - (list)->prev = (p); \ - (p)->next = (list); \ - (p)->prev = NULL; \ - (list) = (p); \ - }\ -} while (0) - -/* remove an element from a list - element doesn't have to be in list. */ -#define _TLIST_REMOVE(list, p) \ -do { \ - if ((p) == (list)) { \ - (list) = (p)->next; \ - if (list) (list)->prev = NULL; \ - } else { \ - if ((p)->prev) (p)->prev->next = (p)->next; \ - if ((p)->next) (p)->next->prev = (p)->prev; \ - } \ - if ((p) && ((p) != (list))) (p)->next = (p)->prev = NULL; \ -} while (0) - - -/* - return the parent chunk of a pointer -*/ -static inline struct talloc_chunk *talloc_parent_chunk(const void *ptr) -{ - struct talloc_chunk *tc; - - if (unlikely(ptr == NULL)) { - return NULL; - } - - tc = talloc_chunk_from_ptr(ptr); - while (tc->prev) tc=tc->prev; - - return tc->parent; -} - -void *talloc_parent(const void *ptr) -{ - struct talloc_chunk *tc = talloc_parent_chunk(ptr); - return tc? TC_PTR_FROM_CHUNK(tc) : NULL; -} - -/* - find parents name -*/ -const char *talloc_parent_name(const void *ptr) -{ - struct talloc_chunk *tc = talloc_parent_chunk(ptr); - return tc? tc->name : NULL; -} - -/* - A pool carries an in-pool object count count in the first 16 bytes. - bytes. This is done to support talloc_steal() to a parent outside of the - pool. The count includes the pool itself, so a talloc_free() on a pool will - only destroy the pool if the count has dropped to zero. A talloc_free() of a - pool member will reduce the count, and eventually also call free(3) on the - pool memory. - - The object count is not put into "struct talloc_chunk" because it is only - relevant for talloc pools and the alignment to 16 bytes would increase the - memory footprint of each talloc chunk by those 16 bytes. -*/ - -#define TALLOC_POOL_HDR_SIZE 16 - -static unsigned int *talloc_pool_objectcount(struct talloc_chunk *tc) -{ - return (unsigned int *)((char *)tc + sizeof(struct talloc_chunk)); -} - -/* - Allocate from a pool -*/ - -static struct talloc_chunk *talloc_alloc_pool(struct talloc_chunk *parent, - size_t size) -{ - struct talloc_chunk *pool_ctx = NULL; - size_t space_left; - struct talloc_chunk *result; - size_t chunk_size; - - if (parent == NULL) { - return NULL; - } - - if (parent->flags & TALLOC_FLAG_POOL) { - pool_ctx = parent; - } - else if (parent->flags & TALLOC_FLAG_POOLMEM) { - pool_ctx = (struct talloc_chunk *)parent->pool; - } - - if (pool_ctx == NULL) { - return NULL; - } - - space_left = ((char *)pool_ctx + TC_HDR_SIZE + pool_ctx->size) - - ((char *)pool_ctx->pool); - - /* - * Align size to 16 bytes - */ - chunk_size = ((size + 15) & ~15); - - if (space_left < chunk_size) { - return NULL; - } - - result = (struct talloc_chunk *)pool_ctx->pool; - -#if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_UNDEFINED) - VALGRIND_MAKE_MEM_UNDEFINED(result, size); -#endif - - pool_ctx->pool = (void *)((char *)result + chunk_size); - - result->flags = TALLOC_MAGIC | TALLOC_FLAG_POOLMEM; - result->pool = pool_ctx; - - *talloc_pool_objectcount(pool_ctx) += 1; - - return result; -} - -/* - Allocate a bit of memory as a child of an existing pointer -*/ -static inline void *__talloc(const void *context, size_t size) -{ - struct talloc_chunk *tc = NULL; - - if (unlikely(context == NULL)) { - context = null_context; - } - - if (unlikely(size >= MAX_TALLOC_SIZE)) { - return NULL; - } - - if (context != NULL) { - tc = talloc_alloc_pool(talloc_chunk_from_ptr(context), - TC_HDR_SIZE+size); - } - - if (tc == NULL) { - tc = (struct talloc_chunk *)malloc(TC_HDR_SIZE+size); - if (unlikely(tc == NULL)) return NULL; - tc->flags = TALLOC_MAGIC; - tc->pool = NULL; - } - - tc->size = size; - tc->destructor = NULL; - tc->child = NULL; - tc->name = NULL; - tc->refs = NULL; - - if (likely(context)) { - struct talloc_chunk *parent = talloc_chunk_from_ptr(context); - - if (parent->child) { - parent->child->parent = NULL; - tc->next = parent->child; - tc->next->prev = tc; - } else { - tc->next = NULL; - } - tc->parent = parent; - tc->prev = NULL; - parent->child = tc; - } else { - tc->next = tc->prev = tc->parent = NULL; - } - - return TC_PTR_FROM_CHUNK(tc); -} - -/* - * Create a talloc pool - */ - -void *talloc_pool(const void *context, size_t size) -{ - void *result = __talloc(context, size + TALLOC_POOL_HDR_SIZE); - struct talloc_chunk *tc; - - if (unlikely(result == NULL)) { - return NULL; - } - - tc = talloc_chunk_from_ptr(result); - - tc->flags |= TALLOC_FLAG_POOL; - tc->pool = (char *)result + TALLOC_POOL_HDR_SIZE; - - *talloc_pool_objectcount(tc) = 1; - -#if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS) - VALGRIND_MAKE_MEM_NOACCESS(tc->pool, size); -#endif - - return result; -} - -/* - setup a destructor to be called on free of a pointer - the destructor should return 0 on success, or -1 on failure. - if the destructor fails then the free is failed, and the memory can - be continued to be used -*/ -void _talloc_set_destructor(const void *ptr, int (*destructor)(void *)) -{ - struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); - tc->destructor = destructor; -} - -/* - increase the reference count on a piece of memory. -*/ -int talloc_increase_ref_count(const void *ptr) -{ - if (unlikely(!talloc_reference(null_context, ptr))) { - return -1; - } - return 0; -} - -/* - helper for talloc_reference() - - this is referenced by a function pointer and should not be inline -*/ -static int talloc_reference_destructor(struct talloc_reference_handle *handle) -{ - struct talloc_chunk *ptr_tc = talloc_chunk_from_ptr(handle->ptr); - _TLIST_REMOVE(ptr_tc->refs, handle); - return 0; -} - -/* - more efficient way to add a name to a pointer - the name must point to a - true string constant -*/ -static inline void _talloc_set_name_const(const void *ptr, const char *name) -{ - struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); - tc->name = name; -} - -/* - internal talloc_named_const() -*/ -static inline void *_talloc_named_const(const void *context, size_t size, const char *name) -{ - void *ptr; - - ptr = __talloc(context, size); - if (unlikely(ptr == NULL)) { - return NULL; - } - - _talloc_set_name_const(ptr, name); - - return ptr; -} - -/* - make a secondary reference to a pointer, hanging off the given context. - the pointer remains valid until both the original caller and this given - context are freed. - - the major use for this is when two different structures need to reference the - same underlying data, and you want to be able to free the two instances separately, - and in either order -*/ -void *_talloc_reference(const void *context, const void *ptr) -{ - struct talloc_chunk *tc; - struct talloc_reference_handle *handle; - if (unlikely(ptr == NULL)) return NULL; - - tc = talloc_chunk_from_ptr(ptr); - handle = (struct talloc_reference_handle *)_talloc_named_const(context, - sizeof(struct talloc_reference_handle), - TALLOC_MAGIC_REFERENCE); - if (unlikely(handle == NULL)) return NULL; - - /* note that we hang the destructor off the handle, not the - main context as that allows the caller to still setup their - own destructor on the context if they want to */ - talloc_set_destructor(handle, talloc_reference_destructor); - handle->ptr = discard_const_p(void, ptr); - _TLIST_ADD(tc->refs, handle); - return handle->ptr; -} - - -/* - internal talloc_free call -*/ -static inline int _talloc_free(void *ptr) -{ - struct talloc_chunk *tc; - - if (unlikely(ptr == NULL)) { - return -1; - } - - tc = talloc_chunk_from_ptr(ptr); - - if (unlikely(tc->refs)) { - int is_child; - /* check this is a reference from a child or grantchild - * back to it's parent or grantparent - * - * in that case we need to remove the reference and - * call another instance of talloc_free() on the current - * pointer. - */ - is_child = talloc_is_parent(tc->refs, ptr); - _talloc_free(tc->refs); - if (is_child) { - return _talloc_free(ptr); - } - return -1; - } - - if (unlikely(tc->flags & TALLOC_FLAG_LOOP)) { - /* we have a free loop - stop looping */ - return 0; - } - - if (unlikely(tc->destructor)) { - talloc_destructor_t d = tc->destructor; - if (d == (talloc_destructor_t)-1) { - return -1; - } - tc->destructor = (talloc_destructor_t)-1; - if (d(ptr) == -1) { - tc->destructor = d; - return -1; - } - tc->destructor = NULL; - } - - if (tc->parent) { - _TLIST_REMOVE(tc->parent->child, tc); - if (tc->parent->child) { - tc->parent->child->parent = tc->parent; - } - } else { - if (tc->prev) tc->prev->next = tc->next; - if (tc->next) tc->next->prev = tc->prev; - } - - tc->flags |= TALLOC_FLAG_LOOP; - - while (tc->child) { - /* we need to work out who will own an abandoned child - if it cannot be freed. In priority order, the first - choice is owner of any remaining reference to this - pointer, the second choice is our parent, and the - final choice is the null context. */ - void *child = TC_PTR_FROM_CHUNK(tc->child); - const void *new_parent = null_context; - if (unlikely(tc->child->refs)) { - struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs); - if (p) new_parent = TC_PTR_FROM_CHUNK(p); - } - if (unlikely(_talloc_free(child) == -1)) { - if (new_parent == null_context) { - struct talloc_chunk *p = talloc_parent_chunk(ptr); - if (p) new_parent = TC_PTR_FROM_CHUNK(p); - } - talloc_steal(new_parent, child); - } - } - - tc->flags |= TALLOC_FLAG_FREE; - - if (tc->flags & (TALLOC_FLAG_POOL|TALLOC_FLAG_POOLMEM)) { - struct talloc_chunk *pool; - unsigned int *pool_object_count; - - pool = (tc->flags & TALLOC_FLAG_POOL) - ? tc : (struct talloc_chunk *)tc->pool; - - pool_object_count = talloc_pool_objectcount(pool); - - if (*pool_object_count == 0) { - talloc_abort("Pool object count zero!"); - } - - *pool_object_count -= 1; - - if (*pool_object_count == 0) { - free(pool); - } - } - else { - free(tc); - } - return 0; -} - -/* - move a lump of memory from one talloc context to another return the - ptr on success, or NULL if it could not be transferred. - passing NULL as ptr will always return NULL with no side effects. -*/ -void *_talloc_steal(const void *new_ctx, const void *ptr) -{ - struct talloc_chunk *tc, *new_tc; - - if (unlikely(!ptr)) { - return NULL; - } - - if (unlikely(new_ctx == NULL)) { - new_ctx = null_context; - } - - tc = talloc_chunk_from_ptr(ptr); - - if (unlikely(new_ctx == NULL)) { - if (tc->parent) { - _TLIST_REMOVE(tc->parent->child, tc); - if (tc->parent->child) { - tc->parent->child->parent = tc->parent; - } - } else { - if (tc->prev) tc->prev->next = tc->next; - if (tc->next) tc->next->prev = tc->prev; - } - - tc->parent = tc->next = tc->prev = NULL; - return discard_const_p(void, ptr); - } - - new_tc = talloc_chunk_from_ptr(new_ctx); - - if (unlikely(tc == new_tc || tc->parent == new_tc)) { - return discard_const_p(void, ptr); - } - - if (tc->parent) { - _TLIST_REMOVE(tc->parent->child, tc); - if (tc->parent->child) { - tc->parent->child->parent = tc->parent; - } - } else { - if (tc->prev) tc->prev->next = tc->next; - if (tc->next) tc->next->prev = tc->prev; - } - - tc->parent = new_tc; - if (new_tc->child) new_tc->child->parent = NULL; - _TLIST_ADD(new_tc->child, tc); - - return discard_const_p(void, ptr); -} - - - -/* - remove a secondary reference to a pointer. This undo's what - talloc_reference() has done. The context and pointer arguments - must match those given to a talloc_reference() -*/ -static inline int talloc_unreference(const void *context, const void *ptr) -{ - struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); - struct talloc_reference_handle *h; - - if (unlikely(context == NULL)) { - context = null_context; - } - - for (h=tc->refs;h;h=h->next) { - struct talloc_chunk *p = talloc_parent_chunk(h); - if (p == NULL) { - if (context == NULL) break; - } else if (TC_PTR_FROM_CHUNK(p) == context) { - break; - } - } - if (h == NULL) { - return -1; - } - - return _talloc_free(h); -} - -/* - remove a specific parent context from a pointer. This is a more - controlled varient of talloc_free() -*/ -int talloc_unlink(const void *context, void *ptr) -{ - struct talloc_chunk *tc_p, *new_p; - void *new_parent; - - if (ptr == NULL) { - return -1; - } - - if (context == NULL) { - context = null_context; - } - - if (talloc_unreference(context, ptr) == 0) { - return 0; - } - - if (context == NULL) { - if (talloc_parent_chunk(ptr) != NULL) { - return -1; - } - } else { - if (talloc_chunk_from_ptr(context) != talloc_parent_chunk(ptr)) { - return -1; - } - } - - tc_p = talloc_chunk_from_ptr(ptr); - - if (tc_p->refs == NULL) { - return _talloc_free(ptr); - } - - new_p = talloc_parent_chunk(tc_p->refs); - if (new_p) { - new_parent = TC_PTR_FROM_CHUNK(new_p); - } else { - new_parent = NULL; - } - - if (talloc_unreference(new_parent, ptr) != 0) { - return -1; - } - - talloc_steal(new_parent, ptr); - - return 0; -} - -/* - add a name to an existing pointer - va_list version -*/ -static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); - -static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) -{ - struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); - tc->name = talloc_vasprintf(ptr, fmt, ap); - if (likely(tc->name)) { - _talloc_set_name_const(tc->name, ".name"); - } - return tc->name; -} - -/* - add a name to an existing pointer -*/ -const char *talloc_set_name(const void *ptr, const char *fmt, ...) -{ - const char *name; - va_list ap; - va_start(ap, fmt); - name = talloc_set_name_v(ptr, fmt, ap); - va_end(ap); - return name; -} - - -/* - create a named talloc pointer. Any talloc pointer can be named, and - talloc_named() operates just like talloc() except that it allows you - to name the pointer. -*/ -void *talloc_named(const void *context, size_t size, const char *fmt, ...) -{ - va_list ap; - void *ptr; - const char *name; - - ptr = __talloc(context, size); - if (unlikely(ptr == NULL)) return NULL; - - va_start(ap, fmt); - name = talloc_set_name_v(ptr, fmt, ap); - va_end(ap); - - if (unlikely(name == NULL)) { - _talloc_free(ptr); - return NULL; - } - - return ptr; -} - -/* - return the name of a talloc ptr, or "UNNAMED" -*/ -const char *talloc_get_name(const void *ptr) -{ - struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); - if (unlikely(tc->name == TALLOC_MAGIC_REFERENCE)) { - return ".reference"; - } - if (likely(tc->name)) { - return tc->name; - } - return "UNNAMED"; -} - - -/* - check if a pointer has the given name. If it does, return the pointer, - otherwise return NULL -*/ -void *talloc_check_name(const void *ptr, const char *name) -{ - const char *pname; - if (unlikely(ptr == NULL)) return NULL; - pname = talloc_get_name(ptr); - if (likely(pname == name || strcmp(pname, name) == 0)) { - return discard_const_p(void, ptr); - } - return NULL; -} - -static void talloc_abort_type_missmatch(const char *location, - const char *name, - const char *expected) -{ - const char *reason; - - reason = talloc_asprintf(NULL, - "%s: Type mismatch: name[%s] expected[%s]", - location, - name?name:"NULL", - expected); - if (!reason) { - reason = "Type mismatch"; - } - - talloc_abort(reason); -} - -void *_talloc_get_type_abort(const void *ptr, const char *name, const char *location) -{ - const char *pname; - - if (unlikely(ptr == NULL)) { - talloc_abort_type_missmatch(location, NULL, name); - return NULL; - } - - pname = talloc_get_name(ptr); - if (likely(pname == name || strcmp(pname, name) == 0)) { - return discard_const_p(void, ptr); - } - - talloc_abort_type_missmatch(location, pname, name); - return NULL; -} - -/* - this is for compatibility with older versions of talloc -*/ -void *talloc_init(const char *fmt, ...) -{ - va_list ap; - void *ptr; - const char *name; - - /* - * samba3 expects talloc_report_depth_cb(NULL, ...) - * reports all talloc'ed memory, so we need to enable - * null_tracking - */ - talloc_enable_null_tracking(); - - ptr = __talloc(NULL, 0); - if (unlikely(ptr == NULL)) return NULL; - - va_start(ap, fmt); - name = talloc_set_name_v(ptr, fmt, ap); - va_end(ap); - - if (unlikely(name == NULL)) { - _talloc_free(ptr); - return NULL; - } - - return ptr; -} - -/* - this is a replacement for the Samba3 talloc_destroy_pool functionality. It - should probably not be used in new code. It's in here to keep the talloc - code consistent across Samba 3 and 4. -*/ -void talloc_free_children(void *ptr) -{ - struct talloc_chunk *tc; - - if (unlikely(ptr == NULL)) { - return; - } - - tc = talloc_chunk_from_ptr(ptr); - - while (tc->child) { - /* we need to work out who will own an abandoned child - if it cannot be freed. In priority order, the first - choice is owner of any remaining reference to this - pointer, the second choice is our parent, and the - final choice is the null context. */ - void *child = TC_PTR_FROM_CHUNK(tc->child); - const void *new_parent = null_context; - if (unlikely(tc->child->refs)) { - struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs); - if (p) new_parent = TC_PTR_FROM_CHUNK(p); - } - if (unlikely(_talloc_free(child) == -1)) { - if (new_parent == null_context) { - struct talloc_chunk *p = talloc_parent_chunk(ptr); - if (p) new_parent = TC_PTR_FROM_CHUNK(p); - } - talloc_steal(new_parent, child); - } - } - - if ((tc->flags & TALLOC_FLAG_POOL) - && (*talloc_pool_objectcount(tc) == 1)) { - tc->pool = ((char *)tc + TC_HDR_SIZE + TALLOC_POOL_HDR_SIZE); -#if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS) - VALGRIND_MAKE_MEM_NOACCESS( - tc->pool, tc->size - TALLOC_POOL_HDR_SIZE); -#endif - } -} - -/* - Allocate a bit of memory as a child of an existing pointer -*/ -void *_talloc(const void *context, size_t size) -{ - return __talloc(context, size); -} - -/* - externally callable talloc_set_name_const() -*/ -void talloc_set_name_const(const void *ptr, const char *name) -{ - _talloc_set_name_const(ptr, name); -} - -/* - create a named talloc pointer. Any talloc pointer can be named, and - talloc_named() operates just like talloc() except that it allows you - to name the pointer. -*/ -void *talloc_named_const(const void *context, size_t size, const char *name) -{ - return _talloc_named_const(context, size, name); -} - -/* - free a talloc pointer. This also frees all child pointers of this - pointer recursively - - return 0 if the memory is actually freed, otherwise -1. The memory - will not be freed if the ref_count is > 1 or the destructor (if - any) returns non-zero -*/ -int talloc_free(void *ptr) -{ - return _talloc_free(ptr); -} - - - -/* - A talloc version of realloc. The context argument is only used if - ptr is NULL -*/ -void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name) -{ - struct talloc_chunk *tc; - void *new_ptr; - bool malloced = false; - - /* size zero is equivalent to free() */ - if (unlikely(size == 0)) { - _talloc_free(ptr); - return NULL; - } - - if (unlikely(size >= MAX_TALLOC_SIZE)) { - return NULL; - } - - /* realloc(NULL) is equivalent to malloc() */ - if (ptr == NULL) { - return _talloc_named_const(context, size, name); - } - - tc = talloc_chunk_from_ptr(ptr); - - /* don't allow realloc on referenced pointers */ - if (unlikely(tc->refs)) { - return NULL; - } - - /* don't let anybody try to realloc a talloc_pool */ - if (unlikely(tc->flags & TALLOC_FLAG_POOL)) { - return NULL; - } - - /* don't shrink if we have less than 1k to gain */ - if ((size < tc->size) && ((tc->size - size) < 1024)) { - tc->size = size; - return ptr; - } - - /* by resetting magic we catch users of the old memory */ - tc->flags |= TALLOC_FLAG_FREE; - -#if ALWAYS_REALLOC - new_ptr = malloc(size + TC_HDR_SIZE); - if (new_ptr) { - memcpy(new_ptr, tc, tc->size + TC_HDR_SIZE); - free(tc); - } -#else - if (tc->flags & TALLOC_FLAG_POOLMEM) { - - new_ptr = talloc_alloc_pool(tc, size + TC_HDR_SIZE); - *talloc_pool_objectcount((struct talloc_chunk *) - (tc->pool)) -= 1; - - if (new_ptr == NULL) { - new_ptr = malloc(TC_HDR_SIZE+size); - malloced = true; - } - - if (new_ptr) { - memcpy(new_ptr, tc, MIN(tc->size,size) + TC_HDR_SIZE); - } - } - else { - new_ptr = realloc(tc, size + TC_HDR_SIZE); - } -#endif - if (unlikely(!new_ptr)) { - tc->flags &= ~TALLOC_FLAG_FREE; - return NULL; - } - - tc = (struct talloc_chunk *)new_ptr; - tc->flags &= ~TALLOC_FLAG_FREE; - if (malloced) { - tc->flags &= ~TALLOC_FLAG_POOLMEM; - } - if (tc->parent) { - tc->parent->child = tc; - } - if (tc->child) { - tc->child->parent = tc; - } - - if (tc->prev) { - tc->prev->next = tc; - } - if (tc->next) { - tc->next->prev = tc; - } - - tc->size = size; - _talloc_set_name_const(TC_PTR_FROM_CHUNK(tc), name); - - return TC_PTR_FROM_CHUNK(tc); -} - -/* - a wrapper around talloc_steal() for situations where you are moving a pointer - between two structures, and want the old pointer to be set to NULL -*/ -void *_talloc_move(const void *new_ctx, const void *_pptr) -{ - const void **pptr = discard_const_p(const void *,_pptr); - void *ret = _talloc_steal(new_ctx, *pptr); - (*pptr) = NULL; - return ret; -} - -/* - return the total size of a talloc pool (subtree) -*/ -size_t talloc_total_size(const void *ptr) -{ - size_t total = 0; - struct talloc_chunk *c, *tc; - - if (ptr == NULL) { - ptr = null_context; - } - if (ptr == NULL) { - return 0; - } - - tc = talloc_chunk_from_ptr(ptr); - - if (tc->flags & TALLOC_FLAG_LOOP) { - return 0; - } - - tc->flags |= TALLOC_FLAG_LOOP; - - total = tc->size; - for (c=tc->child;c;c=c->next) { - total += talloc_total_size(TC_PTR_FROM_CHUNK(c)); - } - - tc->flags &= ~TALLOC_FLAG_LOOP; - - return total; -} - -/* - return the total number of blocks in a talloc pool (subtree) -*/ -size_t talloc_total_blocks(const void *ptr) -{ - size_t total = 0; - struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr); - - if (tc->flags & TALLOC_FLAG_LOOP) { - return 0; - } - - tc->flags |= TALLOC_FLAG_LOOP; - - total++; - for (c=tc->child;c;c=c->next) { - total += talloc_total_blocks(TC_PTR_FROM_CHUNK(c)); - } - - tc->flags &= ~TALLOC_FLAG_LOOP; - - return total; -} - -/* - return the number of external references to a pointer -*/ -size_t talloc_reference_count(const void *ptr) -{ - struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); - struct talloc_reference_handle *h; - size_t ret = 0; - - for (h=tc->refs;h;h=h->next) { - ret++; - } - return ret; -} - -/* - report on memory usage by all children of a pointer, giving a full tree view -*/ -void talloc_report_depth_cb(const void *ptr, int depth, int max_depth, - void (*callback)(const void *ptr, - int depth, int max_depth, - int is_ref, - void *private_data), - void *private_data) -{ - struct talloc_chunk *c, *tc; - - if (ptr == NULL) { - ptr = null_context; - } - if (ptr == NULL) return; - - tc = talloc_chunk_from_ptr(ptr); - - if (tc->flags & TALLOC_FLAG_LOOP) { - return; - } - - callback(ptr, depth, max_depth, 0, private_data); - - if (max_depth >= 0 && depth >= max_depth) { - return; - } - - tc->flags |= TALLOC_FLAG_LOOP; - for (c=tc->child;c;c=c->next) { - if (c->name == TALLOC_MAGIC_REFERENCE) { - struct talloc_reference_handle *h = (struct talloc_reference_handle *)TC_PTR_FROM_CHUNK(c); - callback(h->ptr, depth + 1, max_depth, 1, private_data); - } else { - talloc_report_depth_cb(TC_PTR_FROM_CHUNK(c), depth + 1, max_depth, callback, private_data); - } - } - tc->flags &= ~TALLOC_FLAG_LOOP; -} - -static void talloc_report_depth_FILE_helper(const void *ptr, int depth, int max_depth, int is_ref, void *_f) -{ - const char *name = talloc_get_name(ptr); - FILE *f = (FILE *)_f; - - if (is_ref) { - fprintf(f, "%*sreference to: %s\n", depth*4, "", name); - return; - } - - if (depth == 0) { - fprintf(f,"%stalloc report on '%s' (total %6lu bytes in %3lu blocks)\n", - (max_depth < 0 ? "full " :""), name, - (unsigned long)talloc_total_size(ptr), - (unsigned long)talloc_total_blocks(ptr)); - return; - } - - fprintf(f, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d) %p\n", - depth*4, "", - name, - (unsigned long)talloc_total_size(ptr), - (unsigned long)talloc_total_blocks(ptr), - (int)talloc_reference_count(ptr), ptr); - -#if 0 - fprintf(f, "content: "); - if (talloc_total_size(ptr)) { - int tot = talloc_total_size(ptr); - int i; - - for (i = 0; i < tot; i++) { - if ((((char *)ptr)[i] > 31) && (((char *)ptr)[i] < 126)) { - fprintf(f, "%c", ((char *)ptr)[i]); - } else { - fprintf(f, "~%02x", ((char *)ptr)[i]); - } - } - } - fprintf(f, "\n"); -#endif -} - -/* - report on memory usage by all children of a pointer, giving a full tree view -*/ -void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f) -{ - talloc_report_depth_cb(ptr, depth, max_depth, talloc_report_depth_FILE_helper, f); - fflush(f); -} - -/* - report on memory usage by all children of a pointer, giving a full tree view -*/ -void talloc_report_full(const void *ptr, FILE *f) -{ - talloc_report_depth_file(ptr, 0, -1, f); -} - -/* - report on memory usage by all children of a pointer -*/ -void talloc_report(const void *ptr, FILE *f) -{ - talloc_report_depth_file(ptr, 0, 1, f); -} - -/* - report on any memory hanging off the null context -*/ -static void talloc_report_null(void) -{ - if (talloc_total_size(null_context) != 0) { - talloc_report(null_context, stderr); - } -} - -/* - report on any memory hanging off the null context -*/ -static void talloc_report_null_full(void) -{ - if (talloc_total_size(null_context) != 0) { - talloc_report_full(null_context, stderr); - } -} - -/* - enable tracking of the NULL context -*/ -void talloc_enable_null_tracking(void) -{ - if (null_context == NULL) { - null_context = _talloc_named_const(NULL, 0, "null_context"); - } -} - -/* - disable tracking of the NULL context -*/ -void talloc_disable_null_tracking(void) -{ - _talloc_free(null_context); - null_context = NULL; -} - -/* - enable leak reporting on exit -*/ -void talloc_enable_leak_report(void) -{ - talloc_enable_null_tracking(); - atexit(talloc_report_null); -} - -/* - enable full leak reporting on exit -*/ -void talloc_enable_leak_report_full(void) -{ - talloc_enable_null_tracking(); - atexit(talloc_report_null_full); -} - -/* - talloc and zero memory. -*/ -void *_talloc_zero(const void *ctx, size_t size, const char *name) -{ - void *p = _talloc_named_const(ctx, size, name); - - if (p) { - memset(p, '\0', size); - } - - return p; -} - -/* - memdup with a talloc. -*/ -void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name) -{ - void *newp = _talloc_named_const(t, size, name); - - if (likely(newp)) { - memcpy(newp, p, size); - } - - return newp; -} - -static inline char *__talloc_strlendup(const void *t, const char *p, size_t len) -{ - char *ret; - - ret = (char *)__talloc(t, len + 1); - if (unlikely(!ret)) return NULL; - - memcpy(ret, p, len); - ret[len] = 0; - - _talloc_set_name_const(ret, ret); - return ret; -} - -/* - strdup with a talloc -*/ -char *talloc_strdup(const void *t, const char *p) -{ - if (unlikely(!p)) return NULL; - return __talloc_strlendup(t, p, strlen(p)); -} - -/* - strndup with a talloc -*/ -char *talloc_strndup(const void *t, const char *p, size_t n) -{ - if (unlikely(!p)) return NULL; - return __talloc_strlendup(t, p, strnlen(p, n)); -} - -static inline char *__talloc_strlendup_append(char *s, size_t slen, - const char *a, size_t alen) -{ - char *ret; - - ret = talloc_realloc(NULL, s, char, slen + alen + 1); - if (unlikely(!ret)) return NULL; - - /* append the string and the trailing \0 */ - memcpy(&ret[slen], a, alen); - ret[slen+alen] = 0; - - _talloc_set_name_const(ret, ret); - return ret; -} - -/* - * Appends at the end of the string. - */ -char *talloc_strdup_append(char *s, const char *a) -{ - if (unlikely(!s)) { - return talloc_strdup(NULL, a); - } - - if (unlikely(!a)) { - return s; - } - - return __talloc_strlendup_append(s, strlen(s), a, strlen(a)); -} - -/* - * Appends at the end of the talloc'ed buffer, - * not the end of the string. - */ -char *talloc_strdup_append_buffer(char *s, const char *a) -{ - size_t slen; - - if (unlikely(!s)) { - return talloc_strdup(NULL, a); - } - - if (unlikely(!a)) { - return s; - } - - slen = talloc_get_size(s); - if (likely(slen > 0)) { - slen--; - } - - return __talloc_strlendup_append(s, slen, a, strlen(a)); -} - -/* - * Appends at the end of the string. - */ -char *talloc_strndup_append(char *s, const char *a, size_t n) -{ - if (unlikely(!s)) { - return talloc_strdup(NULL, a); - } - - if (unlikely(!a)) { - return s; - } - - return __talloc_strlendup_append(s, strlen(s), a, strnlen(a, n)); -} - -/* - * Appends at the end of the talloc'ed buffer, - * not the end of the string. - */ -char *talloc_strndup_append_buffer(char *s, const char *a, size_t n) -{ - size_t slen; - - if (unlikely(!s)) { - return talloc_strdup(NULL, a); - } - - if (unlikely(!a)) { - return s; - } - - slen = talloc_get_size(s); - if (likely(slen > 0)) { - slen--; - } - - return __talloc_strlendup_append(s, slen, a, strnlen(a, n)); -} - -#ifndef HAVE_VA_COPY -#ifdef HAVE___VA_COPY -#define va_copy(dest, src) __va_copy(dest, src) -#else -#define va_copy(dest, src) (dest) = (src) -#endif -#endif - -char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) -{ - int len; - char *ret; - va_list ap2; - char c; - - /* this call looks strange, but it makes it work on older solaris boxes */ - va_copy(ap2, ap); - len = vsnprintf(&c, 1, fmt, ap2); - va_end(ap2); - if (unlikely(len < 0)) { - return NULL; - } - - ret = (char *)__talloc(t, len+1); - if (unlikely(!ret)) return NULL; - - va_copy(ap2, ap); - vsnprintf(ret, len+1, fmt, ap2); - va_end(ap2); - - _talloc_set_name_const(ret, ret); - return ret; -} - - -/* - Perform string formatting, and return a pointer to newly allocated - memory holding the result, inside a memory pool. - */ -char *talloc_asprintf(const void *t, const char *fmt, ...) -{ - va_list ap; - char *ret; - - va_start(ap, fmt); - ret = talloc_vasprintf(t, fmt, ap); - va_end(ap); - return ret; -} - -static inline char *__talloc_vaslenprintf_append(char *s, size_t slen, - const char *fmt, va_list ap) - PRINTF_ATTRIBUTE(3,0); - -static inline char *__talloc_vaslenprintf_append(char *s, size_t slen, - const char *fmt, va_list ap) -{ - ssize_t alen; - va_list ap2; - char c; - - va_copy(ap2, ap); - alen = vsnprintf(&c, 1, fmt, ap2); - va_end(ap2); - - if (alen <= 0) { - /* Either the vsnprintf failed or the format resulted in - * no characters being formatted. In the former case, we - * ought to return NULL, in the latter we ought to return - * the original string. Most current callers of this - * function expect it to never return NULL. - */ - return s; - } - - s = talloc_realloc(NULL, s, char, slen + alen + 1); - if (!s) return NULL; - - va_copy(ap2, ap); - vsnprintf(s + slen, alen + 1, fmt, ap2); - va_end(ap2); - - _talloc_set_name_const(s, s); - return s; -} - -/** - * Realloc @p s to append the formatted result of @p fmt and @p ap, - * and return @p s, which may have moved. Good for gradually - * accumulating output into a string buffer. Appends at the end - * of the string. - **/ -char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) -{ - if (unlikely(!s)) { - return talloc_vasprintf(NULL, fmt, ap); - } - - return __talloc_vaslenprintf_append(s, strlen(s), fmt, ap); -} - -/** - * Realloc @p s to append the formatted result of @p fmt and @p ap, - * and return @p s, which may have moved. Always appends at the - * end of the talloc'ed buffer, not the end of the string. - **/ -char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap) -{ - size_t slen; - - if (unlikely(!s)) { - return talloc_vasprintf(NULL, fmt, ap); - } - - slen = talloc_get_size(s); - if (likely(slen > 0)) { - slen--; - } - - return __talloc_vaslenprintf_append(s, slen, fmt, ap); -} - -/* - Realloc @p s to append the formatted result of @p fmt and return @p - s, which may have moved. Good for gradually accumulating output - into a string buffer. - */ -char *talloc_asprintf_append(char *s, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - s = talloc_vasprintf_append(s, fmt, ap); - va_end(ap); - return s; -} - -/* - Realloc @p s to append the formatted result of @p fmt and return @p - s, which may have moved. Good for gradually accumulating output - into a buffer. - */ -char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - s = talloc_vasprintf_append_buffer(s, fmt, ap); - va_end(ap); - return s; -} - -/* - alloc an array, checking for integer overflow in the array size -*/ -void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name) -{ - if (count >= MAX_TALLOC_SIZE/el_size) { - return NULL; - } - return _talloc_named_const(ctx, el_size * count, name); -} - -/* - alloc an zero array, checking for integer overflow in the array size -*/ -void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name) -{ - if (count >= MAX_TALLOC_SIZE/el_size) { - return NULL; - } - return _talloc_zero(ctx, el_size * count, name); -} - -/* - realloc an array, checking for integer overflow in the array size -*/ -void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name) -{ - if (count >= MAX_TALLOC_SIZE/el_size) { - return NULL; - } - return _talloc_realloc(ctx, ptr, el_size * count, name); -} - -/* - a function version of talloc_realloc(), so it can be passed as a function pointer - to libraries that want a realloc function (a realloc function encapsulates - all the basic capabilities of an allocation library, which is why this is useful) -*/ -void *talloc_realloc_fn(const void *context, void *ptr, size_t size) -{ - return _talloc_realloc(context, ptr, size, NULL); -} - - -static int talloc_autofree_destructor(void *ptr) -{ - autofree_context = NULL; - return 0; -} - -static void talloc_autofree(void) -{ - _talloc_free(autofree_context); -} - -/* - return a context which will be auto-freed on exit - this is useful for reducing the noise in leak reports -*/ -void *talloc_autofree_context(void) -{ - if (autofree_context == NULL) { - autofree_context = _talloc_named_const(NULL, 0, "autofree_context"); - talloc_set_destructor(autofree_context, talloc_autofree_destructor); - atexit(talloc_autofree); - } - return autofree_context; -} - -size_t talloc_get_size(const void *context) -{ - struct talloc_chunk *tc; - - if (context == NULL) - return 0; - - tc = talloc_chunk_from_ptr(context); - - return tc->size; -} - -/* - find a parent of this context that has the given name, if any -*/ -void *talloc_find_parent_byname(const void *context, const char *name) -{ - struct talloc_chunk *tc; - - if (context == NULL) { - return NULL; - } - - tc = talloc_chunk_from_ptr(context); - while (tc) { - if (tc->name && strcmp(tc->name, name) == 0) { - return TC_PTR_FROM_CHUNK(tc); - } - while (tc && tc->prev) tc = tc->prev; - if (tc) { - tc = tc->parent; - } - } - return NULL; -} - -/* - show the parentage of a context -*/ -void talloc_show_parents(const void *context, FILE *file) -{ - struct talloc_chunk *tc; - - if (context == NULL) { - fprintf(file, "talloc no parents for NULL\n"); - return; - } - - tc = talloc_chunk_from_ptr(context); - fprintf(file, "talloc parents of '%s'\n", talloc_get_name(context)); - while (tc) { - fprintf(file, "\t'%s'\n", talloc_get_name(TC_PTR_FROM_CHUNK(tc))); - while (tc && tc->prev) tc = tc->prev; - if (tc) { - tc = tc->parent; - } - } - fflush(file); -} - -/* - return 1 if ptr is a parent of context -*/ -int talloc_is_parent(const void *context, const void *ptr) -{ - struct talloc_chunk *tc; - - if (context == NULL) { - return 0; - } - - tc = talloc_chunk_from_ptr(context); - while (tc) { - if (TC_PTR_FROM_CHUNK(tc) == ptr) return 1; - while (tc && tc->prev) tc = tc->prev; - if (tc) { - tc = tc->parent; - } - } - return 0; -} diff --git a/src/vty/buffer.c b/src/vty/buffer.c index e385f9f..ecfb961 100644 --- a/src/vty/buffer.c +++ b/src/vty/buffer.c @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include diff --git a/src/vty/command.c b/src/vty/command.c index 5dc1dd4..b8ece35 100644 --- a/src/vty/command.c +++ b/src/vty/command.c @@ -38,7 +38,7 @@ Boston, MA 02111-1307, USA. */ #include #include -#include +#include #define CONFIGFILE_MASK 022 diff --git a/src/vty/logging_vty.c b/src/vty/logging_vty.c index b037a5b..753a6a5 100644 --- a/src/vty/logging_vty.c +++ b/src/vty/logging_vty.c @@ -24,7 +24,7 @@ #include "../../config.h" -#include +#include #include #include diff --git a/src/vty/telnet_interface.c b/src/vty/telnet_interface.c index c08a256..8670a27 100644 --- a/src/vty/telnet_interface.c +++ b/src/vty/telnet_interface.c @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include diff --git a/src/vty/utils.c b/src/vty/utils.c index 7797e62..cfb60f8 100644 --- a/src/vty/utils.c +++ b/src/vty/utils.c @@ -24,7 +24,7 @@ #include #include -#include +#include #include #include diff --git a/src/vty/vector.c b/src/vty/vector.c index 4012f24..6a4f4bd 100644 --- a/src/vty/vector.c +++ b/src/vty/vector.c @@ -24,7 +24,7 @@ #include #include -#include +#include #include void *tall_vty_vec_ctx; diff --git a/src/vty/vty.c b/src/vty/vty.c index a1f0304..4dc0bf9 100644 --- a/src/vty/vty.c +++ b/src/vty/vty.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include #define SYSCONFDIR "/usr/local/etc" -- 1.7.2.5 From pablo at gnumonks.org Tue Jun 14 17:14:50 2011 From: pablo at gnumonks.org (pablo at gnumonks.org) Date: Tue, 14 Jun 2011 19:14:50 +0200 Subject: [PATCH 2/4] [libosmo-sccp] src: remove our own copy of talloc In-Reply-To: <1308071692-6041-1-git-send-email-pablo@gnumonks.org> References: <1308071692-6041-1-git-send-email-pablo@gnumonks.org> Message-ID: <1308071692-6041-3-git-send-email-pablo@gnumonks.org> From: Pablo Neira Ayuso With this patch, we check for the libtalloc version installed in the system. This patch also replaces all references to: #include by: #include I did this with this command: find ./ -type f -exec sed -i "s/osmocom\/core\/talloc.h/talloc.h/g" {} \; Make sure you skip .git directory in this replacement, otherwise you'll get a corrupted git repository. --- configure.ac | 1 + src/Makefile.am | 4 ++++ src/m2ua_msg.c | 2 +- src/sccp.c | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index b16b1f3..b2ae81a 100644 --- a/configure.ac +++ b/configure.ac @@ -15,6 +15,7 @@ AC_PROG_INSTALL AC_PROG_RANLIB PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.3.0) +PKG_CHECK_MODULES([LIBTALLOC], [talloc >= 2.0.1]) # The following test is taken from WebKit's webkit.m4 saved_CFLAGS="$CFLAGS" diff --git a/src/Makefile.am b/src/Makefile.am index c7451ad..59d511d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -4,6 +4,10 @@ AM_CFLAGS=-Wall $(LIBOSMOCORE_CFLAGS) sccpdir = $(libdir) sccp_LIBRARIES = libsccp.a libmtp.a libm2ua.a +libsccp_la_LIBADD = ${LIBTALLOC_LIBS} +libmtp_la_LIBADD = ${LIBTALLOC_LIBS} +libm2ua_la_LIBADD = ${LIBTALLOC_LIBS} + libsccp_a_SOURCES = sccp.c libmtp_a_SOURCES = mtp_pcap.c libm2ua_a_SOURCES = m2ua_msg.c diff --git a/src/m2ua_msg.c b/src/m2ua_msg.c index c04586f..6156a71 100644 --- a/src/m2ua_msg.c +++ b/src/m2ua_msg.c @@ -20,7 +20,7 @@ #include #include -#include +#include #include diff --git a/src/sccp.c b/src/sccp.c index e061d37..9af36fb 100644 --- a/src/sccp.c +++ b/src/sccp.c @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include -- 1.7.2.5 From pablo at gnumonks.org Tue Jun 14 17:14:51 2011 From: pablo at gnumonks.org (pablo at gnumonks.org) Date: Tue, 14 Jun 2011 19:14:51 +0200 Subject: [PATCH 3/4] [openbsc] src: use standalone libtalloc In-Reply-To: <1308071692-6041-1-git-send-email-pablo@gnumonks.org> References: <1308071692-6041-1-git-send-email-pablo@gnumonks.org> Message-ID: <1308071692-6041-4-git-send-email-pablo@gnumonks.org> From: Pablo Neira Ayuso With this patch, we check for the libtalloc version installed in the system. We don't use our own copy in libosmocore anymore. This patch also replaces all references to: #include by: #include I did this with this command: find ./ -type f -exec sed -i "s/osmocom\/core\/talloc.h/talloc.h/g" {} \; Make sure you skip .git directory in this replacement, otherwise you'll get a corrupted git repository. --- openbsc/configure.ac | 1 + openbsc/src/gprs/gb_proxy.c | 2 +- openbsc/src/gprs/gb_proxy_main.c | 2 +- openbsc/src/gprs/gb_proxy_vty.c | 2 +- openbsc/src/gprs/gprs_gmm.c | 2 +- openbsc/src/gprs/gprs_llc.c | 2 +- openbsc/src/gprs/gprs_llc_vty.c | 2 +- openbsc/src/gprs/gprs_sgsn.c | 2 +- openbsc/src/gprs/gprs_sndcp.c | 2 +- openbsc/src/gprs/gprs_sndcp_vty.c | 2 +- openbsc/src/gprs/sgsn_libgtp.c | 2 +- openbsc/src/gprs/sgsn_main.c | 2 +- openbsc/src/gprs/sgsn_vty.c | 2 +- openbsc/src/ipaccess/ipaccess-config.c | 2 +- openbsc/src/ipaccess/ipaccess-firmware.c | 2 +- openbsc/src/ipaccess/ipaccess-proxy.c | 2 +- openbsc/src/ipaccess/network_listen.c | 2 +- openbsc/src/libabis/e1_input.c | 2 +- openbsc/src/libabis/e1_input_vty.c | 2 +- openbsc/src/libabis/input/dahdi.c | 2 +- openbsc/src/libabis/input/hsl.c | 2 +- openbsc/src/libabis/input/ipaccess.c | 2 +- openbsc/src/libabis/input/lapd.c | 2 +- openbsc/src/libabis/input/misdn.c | 2 +- openbsc/src/libbsc/abis_nm.c | 2 +- openbsc/src/libbsc/abis_nm_vty.c | 2 +- openbsc/src/libbsc/abis_om2000.c | 2 +- openbsc/src/libbsc/abis_om2000_vty.c | 2 +- openbsc/src/libbsc/abis_rsl.c | 2 +- openbsc/src/libbsc/bsc_api.c | 2 +- openbsc/src/libbsc/bsc_init.c | 2 +- openbsc/src/libbsc/bsc_msc.c | 2 +- openbsc/src/libbsc/bsc_rll.c | 2 +- openbsc/src/libbsc/bsc_vty.c | 2 +- openbsc/src/libbsc/chan_alloc.c | 2 +- openbsc/src/libbsc/e1_config.c | 2 +- openbsc/src/libbsc/gsm_subscriber_base.c | 2 +- openbsc/src/libbsc/handover_decision.c | 2 +- openbsc/src/libbsc/handover_logic.c | 2 +- openbsc/src/libbsc/meas_proc.c | 2 +- openbsc/src/libbsc/paging.c | 2 +- openbsc/src/libcommon/common_vty.c | 2 +- openbsc/src/libcommon/debug.c | 2 +- openbsc/src/libcommon/gsm_data.c | 2 +- openbsc/src/libcommon/socket.c | 2 +- openbsc/src/libcommon/talloc_ctx.c | 2 +- openbsc/src/libgb/gprs_bssgp.c | 2 +- openbsc/src/libgb/gprs_bssgp_util.c | 2 +- openbsc/src/libgb/gprs_bssgp_vty.c | 2 +- openbsc/src/libgb/gprs_ns.c | 2 +- openbsc/src/libgb/gprs_ns_frgre.c | 2 +- openbsc/src/libgb/gprs_ns_vty.c | 2 +- openbsc/src/libmgcp/mgcp_protocol.c | 2 +- openbsc/src/libmgcp/mgcp_vty.c | 2 +- openbsc/src/libmsc/db.c | 2 +- openbsc/src/libmsc/gsm_04_08.c | 2 +- openbsc/src/libmsc/gsm_04_11.c | 2 +- openbsc/src/libmsc/gsm_subscriber.c | 2 +- openbsc/src/libmsc/mncc.c | 2 +- openbsc/src/libmsc/mncc_builtin.c | 2 +- openbsc/src/libmsc/mncc_sock.c | 2 +- openbsc/src/libmsc/sms_queue.c | 2 +- openbsc/src/libmsc/token_auth.c | 2 +- openbsc/src/libmsc/transaction.c | 2 +- openbsc/src/libmsc/vty_interface_layer3.c | 2 +- openbsc/src/libtrau/rtp_proxy.c | 2 +- openbsc/src/libtrau/subchan_demux.c | 2 +- openbsc/src/libtrau/trau_mux.c | 2 +- openbsc/src/osmo-bsc/osmo_bsc_main.c | 2 +- openbsc/src/osmo-bsc/osmo_bsc_rf.c | 2 +- openbsc/src/osmo-bsc/osmo_bsc_sccp.c | 2 +- openbsc/src/osmo-bsc/osmo_bsc_vty.c | 2 +- openbsc/src/osmo-bsc_mgcp/mgcp_main.c | 2 +- openbsc/src/osmo-bsc_nat/bsc_filter.c | 2 +- openbsc/src/osmo-bsc_nat/bsc_mgcp_utils.c | 2 +- openbsc/src/osmo-bsc_nat/bsc_nat.c | 2 +- openbsc/src/osmo-bsc_nat/bsc_nat_utils.c | 2 +- openbsc/src/osmo-bsc_nat/bsc_nat_vty.c | 2 +- openbsc/src/osmo-bsc_nat/bsc_sccp.c | 2 +- openbsc/src/osmo-bsc_nat/bsc_ussd.c | 2 +- openbsc/src/osmo-nitb/bsc_hack.c | 2 +- openbsc/tests/bsc-nat/bsc_nat_test.c | 2 +- openbsc/tests/mgcp/mgcp_test.c | 2 +- 83 files changed, 83 insertions(+), 82 deletions(-) diff --git a/openbsc/configure.ac b/openbsc/configure.ac index 74b3044..ac77d82 100644 --- a/openbsc/configure.ac +++ b/openbsc/configure.ac @@ -46,6 +46,7 @@ AM_CONDITIONAL(BUILD_BSC, test "x$osmo_ac_build_bsc" = "xyes") PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.3.0) PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.3.0) PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 0.3.0) +PKG_CHECK_MODULES(LIBTALLOC, talloc >= 2.0.1) dnl checks for header files AC_HEADER_STDC diff --git a/openbsc/src/gprs/gb_proxy.c b/openbsc/src/gprs/gb_proxy.c index 1261ccc..b45dd6d 100644 --- a/openbsc/src/gprs/gb_proxy.c +++ b/openbsc/src/gprs/gb_proxy.c @@ -29,7 +29,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/gprs/gb_proxy_main.c b/openbsc/src/gprs/gb_proxy_main.c index 028f989..eae6300 100644 --- a/openbsc/src/gprs/gb_proxy_main.c +++ b/openbsc/src/gprs/gb_proxy_main.c @@ -33,7 +33,7 @@ #include #include -#include +#include #include #include #include diff --git a/openbsc/src/gprs/gb_proxy_vty.c b/openbsc/src/gprs/gb_proxy_vty.c index 1aa4ff5..651c106 100644 --- a/openbsc/src/gprs/gb_proxy_vty.c +++ b/openbsc/src/gprs/gb_proxy_vty.c @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/gprs/gprs_gmm.c b/openbsc/src/gprs/gprs_gmm.c index 46c4931..69f8086 100644 --- a/openbsc/src/gprs/gprs_gmm.c +++ b/openbsc/src/gprs/gprs_gmm.c @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include diff --git a/openbsc/src/gprs/gprs_llc.c b/openbsc/src/gprs/gprs_llc.c index f7408ef..8d0ddce 100644 --- a/openbsc/src/gprs/gprs_llc.c +++ b/openbsc/src/gprs/gprs_llc.c @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include diff --git a/openbsc/src/gprs/gprs_llc_vty.c b/openbsc/src/gprs/gprs_llc_vty.c index ab52699..3a5803e 100644 --- a/openbsc/src/gprs/gprs_llc_vty.c +++ b/openbsc/src/gprs/gprs_llc_vty.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/gprs/gprs_sgsn.c b/openbsc/src/gprs/gprs_sgsn.c index 85f7105..9b29a94 100644 --- a/openbsc/src/gprs/gprs_sgsn.c +++ b/openbsc/src/gprs/gprs_sgsn.c @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include #include diff --git a/openbsc/src/gprs/gprs_sndcp.c b/openbsc/src/gprs/gprs_sndcp.c index 1307fe5..2404fff 100644 --- a/openbsc/src/gprs/gprs_sndcp.c +++ b/openbsc/src/gprs/gprs_sndcp.c @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include diff --git a/openbsc/src/gprs/gprs_sndcp_vty.c b/openbsc/src/gprs/gprs_sndcp_vty.c index 28fdc63..58a77e8 100644 --- a/openbsc/src/gprs/gprs_sndcp_vty.c +++ b/openbsc/src/gprs/gprs_sndcp_vty.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/gprs/sgsn_libgtp.c b/openbsc/src/gprs/sgsn_libgtp.c index f193aa3..8d99169 100644 --- a/openbsc/src/gprs/sgsn_libgtp.c +++ b/openbsc/src/gprs/sgsn_libgtp.c @@ -33,7 +33,7 @@ #include #include -#include +#include #include #include #include diff --git a/openbsc/src/gprs/sgsn_main.c b/openbsc/src/gprs/sgsn_main.c index bfa2e52..1d2d5b7 100644 --- a/openbsc/src/gprs/sgsn_main.c +++ b/openbsc/src/gprs/sgsn_main.c @@ -33,7 +33,7 @@ #include #include -#include +#include #include #include #include diff --git a/openbsc/src/gprs/sgsn_vty.c b/openbsc/src/gprs/sgsn_vty.c index 4c9cf28..9f4d7fe 100644 --- a/openbsc/src/gprs/sgsn_vty.c +++ b/openbsc/src/gprs/sgsn_vty.c @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/ipaccess/ipaccess-config.c b/openbsc/src/ipaccess/ipaccess-config.c index 9d0e2db..d34c93d 100644 --- a/openbsc/src/ipaccess/ipaccess-config.c +++ b/openbsc/src/ipaccess/ipaccess-config.c @@ -44,7 +44,7 @@ #include #include #include -#include +#include static struct gsm_network *gsmnet; diff --git a/openbsc/src/ipaccess/ipaccess-firmware.c b/openbsc/src/ipaccess/ipaccess-firmware.c index 6d39107..cdff22c 100644 --- a/openbsc/src/ipaccess/ipaccess-firmware.c +++ b/openbsc/src/ipaccess/ipaccess-firmware.c @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/ipaccess/ipaccess-proxy.c b/openbsc/src/ipaccess/ipaccess-proxy.c index b4d17e2..3c87118 100644 --- a/openbsc/src/ipaccess/ipaccess-proxy.c +++ b/openbsc/src/ipaccess/ipaccess-proxy.c @@ -45,7 +45,7 @@ #include #include #include -#include +#include /* one instance of an ip.access protocol proxy */ struct ipa_proxy { diff --git a/openbsc/src/ipaccess/network_listen.c b/openbsc/src/ipaccess/network_listen.c index a719903..a887bc3 100644 --- a/openbsc/src/ipaccess/network_listen.c +++ b/openbsc/src/ipaccess/network_listen.c @@ -28,7 +28,7 @@ #include -#include +#include #include #include #include diff --git a/openbsc/src/libabis/e1_input.c b/openbsc/src/libabis/e1_input.c index 97dcd33..e42a345 100644 --- a/openbsc/src/libabis/e1_input.c +++ b/openbsc/src/libabis/e1_input.c @@ -49,7 +49,7 @@ #include #include #include -#include +#include #include #include diff --git a/openbsc/src/libabis/e1_input_vty.c b/openbsc/src/libabis/e1_input_vty.c index b211e81..1595699 100644 --- a/openbsc/src/libabis/e1_input_vty.c +++ b/openbsc/src/libabis/e1_input_vty.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include diff --git a/openbsc/src/libabis/input/dahdi.c b/openbsc/src/libabis/input/dahdi.c index 6f89837..948615b 100644 --- a/openbsc/src/libabis/input/dahdi.c +++ b/openbsc/src/libabis/input/dahdi.c @@ -47,7 +47,7 @@ #include #include #include -#include +#include #include "lapd.h" diff --git a/openbsc/src/libabis/input/hsl.c b/openbsc/src/libabis/input/hsl.c index c98a22c..5b49d10 100644 --- a/openbsc/src/libabis/input/hsl.c +++ b/openbsc/src/libabis/input/hsl.c @@ -54,7 +54,7 @@ #include #include #include -#include +#include #define HSL_TCP_PORT 2500 #define HSL_PROTO_DEBUG 0xdd diff --git a/openbsc/src/libabis/input/ipaccess.c b/openbsc/src/libabis/input/ipaccess.c index cc2a7a0..fe2b8f1 100644 --- a/openbsc/src/libabis/input/ipaccess.c +++ b/openbsc/src/libabis/input/ipaccess.c @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libabis/input/lapd.c b/openbsc/src/libabis/input/lapd.c index d0fab18..edf8c01 100644 --- a/openbsc/src/libabis/input/lapd.c +++ b/openbsc/src/libabis/input/lapd.c @@ -37,7 +37,7 @@ #include "lapd.h" #include -#include +#include #include #include #include diff --git a/openbsc/src/libabis/input/misdn.c b/openbsc/src/libabis/input/misdn.c index ab92d61..02bbbd1 100644 --- a/openbsc/src/libabis/input/misdn.c +++ b/openbsc/src/libabis/input/misdn.c @@ -41,7 +41,7 @@ #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libbsc/abis_nm.c b/openbsc/src/libbsc/abis_nm.c index f2220a7..1ccf083 100644 --- a/openbsc/src/libbsc/abis_nm.c +++ b/openbsc/src/libbsc/abis_nm.c @@ -39,7 +39,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libbsc/abis_nm_vty.c b/openbsc/src/libbsc/abis_nm_vty.c index bcbc92d..658608d 100644 --- a/openbsc/src/libbsc/abis_nm_vty.c +++ b/openbsc/src/libbsc/abis_nm_vty.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libbsc/abis_om2000.c b/openbsc/src/libbsc/abis_om2000.c index fd3cf1f..6c9832a 100644 --- a/openbsc/src/libbsc/abis_om2000.c +++ b/openbsc/src/libbsc/abis_om2000.c @@ -32,7 +32,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/libbsc/abis_om2000_vty.c b/openbsc/src/libbsc/abis_om2000_vty.c index 704f955..b8bd7c9 100644 --- a/openbsc/src/libbsc/abis_om2000_vty.c +++ b/openbsc/src/libbsc/abis_om2000_vty.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c index 1001003..78f0535 100644 --- a/openbsc/src/libbsc/abis_rsl.c +++ b/openbsc/src/libbsc/abis_rsl.c @@ -40,7 +40,7 @@ #include #include -#include +#include #define RSL_ALLOC_SIZE 1024 #define RSL_ALLOC_HEADROOM 128 diff --git a/openbsc/src/libbsc/bsc_api.c b/openbsc/src/libbsc/bsc_api.c index 70d6413..0cc4e37 100644 --- a/openbsc/src/libbsc/bsc_api.c +++ b/openbsc/src/libbsc/bsc_api.c @@ -34,7 +34,7 @@ #include -#include +#include #define GSM0808_T10_VALUE 6, 0 diff --git a/openbsc/src/libbsc/bsc_init.c b/openbsc/src/libbsc/bsc_init.c index 378f5ea..621fe87 100644 --- a/openbsc/src/libbsc/bsc_init.c +++ b/openbsc/src/libbsc/bsc_init.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include /* global pointer to the gsm network data structure */ diff --git a/openbsc/src/libbsc/bsc_msc.c b/openbsc/src/libbsc/bsc_msc.c index e9ffce3..6b119ad 100644 --- a/openbsc/src/libbsc/bsc_msc.c +++ b/openbsc/src/libbsc/bsc_msc.c @@ -24,7 +24,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/libbsc/bsc_rll.c b/openbsc/src/libbsc/bsc_rll.c index d12aeee..054cbf3 100644 --- a/openbsc/src/libbsc/bsc_rll.c +++ b/openbsc/src/libbsc/bsc_rll.c @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libbsc/bsc_vty.c b/openbsc/src/libbsc/bsc_vty.c index a72ff21..b304077 100644 --- a/openbsc/src/libbsc/bsc_vty.c +++ b/openbsc/src/libbsc/bsc_vty.c @@ -39,7 +39,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libbsc/chan_alloc.c b/openbsc/src/libbsc/chan_alloc.c index cfd3874..6cdc5ab 100644 --- a/openbsc/src/libbsc/chan_alloc.c +++ b/openbsc/src/libbsc/chan_alloc.c @@ -32,7 +32,7 @@ #include #include -#include +#include static int ts_is_usable(struct gsm_bts_trx_ts *ts) { diff --git a/openbsc/src/libbsc/e1_config.c b/openbsc/src/libbsc/e1_config.c index bd6ebba..3809faa 100644 --- a/openbsc/src/libbsc/e1_config.c +++ b/openbsc/src/libbsc/e1_config.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #define SAPI_L2ML 0 diff --git a/openbsc/src/libbsc/gsm_subscriber_base.c b/openbsc/src/libbsc/gsm_subscriber_base.c index 11afb35..21fd0ef 100644 --- a/openbsc/src/libbsc/gsm_subscriber_base.c +++ b/openbsc/src/libbsc/gsm_subscriber_base.c @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/libbsc/handover_decision.c b/openbsc/src/libbsc/handover_decision.c index 24c0f79..97326dc 100644 --- a/openbsc/src/libbsc/handover_decision.c +++ b/openbsc/src/libbsc/handover_decision.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include diff --git a/openbsc/src/libbsc/handover_logic.c b/openbsc/src/libbsc/handover_logic.c index 0f1582e..ec9c06c 100644 --- a/openbsc/src/libbsc/handover_logic.c +++ b/openbsc/src/libbsc/handover_logic.c @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include diff --git a/openbsc/src/libbsc/meas_proc.c b/openbsc/src/libbsc/meas_proc.c index 5b97e74..1a60934 100644 --- a/openbsc/src/libbsc/meas_proc.c +++ b/openbsc/src/libbsc/meas_proc.c @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libbsc/paging.c b/openbsc/src/libbsc/paging.c index 2dcd3b4..349329c 100644 --- a/openbsc/src/libbsc/paging.c +++ b/openbsc/src/libbsc/paging.c @@ -39,7 +39,7 @@ #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libcommon/common_vty.c b/openbsc/src/libcommon/common_vty.c index 5b4b296..b328897 100644 --- a/openbsc/src/libcommon/common_vty.c +++ b/openbsc/src/libcommon/common_vty.c @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/libcommon/debug.c b/openbsc/src/libcommon/debug.c index 1372150..c87b77e 100644 --- a/openbsc/src/libcommon/debug.c +++ b/openbsc/src/libcommon/debug.c @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libcommon/gsm_data.c b/openbsc/src/libcommon/gsm_data.c index 54e7a63..bc4758d 100644 --- a/openbsc/src/libcommon/gsm_data.c +++ b/openbsc/src/libcommon/gsm_data.c @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libcommon/socket.c b/openbsc/src/libcommon/socket.c index ff846aa..a6ad131 100644 --- a/openbsc/src/libcommon/socket.c +++ b/openbsc/src/libcommon/socket.c @@ -37,7 +37,7 @@ #include #include #include -#include +#include int make_sock(struct osmo_fd *bfd, int proto, uint32_t ip, uint16_t port, int priv_nr, diff --git a/openbsc/src/libcommon/talloc_ctx.c b/openbsc/src/libcommon/talloc_ctx.c index ae6a156..1a0e287 100644 --- a/openbsc/src/libcommon/talloc_ctx.c +++ b/openbsc/src/libcommon/talloc_ctx.c @@ -1,4 +1,4 @@ -#include +#include #include extern void *tall_msgb_ctx; diff --git a/openbsc/src/libgb/gprs_bssgp.c b/openbsc/src/libgb/gprs_bssgp.c index b74791c..3d3f795 100644 --- a/openbsc/src/libgb/gprs_bssgp.c +++ b/openbsc/src/libgb/gprs_bssgp.c @@ -29,7 +29,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/libgb/gprs_bssgp_util.c b/openbsc/src/libgb/gprs_bssgp_util.c index b539323..177c650 100644 --- a/openbsc/src/libgb/gprs_bssgp_util.c +++ b/openbsc/src/libgb/gprs_bssgp_util.c @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/libgb/gprs_bssgp_vty.c b/openbsc/src/libgb/gprs_bssgp_vty.c index a0d74ac..1b3600f 100644 --- a/openbsc/src/libgb/gprs_bssgp_vty.c +++ b/openbsc/src/libgb/gprs_bssgp_vty.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libgb/gprs_ns.c b/openbsc/src/libgb/gprs_ns.c index dab57e6..acfc695 100644 --- a/openbsc/src/libgb/gprs_ns.c +++ b/openbsc/src/libgb/gprs_ns.c @@ -61,7 +61,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libgb/gprs_ns_frgre.c b/openbsc/src/libgb/gprs_ns_frgre.c index 3662572..f1068e0 100644 --- a/openbsc/src/libgb/gprs_ns_frgre.c +++ b/openbsc/src/libgb/gprs_ns_frgre.c @@ -33,7 +33,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/libgb/gprs_ns_vty.c b/openbsc/src/libgb/gprs_ns_vty.c index 14d7691..a8d671b 100644 --- a/openbsc/src/libgb/gprs_ns_vty.c +++ b/openbsc/src/libgb/gprs_ns_vty.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libmgcp/mgcp_protocol.c b/openbsc/src/libmgcp/mgcp_protocol.c index 1d26850..1186232 100644 --- a/openbsc/src/libmgcp/mgcp_protocol.c +++ b/openbsc/src/libmgcp/mgcp_protocol.c @@ -30,7 +30,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/libmgcp/mgcp_vty.c b/openbsc/src/libmgcp/mgcp_vty.c index 0b7a97e..5592f95 100644 --- a/openbsc/src/libmgcp/mgcp_vty.c +++ b/openbsc/src/libmgcp/mgcp_vty.c @@ -22,7 +22,7 @@ */ -#include +#include #include #include diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c index 1ddd3fd..d6c5c19 100644 --- a/openbsc/src/libmsc/db.c +++ b/openbsc/src/libmsc/db.c @@ -34,7 +34,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c index a6ed3e8..66990b0 100644 --- a/openbsc/src/libmsc/gsm_04_08.c +++ b/openbsc/src/libmsc/gsm_04_08.c @@ -55,7 +55,7 @@ #include #include #include -#include +#include #include void *tall_locop_ctx; diff --git a/openbsc/src/libmsc/gsm_04_11.c b/openbsc/src/libmsc/gsm_04_11.c index ba72c37..7d3f4b7 100644 --- a/openbsc/src/libmsc/gsm_04_11.c +++ b/openbsc/src/libmsc/gsm_04_11.c @@ -44,7 +44,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libmsc/gsm_subscriber.c b/openbsc/src/libmsc/gsm_subscriber.c index f9eebc8..aade355 100644 --- a/openbsc/src/libmsc/gsm_subscriber.c +++ b/openbsc/src/libmsc/gsm_subscriber.c @@ -26,7 +26,7 @@ #include #include -#include +#include #include diff --git a/openbsc/src/libmsc/mncc.c b/openbsc/src/libmsc/mncc.c index b484772..02772b0 100644 --- a/openbsc/src/libmsc/mncc.c +++ b/openbsc/src/libmsc/mncc.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libmsc/mncc_builtin.c b/openbsc/src/libmsc/mncc_builtin.c index 105f1dd..0653ece 100644 --- a/openbsc/src/libmsc/mncc_builtin.c +++ b/openbsc/src/libmsc/mncc_builtin.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libmsc/mncc_sock.c b/openbsc/src/libmsc/mncc_sock.c index 5ef9922..f77086d 100644 --- a/openbsc/src/libmsc/mncc_sock.c +++ b/openbsc/src/libmsc/mncc_sock.c @@ -29,7 +29,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/libmsc/sms_queue.c b/openbsc/src/libmsc/sms_queue.c index 30fa5f0..cd55a51 100644 --- a/openbsc/src/libmsc/sms_queue.c +++ b/openbsc/src/libmsc/sms_queue.c @@ -37,7 +37,7 @@ #include #include -#include +#include #include diff --git a/openbsc/src/libmsc/token_auth.c b/openbsc/src/libmsc/token_auth.c index cf26ba8..c48af92 100644 --- a/openbsc/src/libmsc/token_auth.c +++ b/openbsc/src/libmsc/token_auth.c @@ -20,7 +20,7 @@ */ #include -#include +#include #include #include #include diff --git a/openbsc/src/libmsc/transaction.c b/openbsc/src/libmsc/transaction.c index 8a181b7..225495a 100644 --- a/openbsc/src/libmsc/transaction.c +++ b/openbsc/src/libmsc/transaction.c @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libmsc/vty_interface_layer3.c b/openbsc/src/libmsc/vty_interface_layer3.c index f31f05b..af224a1 100644 --- a/openbsc/src/libmsc/vty_interface_layer3.c +++ b/openbsc/src/libmsc/vty_interface_layer3.c @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libtrau/rtp_proxy.c b/openbsc/src/libtrau/rtp_proxy.c index 4c5f12e..877e3f6 100644 --- a/openbsc/src/libtrau/rtp_proxy.c +++ b/openbsc/src/libtrau/rtp_proxy.c @@ -28,7 +28,7 @@ #include /* clock() */ #include /* uname() */ -#include +#include #include #include #include diff --git a/openbsc/src/libtrau/subchan_demux.c b/openbsc/src/libtrau/subchan_demux.c index 740d2ca..173fdb9 100644 --- a/openbsc/src/libtrau/subchan_demux.c +++ b/openbsc/src/libtrau/subchan_demux.c @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include void *tall_tqe_ctx; diff --git a/openbsc/src/libtrau/trau_mux.c b/openbsc/src/libtrau/trau_mux.c index b8b90bd..e9fa194 100644 --- a/openbsc/src/libtrau/trau_mux.c +++ b/openbsc/src/libtrau/trau_mux.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include uint8_t gsm_fr_map[] = { 6, 6, 5, 5, 4, 4, 3, 3, diff --git a/openbsc/src/osmo-bsc/osmo_bsc_main.c b/openbsc/src/osmo-bsc/osmo_bsc_main.c index 42c74cc..7304f35 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_main.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_main.c @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/osmo-bsc/osmo_bsc_rf.c b/openbsc/src/osmo-bsc/osmo_bsc_rf.c index 11cdffe..d858304 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_rf.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_rf.c @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/osmo-bsc/osmo_bsc_sccp.c b/openbsc/src/osmo-bsc/osmo_bsc_sccp.c index f4cdf36..92de835 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_sccp.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_sccp.c @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/osmo-bsc/osmo_bsc_vty.c b/openbsc/src/osmo-bsc/osmo_bsc_vty.c index 0b1698e..417826a 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_vty.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_vty.c @@ -22,7 +22,7 @@ #include #include -#include +#include #define IPA_STR "IP.ACCESS specific\n" diff --git a/openbsc/src/osmo-bsc_mgcp/mgcp_main.c b/openbsc/src/osmo-bsc_mgcp/mgcp_main.c index 921fa09..a6bc338 100644 --- a/openbsc/src/osmo-bsc_mgcp/mgcp_main.c +++ b/openbsc/src/osmo-bsc_mgcp/mgcp_main.c @@ -39,7 +39,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/osmo-bsc_nat/bsc_filter.c b/openbsc/src/osmo-bsc_nat/bsc_filter.c index 74a5d19..86bba35 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_filter.c +++ b/openbsc/src/osmo-bsc_nat/bsc_filter.c @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/osmo-bsc_nat/bsc_mgcp_utils.c b/openbsc/src/osmo-bsc_nat/bsc_mgcp_utils.c index 9ac54da..e393e8a 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_mgcp_utils.c +++ b/openbsc/src/osmo-bsc_nat/bsc_mgcp_utils.c @@ -28,7 +28,7 @@ #include -#include +#include #include #include diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat.c b/openbsc/src/osmo-bsc_nat/bsc_nat.c index e0eb635..bf5d914 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_nat.c +++ b/openbsc/src/osmo-bsc_nat/bsc_nat.c @@ -45,7 +45,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c b/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c index 4834340..da7c960 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c +++ b/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c @@ -30,7 +30,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c index b5c1cf2..5def87a 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c +++ b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include #include diff --git a/openbsc/src/osmo-bsc_nat/bsc_sccp.c b/openbsc/src/osmo-bsc_nat/bsc_sccp.c index de6b421..eac7243 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_sccp.c +++ b/openbsc/src/osmo-bsc_nat/bsc_sccp.c @@ -25,7 +25,7 @@ #include -#include +#include #include #include diff --git a/openbsc/src/osmo-bsc_nat/bsc_ussd.c b/openbsc/src/osmo-bsc_nat/bsc_ussd.c index bbbeead..a46a74e 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_ussd.c +++ b/openbsc/src/osmo-bsc_nat/bsc_ussd.c @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/src/osmo-nitb/bsc_hack.c b/openbsc/src/osmo-nitb/bsc_hack.c index e548a95..157670d 100644 --- a/openbsc/src/osmo-nitb/bsc_hack.c +++ b/openbsc/src/osmo-nitb/bsc_hack.c @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/tests/bsc-nat/bsc_nat_test.c b/openbsc/tests/bsc-nat/bsc_nat_test.c index d198424..bbb7ad5 100644 --- a/openbsc/tests/bsc-nat/bsc_nat_test.c +++ b/openbsc/tests/bsc-nat/bsc_nat_test.c @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include diff --git a/openbsc/tests/mgcp/mgcp_test.c b/openbsc/tests/mgcp/mgcp_test.c index b7273de..6ec46b4 100644 --- a/openbsc/tests/mgcp/mgcp_test.c +++ b/openbsc/tests/mgcp/mgcp_test.c @@ -21,7 +21,7 @@ #include #include -#include +#include #include static struct msgb *create_auep1() -- 1.7.2.5 From pablo at gnumonks.org Tue Jun 14 17:14:52 2011 From: pablo at gnumonks.org (pablo at gnumonks.org) Date: Tue, 14 Jun 2011 19:14:52 +0200 Subject: [PATCH 4/4] [osmo-tetra] src: use standalone libtalloc In-Reply-To: <1308071692-6041-1-git-send-email-pablo@gnumonks.org> References: <1308071692-6041-1-git-send-email-pablo@gnumonks.org> Message-ID: <1308071692-6041-5-git-send-email-pablo@gnumonks.org> From: Pablo Neira Ayuso With this patch, we check for the libtalloc version installed in the system. We don't use our own copy in libosmocore anymore. This patch also replaces all references to: #include by: #include I did this with this command: find ./ -type f -exec sed -i "s/osmocom\/core\/talloc.h/talloc.h/g" {} \; Make sure you skip .git directory in this replacement, otherwise you'll get a corrupted git repository. --- src/Makefile | 2 +- src/lower_mac/tetra_lower_mac.c | 2 +- src/tetra-rx.c | 2 +- src/tetra_llc.c | 2 +- src/tetra_upper_mac.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Makefile b/src/Makefile index 38263b9..424a90e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,5 +1,5 @@ CFLAGS=-g -O0 -Wall `pkg-config --cflags libosmocore 2> /dev/null` -I. -LDFLAGS=`pkg-config --libs libosmocore 2> /dev/null` -losmocore +LDFLAGS=`pkg-config --libs libosmocore 2> /dev/null` -losmocore -ltalloc all: conv_enc_test crc_test tetra-rx float_to_bits tunctl diff --git a/src/lower_mac/tetra_lower_mac.c b/src/lower_mac/tetra_lower_mac.c index 7b62bb4..13b3810 100644 --- a/src/lower_mac/tetra_lower_mac.c +++ b/src/lower_mac/tetra_lower_mac.c @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include diff --git a/src/tetra-rx.c b/src/tetra-rx.c index c751772..c9ed7f8 100644 --- a/src/tetra-rx.c +++ b/src/tetra-rx.c @@ -27,7 +27,7 @@ #include #include -#include +#include #include "tetra_common.h" #include diff --git a/src/tetra_llc.c b/src/tetra_llc.c index 432f5a7..c132c8b 100644 --- a/src/tetra_llc.c +++ b/src/tetra_llc.c @@ -24,7 +24,7 @@ #include #include -#include +#include #include #include "tetra_llc_pdu.h" diff --git a/src/tetra_upper_mac.c b/src/tetra_upper_mac.c index 0bfc0e1..ad4e7a9 100644 --- a/src/tetra_upper_mac.c +++ b/src/tetra_upper_mac.c @@ -25,7 +25,7 @@ #include #include -#include +#include #include "tetra_common.h" #include "tetra_prim.h" -- 1.7.2.5 From bthomas at mailbox.hu Wed Jun 15 11:19:42 2011 From: bthomas at mailbox.hu (Bthomas) Date: Wed, 15 Jun 2011 13:19:42 +0200 Subject: Serial console on FemtoCell Message-ID: Dear Developers, I mentioned earlier that I found a tutorial in which we read that this cell is within the box's serial port. I found him looking for a RS485 port outlet, and 2x5-pin lines of pins. Images from the PCB: http://www.facebook.com/media/set/?set=a.1979958333026.114473.1065188491 IPSEC have read so far by launching tube through a communication gateway through which to get "home location register" information, etc.. Whether there is a chance to even download the firmware via the serial terminal analysis? Or perhaps to be found in lines of pins USB option? The presentation referred to the serial port connection just yet to start when you press the reset button four times, then the boot menu to configure the IP address, login data. greetings: bthomyka -------------- next part -------------- An HTML attachment was scrubbed... URL: From ravi.borgaonkar at gmail.com Wed Jun 15 11:26:31 2011 From: ravi.borgaonkar at gmail.com (Ravi Borgaonkar) Date: Wed, 15 Jun 2011 13:26:31 +0200 Subject: Serial console on FemtoCell In-Reply-To: References: Message-ID: http://www.facebook.com/media/set/?set=a.1979958333026.114473.1065188491 link is not working /r -------------- next part -------------- An HTML attachment was scrubbed... URL: From jngpz at 163.com Sun Jun 19 07:50:42 2011 From: jngpz at 163.com (=?gb2312?B?uN/Gt9XC?=) Date: Sun, 19 Jun 2011 15:50:42 +0800 Subject: Help me! How to buy nanobts or hsl 2.75g picocell ?? Message-ID: <4DFDADDE.060D85.30591@m50-135.163.com> Dear all, I want to buy some nanoBTS or HSL 2.75G picocell . Is there any body who wants to sell nanoBTS or HSL 2.75G picocell ? Looking forward for any offer . Regards, ????????jngpz at 163.com ??????????2011-06-19 From laforge at gnumonks.org Sun Jun 19 09:03:53 2011 From: laforge at gnumonks.org (Harald Welte) Date: Sun, 19 Jun 2011 11:03:53 +0200 Subject: Problems during initial bring-up of nanoBTS Message-ID: <20110619090352.GS6915@prithivi.gnumonks.org> Hi zecke and others, I may have found a cause of one of the problems that we've been experiencing in nanoBTS bring-up, at least at some point in the past. The problem could be observed/described as: During the first OML connect of the nanoBTS, OpenBSC fails to bring it up completely. Second and successive connects worked fine. What I have just noticed is that we never re-set the NM state information for the 12.21 MOs inside OpenBSC. This means, if the A-bis link is lost, the old state information continues to exist. I guess it would be cleaner to simply re-set all the nm_state strucures that are part of the 'struct gsm_bts', gsm_bts_trx, etc. when the A-bis link is lost. As I'm working in this area right now anyway, I intend to produce a patch addressing the issue. But now that I think more about it: I guess it is unrelated to the old problem, as a typical work-around was to re-start OpenBSC, at which time all state is re-set again. Regards, Harald -- - Harald Welte http://laforge.gnumonks.org/ ============================================================================ "Privacy in residential applications is a desirable marketing option." (ETSI EN 300 175-7 Ch. A6) From laforge at gnumonks.org Sun Jun 19 09:23:50 2011 From: laforge at gnumonks.org (Harald Welte) Date: Sun, 19 Jun 2011 11:23:50 +0200 Subject: Motorola Mo-bis / Implications for CCC Camp Message-ID: <20110619092349.GT6915@prithivi.gnumonks.org> Hi all, it seems like supporting the Motorola BTS from OpenBSC is a really big challenge. Not only are there problems regarding an unknown configuration database format (see http://laforge.gnumonks.org/weblog/2011/06/18/) Dieter has found the following excellent document, which in Chapter 5 describes the architecture of the Motorola specific changes to A-bis: http://read.pudn.com/downloads61/ebook/212957/SYS01.pdf Judging from the document: * there is an unknown 'motorola executive header' in front of RSL * many RSL standard messages have been replaced by proprietary ones * they use a mixture of 08.08 (A) and 08.58 (A-bis) information elements * many features normally found in the BSC are implemented in the BTS, e.g. the entire CHAN RQD / RSL CHAN ACT / IMM ASS CMD sequence is done fully inside the BTS. As a result, I think it will be a quite complex project to support those BTSs from OpenBSC. It's not just a matter of adding some small vendor-specific OML messages like with Siemens, Ericsson and ip.access. While it might still be interesting, I think it's unrealistic to assume this would happen ahead of the camp [unless somebody finds a compatible Motorola BSC that they can borrow us for analysis + protocol tracing]. Thus, the focus for the 2011 CCC Camp is now back to ip.access. The main issues we will be facing is on the RF side, i.e. * RF PA for the TX side * combining the PA outputs to be transmitted on one antenna * filter + LNA for Rx side * splitting the Rx signal As indicated previously, I would love to see something like two BTS with three TRX each. If we'd recycle the duplexer/combiner blocks from the Motorola BTS, we could do something like three sites with 2 TRX each. (as they can only combine two TRX). We _might_ also be able to re-cycle the TX PA from the Motorola CTUs, at least on the RF side it would be pretty easy to drive them from a nanoBTS rather than its internal source (as there's a connector). The bigger question is how do we get the controller logic of the PA into a state that the PA is actually enabled and active... Regards, Harald -- - Harald Welte http://laforge.gnumonks.org/ ============================================================================ "Privacy in residential applications is a desirable marketing option." (ETSI EN 300 175-7 Ch. A6) From guidocx84 at gmail.com Wed Jun 22 14:11:44 2011 From: guidocx84 at gmail.com (Guido Cilia) Date: Wed, 22 Jun 2011 16:11:44 +0200 Subject: Complete test of a PDP Context activation process Message-ID: Hi everybody! I need to replicate in my private network the functionalities of an SGSN and a GGSN for academic purpose. I see the openGGSN project and I understand that it's composed by two components: sgsnemu and ggsn. What I want to ask to you is if I could test all the PDP Context activation process with these two components and how. This is the real (very semplified) process: Mobile Phone ---> SGSN ---> GGSN ---> SGSN ---> Mobile Phone (for a full description of the process see here ) My suspicion, tell me if I'm wrong, is that sgsnemu component allow to test only this part of the complete process: SGSN ---> GGSN ---> SGSN (simulating the mobile terminal request but not really accepting it from an external module/device). Is it right? How could I test all the process? Consider that I could use a linux pc instead of a mobile phone. Thank you very much!!! -- Guido Cilia Web: http://www.guidocilia.it E-Mail: guidocx84 at gmail.com Skype: guidocx84 -------------- next part -------------- An HTML attachment was scrubbed... URL: From holger at freyther.de Wed Jun 22 15:55:15 2011 From: holger at freyther.de (Holger Hans Peter Freyther) Date: Wed, 22 Jun 2011 17:55:15 +0200 Subject: Complete test of a PDP Context activation process In-Reply-To: References: Message-ID: <4E021063.8000703@freyther.de> On 06/22/2011 04:11 PM, Guido Cilia wrote: > Hi everybody! what is the academic purpose? From laforge at gnumonks.org Mon Jun 27 09:00:37 2011 From: laforge at gnumonks.org (Harald Welte) Date: Mon, 27 Jun 2011 11:00:37 +0200 Subject: libosmocore / logging from within libraries Message-ID: <20110627090037.GF19993@prithivi.gnumonks.org> Hi! As more and more code is moving into libraries (like I just did with the LAPDm code, and like pablo is working on with libosmo-abis), we needed a solution how to allocate and use the LOGP subsystem constants like DRSL, DRR, ... from within libraries. The existing logging code wasn't really prepared for that. I've now come um with a hack to extend it while preserving compatibility to applications: * we use negative numbers starting from -1 for library-internal subsystems * those numbers get converted to a positive index into the various arrays at run-time. So -1 ends up one entry higher in the array than the last application-providede log category/subsystem. As part of this change, the array allocations are now dynamic, i.e there is no maximum limit for the number of log categories that an application can register with the core. Only for libraries (even outside libosmocore), we have compile-time registration, i.e. the 'struct log_info_cat' and the D* constant need to be defined inside libosmocore. I think this is an acceptable compromise. Furthermore, if LOGP()/DEBUGP() ever see a subsystem number that it doesn't know, it will assign it to the new 'DLGLOBAL' (Debug Library GLOBAL) category, i.e. there cna be no array overflows. This ensures that even an external library using a 'newer' D* constant will not crash or otherwise fail, it will simply log in a slightly different way. Regards, Harald -- - Harald Welte http://laforge.gnumonks.org/ ============================================================================ "Privacy in residential applications is a desirable marketing option." (ETSI EN 300 175-7 Ch. A6) From pablo at gnumonks.org Mon Jun 27 12:30:59 2011 From: pablo at gnumonks.org (Pablo Neira Ayuso) Date: Mon, 27 Jun 2011 14:30:59 +0200 Subject: libosmocore / logging from within libraries In-Reply-To: <20110627090037.GF19993@prithivi.gnumonks.org> References: <20110627090037.GF19993@prithivi.gnumonks.org> Message-ID: <4E087803.5070500@gnumonks.org> Hi Harald, On 27/06/11 11:00, Harald Welte wrote: > Hi! > > As more and more code is moving into libraries (like I just did with the > LAPDm code, and like pablo is working on with libosmo-abis), we needed a > solution how to allocate and use the LOGP subsystem constants like DRSL, > DRR, ... from within libraries. > > The existing logging code wasn't really prepared for that. I've now > come um with a hack to extend it while preserving compatibility to > applications: > > * we use negative numbers starting from -1 for library-internal > subsystems > * those numbers get converted to a positive index into the various > arrays at run-time. So -1 ends up one entry higher in the array > than the last application-providede log category/subsystem. > > As part of this change, the array allocations are now dynamic, i.e there > is no maximum limit for the number of log categories that an application > can register with the core. > > Only for libraries (even outside libosmocore), we have compile-time > registration, i.e. the 'struct log_info_cat' and the D* constant need to > be defined inside libosmocore. I think this is an acceptable > compromise. > > Furthermore, if LOGP()/DEBUGP() ever see a subsystem number that it > doesn't know, it will assign it to the new 'DLGLOBAL' (Debug Library > GLOBAL) category, i.e. there cna be no array overflows. > > This ensures that even an external library using a 'newer' D* constant > will not crash or otherwise fail, it will simply log in a slightly > different way. Since I required something for libosmo-abis I prepared the following patch. The idea is to reduce the logging range to uint8_t: * we reserve logging subsystems space for libraries. * It allows to dinamically register as many logging subsystems as you want, by invoking log_init(...) as many times as needed. This breaks binary backward compatibility. -------------- next part -------------- A non-text attachment was scrubbed... Name: logging.patch Type: text/x-patch Size: 7600 bytes Desc: not available URL: