Commit Graph

302 Commits (2a8a22329bb3bc6d4af752f82335ce916e79a015)

Author SHA1 Message Date
Bryan Biedenkapp 77291533c6 Merge branch 'master' into incall_ctrl
1 year ago
Bryan Biedenkapp 8a0412524a fix issue with DataBlock destructor trying to free a unallocated array; fix issue with dispatchUserFrameToFNE allowing local FNE network packets to cross external peer boundary; allow peers to connect if the peer list ACL is enabled, but the peer list itself is empty;
1 year ago
Bryan Biedenkapp 8f74260d5d Merge branch 'master' into incall_ctrl
1 year ago
Bryan Biedenkapp 05fa1c2114 increase SSL timeout delay from 2 to 5 seconds;
1 year ago
Bryan Biedenkapp eedd067489 correct order of initialization, and ensure m_stop is set to false by default;
1 year ago
Bryan Biedenkapp ebfbed1ef5 Merge branch 'master' into incall_ctrl
1 year ago
Bryan Biedenkapp f810351847 use non-blocking IO for the SecureTcpClient accept routine;
1 year ago
Bryan Biedenkapp 619cb548df add support for per TGID RID permission lists; add call router support to check for source RID permission to TGID;
1 year ago
Bryan Biedenkapp 59f85c5976 implement in-call control mechanism (this allows the FNE to command a host to stop transmitting if a ACL check fails);
1 year ago
Bryan Biedenkapp f40e6c6af0
Merge Peer Link Enhancement Changes (#73)
1 year ago
Bryan Biedenkapp 8c00c7b81c add missing peer link parameter when saving peer list;
1 year ago
Bryan Biedenkapp 2e2e8bf957 fix all instances of (uint32_t) for calcTxOffset;
1 year ago
Bryan Biedenkapp 3ed87d4f89 slim down the embedded zlib library;
1 year ago
Bryan Biedenkapp 5f601247b7 add zlib 1.3.1 dep (included in common); implement Peer-Link feature, this allows a master CFNE, when configured by peer list, to transmit complete talkgroup, RID and peer list data to subordinate CFNEs;
1 year ago
Bryan Biedenkapp ff6658cae7 how did no one find this, like how was this missed? add missing affiliated flag being sent from FNE to host;
1 year ago
Bryan Biedenkapp ab32e8c8be implement getDefault for json::value, this helps correct a flaw in picojson that causes get to fail with an assertion;
1 year ago
Bryan Biedenkapp 4f5369a582 because I just made this error, lets make sure debug builds are clearly labeled [and as such we'll label them in a cheeky way ;)];
1 year ago
Bryan Biedenkapp fe66aff8ab correct long lingering frequency rounding error when calculating freq in MHz;
1 year ago
Bryan Biedenkapp 8f6319d15e refactor SysView and more tightly integrate with the DVM stack; add CC voice channel reporting in the peer status message; add support on the FNE to report activity log and peer status to SysView instances;
1 year ago
Bryan Biedenkapp cd56011f87 refix issue with REST client (I shrunk a buffer for testing and didn't re-enbigen it); enhance some sysview displays slightly;
1 year ago
Bryan Biedenkapp fe6f7508c0 add code dump of private sysview FNE monitoring utility to public GPL; correct issue with large REST responses getting truncated;
1 year ago
Bryan Biedenkapp ce008197fd bug fixes for tged;
2 years ago
Bryan Biedenkapp 538763c203 allow length written to be returned;
2 years ago
Bryan Biedenkapp 582629c395 add rule name alias for future use;
2 years ago
Bryan Biedenkapp 4786923b1e fix sleep deprived typos;
2 years ago
Bryan Biedenkapp f68532ed33 [EXPERIMENTAL] add possible support to convertToAir V.24 PDU frames;
2 years ago
W3AXL 8c836ec336 whoops, put this in the right place
2 years ago
W3AXL babfdeb4f3 fixed U: log messages causing journalctl spam
2 years ago
Bryan Biedenkapp d106fbb062 add some extra length documentation for RTP packets; make network ringbuffer initialized value a constant; continue logic implementation for P25 data; correct buffer issue on P25 data;
2 years ago
Bryan Biedenkapp a880d2734e implement call collision timeouts; fix GRP_VCH_GRANT_UPD allow it to carry 2 channels per spec;
2 years ago
Bryan Biedenkapp 8ba2528533 bump overall version number with release of dvmbridge C++ alpha and Win32 support;
2 years ago
Bryan Biedenkapp 65fa91b7cb
[THIS MAY BREAK THINGS, BE AWARE] Merge Win32 support and C++ dvmbridge into master. (#67)
2 years ago
Bryan Biedenkapp 6542443ca7 add support to transmit dynamic regroup IR extended commands;
2 years ago
W3AXL f0d7ecb021 removed individual RID lookup prints
2 years ago
firealarmss e031b2bb8f
Add support for GRP UNAFFIL opcode. (#65)
2 years ago
Bryan Biedenkapp 093f8dd6e8 more warning cleanups;
2 years ago
Bryan Biedenkapp 27452f935d cleanup some warnings;
2 years ago
Bryan Biedenkapp 34855aed70 fix incorrect macro;
2 years ago
Bryan Biedenkapp 10232d2f9b OSP_TIME_DATE_ANN fix variable size;
2 years ago
Bryan Biedenkapp 1bada70ca4 better fix then the previous commit, flag a LC decode from an LDU1 as "raw only", use raw RS bytes always for a ModemV24 convertFromAir;
2 years ago
Bryan Biedenkapp c8a60af83c attempt to add pass thru support for some LCs;
2 years ago
Bryan Biedenkapp 59a5482473 silence "Failed writing data to the network" messages; silence out-of-sequence warnings if the pktSeq is 0; when the master reports it is closing, have peers restart their connection states;
2 years ago
W3AXL e7bec0504f corrected V24 TSBK offset
2 years ago
Bryan Biedenkapp 38bce6de04 fixup V.24 TSBK data offset; correct situation where ACL lists for a host would repeatedly be sent because the last update time was never changed (this could happen if the peer is in progress for traffic, if thats the case just ignore sending updates and wait till next interval to send them);
2 years ago
Bryan Biedenkapp 4f55a89201 implement some changes suggested by CLang; fix writePeerStatus() not using RTP_END_OF_CALL_SEQ;
2 years ago
Bryan Biedenkapp 617c889d1a
Merge DFSI host changes into master (#63)
2 years ago
Bryan Biedenkapp 2c640a53c4 allow OSP_TSBK_RAW to allocate and decode a raw unknown TSBK;
2 years ago
Bryan Biedenkapp eae8923227 various cleanups; correct incorrect implementation for copy constructors on DFSI FSC messages;
2 years ago
Bryan Biedenkapp e0ea19b350 move dvmdfsi/frames into common; make host Modem class inheritable;
2 years ago
Bryan Biedenkapp 9205f514a1 increase time between modem polls to 750us;
2 years ago
Bryan Biedenkapp abe45a1d53 fix up file headers;
2 years ago
W3AXL 34d17d961a added DVMV24 board info reporting
2 years ago
Bryan Biedenkapp 8ba9e5c846 fix up Catch2 tests (these are woefully maintained...); add support for RC4-type encryption;
2 years ago
Bryan Biedenkapp cb5329b2ca simplify poll implementation;
2 years ago
Bryan Biedenkapp 47d89febdf fix various valgrind reports;
2 years ago
Bryan Biedenkapp 355db0c9cc [This commit contains highly-experimental and possibly unstable alterations to core archeitcture on dvmhost] deprecate ThreadFunc (using C++ lambda's was a bad idea to begin with); refactor some startup messages; refactor use of ThreadFunc in FNE; refactor how threads were created in the FNE; [EXPERIMENTAL] refactor the host architecture to use threading for modem clocking and protocol readers;
2 years ago
Bryan Biedenkapp 4ba65c5bab fix issue where when *decoding* a EXT_FNCT the src and dst would be inverted resulting in bad logging;
2 years ago
Bryan Biedenkapp e66365f3f4 add support to sleep for shorter periods of time;
2 years ago
Bryan Biedenkapp da2f6130a8 [NOTICE: this commit is *EXPERIMENTAL* and implements *very* early data support, it is expected to be buggy, incomplete or broken] implement VTUN interface (fne0) on the dvmfne (this requires dvmfne to be run as root on Linux system [untested on non-Linux] to create the tun interface); implement VIFace random MAC generation; implement P25 TIA-102.BAEB SCEP ARP (SCEP is always used for conventional data) on dvmfne; refactor P25 packet status bits (this may break things else where, beware!); properly implement P25 status bit flipping on inbound channel activity; implement functionality in the P25 and DMR DataHeader classes to calculate the proper raw PDU frame length; implement dvmfne ARP table creation and maintainence (this is buggy and requires more implementation and test); implement dvmfne VTUN -> PDU and PDU -> VTUN IP traffic forwarding (this is incomplete and requires more implementation and test); correct several issues on dvmhost p25::packet::Data with overlapped buffers;
2 years ago
Bryan Biedenkapp eb093b3f5f use epoll for VIFace;
2 years ago
Bryan Biedenkapp d32e62e3cf add virtual interface support class;
2 years ago
Bryan Biedenkapp dc29208e70 refactor DMR PDU processing to be more in-line with how P25 PDU processing is done; implement support on the FNE to inspect and dispatch DMR PDUs properly;
2 years ago
Bryan Biedenkapp c9e7dcc11f make LC_CALL_TERM use dstId;
2 years ago
Bryan Biedenkapp 369c3bee25 remove debug trace log messages (whoops); fix edge case situation where the modem may stop reading because the response state machine is stuck;
2 years ago
Bryan Biedenkapp 2be4ca2bec log ARP requests;
2 years ago
Bryan Biedenkapp c4147ecc5b ensure exSAP is reset properly;
2 years ago
Bryan Biedenkapp f3c3cc95ce refactor P25 PDU extended address handling (this loosely gets a lot of conventional data things working, Moto TMS for example will pass in conventional [although buggy]); pass PDU response data headers (with no block followers) across the network;
2 years ago
Bryan Biedenkapp 197ce833ac correct Trellis symbol skipping logic for DMR for 3/4 Trellis; enhance DMR short LC bits; correctly identify short LC for data and CSBK; correct buffered PDU repeat logic (when header has no blocks following);
2 years ago
Bryan Biedenkapp 88b619c71f implement initial logic to provide PDU processing on the FNE;
2 years ago
Bryan Biedenkapp a9bc150da7 add IP address column to RID tables (this is *NOT* used yet, and is for future use);
2 years ago
Bryan Biedenkapp d281844c74 byte reverse IP addresses returned for P25's OTA; fix conventional registration packets not properly transmitting; continued work on P25 data refactoring;
2 years ago
Bryan Biedenkapp ca3fc407c0 add helper to convert an IP in std::string to a uint32_t; add calculateLength() function to P25 PDU DataHeader to more easily calculate data header fields for a packet; correct missing DAC and MDPCO fields on SNDCPCtxActAccept; correct missing MDPCO field on SNDCPCtxActRequest; implement support for Control::writeRF_TDU to be sent to the immediate queue; implement support for Data::writeRF_PDU and Data::writeRF_PDU_User to send data to the immediate queue; add some TDU leader and trialers to PDU handling; enhance the AUTH_DMD by forcing the AMBTs to the immediate queue; continued enhancements to the SNDCP support;
2 years ago
Bryan Biedenkapp 6a040b6bec correct issue with P25 deregistrations always generating a U_REG_CMD instead of only generating a U_REG_CMD for registration timeouts;
2 years ago
Bryan Biedenkapp 882c2564ca correct double spaced formatting of CPP files in common; convert dvmhost to Doxygen documentation format; convert dvmfne to Doxygen documentation format; convert dvmcmd to Doxygen documentation format;
2 years ago
Bryan Biedenkapp 10e1e12be0 add doxygen configuration for dvmhost project; add doxygen output directory; convert common static library to use doxygen style commenting and documentation;
2 years ago
Bryan Biedenkapp 3861559f87 add support to send SNDCP disabled annoucement messages properly;
2 years ago
Bryan Biedenkapp f23d3931f4 add initial support to process SNDCP control PDU data;
2 years ago
Bryan Biedenkapp e90350d350 begin implementing some basic SNDCP handling logic (this isn't complete, and this doesn't make SNDCP work *yet*), however until the implementation is complete, this should prevent channels from becoming grant locked (hopefully);
2 years ago
Bryan Biedenkapp 45efd99801 support decoding rogue OSP_SNDCP_CH_GNT (even tho on DVM you can *enable* this you shouldn't because there's no SNDCP application that will respond);
2 years ago
Bryan Biedenkapp 35c07715bc don't use HUGE as a SiteModel because certain versions of GCC are awful;
2 years ago
Bryan Biedenkapp 9050ad7885 this should address the issues with #53, dvmhost and dvmdfsi *should* transparently pass unknown non-standard MFId LCs in the voice LDU1 frames; correct some logging irregularities in dvmdfsi;
2 years ago
Bryan Biedenkapp 55b1670121 update copyright dates;
2 years ago
Bryan Biedenkapp 673289c764 add more constant/enum documentation from specification documents;
2 years ago
Bryan Biedenkapp eacbc27143 add marking of whether an inbound CAC is long or short; fix issue with short CAC not properly building a puncturing buffer (even tho short CAC doesn't do puncturing, its needed for NXDN convolution); correct CAC getData() return; remove deprecated code causing decoding offsets to be wrong resulting in invalid RCCHs;
2 years ago
Bryan Biedenkapp 51bd9e749d implement CAC long puncturing for NXDN; correct issues with NXDN site information data;
2 years ago
Bryan Biedenkapp 5fde17f879 fix stupid GCC 4.9.3 for ARMHF non-sense;
2 years ago
Bryan Biedenkapp d702eeae9a update byte packing documentation on some headers/functions for -- future generations;
2 years ago
Bryan Biedenkapp 67429e3e34 use localtime instead of gmtime for logs;
2 years ago
Bryan Biedenkapp 92e9e2d8b0 correct toString() for CSBK_BROADCAST;
2 years ago
Bryan Biedenkapp cb0500b2e7 treewide: refactor constant variables into proper enumerations where appropriate (this applies to DMR, P25 and NXDN, and may introduce gremlins);
2 years ago
Bryan Biedenkapp 36c04a74ec move the NET_FUNC* and NET_SUBFUNC* constants into proper namespaced enums;
2 years ago
Bryan Biedenkapp e5e5462473 fix #54, this should fix issue #54 in dealing with segmented/fragemented HTTP requests; enhance debug messaging from REST API server;
2 years ago
Bryan Biedenkapp 1d0c8da331 bump project version to R04A01; remove extraneous files;
2 years ago
Patrick W3AXL 0bbc69d237
Basic implementation of dvmdfsi in dvmhost C++ ecosystem (#59)
2 years ago
Bryan Biedenkapp 2f918d759d implement support to send logs to the syslog;
2 years ago
Bryan Biedenkapp 2c560dc3ce add support to report host status JSON blob to FNE for storage in InfluxDB;
2 years ago
Bryan Biedenkapp f39e8de0e1 refactor PR#55's peer list implementation to utilize a lookup table; add support to peer list implementation, when in whitelist mode to support per peer passwords (techincally this works in blacklist mode but is ... well irrelevant as blacklist mode *rejects* connections from peers in the list file); correct a few issues regarding how NAKs are returned early in the authentication handshake; reformat log messages; fix issue in host voice when regular conventional traffic is sent to a DVRS-enabled channel and legacy group grant is disabled;
2 years ago
Bryan Biedenkapp 7840f6ebe8 cleanup some log messaging for the peer lookup table handler;
2 years ago
firealarmss bd3e737adf
REST Additions and added NAK reasons (#56)
2 years ago
firealarmss cba48ae54a
Add support for peer blacklist and whitelist (#55)
2 years ago
Bryan Biedenkapp 3335f7be39 add support to reload TG and RID lists via REST API for the FNE;
2 years ago
Bryan Biedenkapp 1de86458a6 fix DVRS unit deregistration issue (units weren't registered properly during GRP_AFF because DVRS doesn't do the typical U_REG); implement 12-hour timeout for unit registrations (this is only applied if the SU in question has *NOT* had *ANY* activity within 12 hours);
2 years ago
Bryan Biedenkapp 0251944438 fix ability to set MFID via REST before issuing P25 commands; implement MBT for GRP_AFF_Q_RSP;
2 years ago
Bryan Biedenkapp f60ac33a34 add log messages for always being used;
2 years ago
Bryan Biedenkapp c8eb52a57d add try {} catch {} around some critical ASIO read calls to prevent application crash (this won't resolve the errors but should prevent application crash); implement support for peer ID list that *always* receives traffic for a TGID regardless of affiliation rules;
2 years ago
Bryan Biedenkapp 70600d3fd7 remove deprecated options; ensure we check if a peer is enabled on the FNE before attempting to read/write to it; silence BUGBUG UDP write message;
2 years ago
Bryan Biedenkapp 9b6fcdbdf7 fix incorrect assembly of DENY TSDUs for certain services; replace QUEUE TSDUs for grant TSDUs with DENY TSDUs;
2 years ago
Bryan Biedenkapp afa47f4b58 fix bonehead mistake not cleaning up arrays before reallocating them;
2 years ago
Bryan Biedenkapp a7f9cb93be fix issue handling $F7E NAC; implement $F7F NAC support;
2 years ago
Bryan Biedenkapp ae3a03b521 fix LC_GROUP_UPDT using duplicated data;
2 years ago
Bryan Biedenkapp 9b828fe7a4 ensure the lookup table thread is named; don't display the not transmitting CC messages unless the test timer is not paused; add aggressive watchdog logging for when timers exceed 1s intervals; split adj. site and affiliation updating into a separate thread (huge adj. site updates could be the cause of main loop processing delays); ensure threads are properly shutdown; increase P25 adj site update timer from 30 seconds to 60 seconds (5 minutes of no updates will now FAIL an adj. site);
2 years ago
Bryan Biedenkapp 36099367c8 fix condition where the Log and ActivityLog would overflow the character buffer by no properly calculating the length of the va_args string (this should resolve buffer overflow terminations on GCC 13+);
2 years ago
Bryan Biedenkapp cbb0af42ba fix some minor DVRS/conventional weirdness;
2 years ago
Bryan Biedenkapp 5650db1657 for LDU LC's pass thru any non-standard MFIDs without any further processing as-is;
2 years ago
Bryan Biedenkapp c7b0fc3a9d add support to encode a GRP_AFF_RSP as an AMBT (this is just the data serialization part and not the actual business logic in the host);
2 years ago
Bryan Biedenkapp 24082b9652
P25 data (#52)
2 years ago
Bryan Biedenkapp be7230d68d used incorrect variables to set the WACN and system ID for the auth demand OSP (thanks max);
2 years ago
Bryan Biedenkapp 7e3e006fd1 fix comment typo;
2 years ago
Bryan Biedenkapp e0b6da51fb make the network presence announcment (VC -> CC and CC -> FNE) timing configurable (this value is in seconds); refactor RF channel enumeration, RF channels are now enumerated in their own class ChannelLookup instead of being integrated into AffiliationLookup, this allows the flexibility to update and change channel information at runtime; add support for VC -> CC presence/registration to tell the CC what the REST information is for that VC, this makes the restAddress and restPort entries for the voiceChNo list in the config.yml optional, the only mandatory fields are channelId, channelNo and restPassword;
2 years ago
Bryan Biedenkapp 0f7eabff82 implement support for peers that identify themselves as "conventional" to ignore affiliated talkgroup rules and be able to receive all traffic if the FNE is configured to allow promiscuous operation; implement extremely preliminary support to allow a CC to claim a VC peer, allowing for appropriate grouping of peers for trunked sites;
2 years ago
Bryan Biedenkapp f8aa80a63f continued work on P25 PDU handling (this has a long way to go...);
2 years ago
Bryan Biedenkapp c99efa1f14 fix issue with bad offsets for AUTH_RESP data (this happened back in Decemeber when the payload array layout was altered);
2 years ago
Bryan Biedenkapp 7cc2b99000 pass VSELP1/2 frames (this is experimental, in my tests doesn't break anything else, but it could), this will also pass VSELP1/2 frames to the network core but the host doesn't currently carry code to retransmit network VSELP frames over the air [yet];
2 years ago
Bryan Biedenkapp 9055e3aaa8 update copyrights;
2 years ago
Bryan Biedenkapp 4d776f6314 add support for DMR T3 adjacent site broadcast;
2 years ago
Bryan Biedenkapp b19c1d5f6a add support for processing CSBK on the FNE; add support to optionally log TSBK and CSBK network events to InfluxDB;
2 years ago
Bryan Biedenkapp 96a9ba1c03 implement trunking site preference support for TGIDs, this implements a feature by which TGIDs can be gated to allow affiliation to preferred sites, all other non-preferred sites will DENY affiliation causing the radio to attempt to roam to another site (this is a trunking only feature and does not change conventional operation);
2 years ago
Bryan Biedenkapp 1ef806fef1 handle edge-case scenario of RTP packet sequence overrun;
2 years ago
Bryan Biedenkapp 856fa98357 make the REST response wait time variable; use a quick response time of 150ms when using REST API during real-time OTA packet processing; add extra logging messages for UDP;
2 years ago
W3AXL 9675f42db5 added ability to save RID/TGID lookups from the FNE to local files
2 years ago
W3AXL 01bd534c8f fixed RID alias updates not working via REST
2 years ago
Bryan Biedenkapp 5571a71e4e replace manual lock/unlock with lock_guard to ensure a lock is held in a scope, and released when a scope is closed;
2 years ago
Bryan Biedenkapp b7c6282767 fix for possible race condition (that shouldn't have happened in the first place), if writeMaster is being used in queueOnly = false, do an immediate network socket write without attempting to enqueue a message;
2 years ago
Bryan Biedenkapp 86d736b0bb revert change from 0ea6ee0 that changed the RingBuffer const char* to std::string to correct issue where the RingBuffer name is being copied incorrectly; change method for copying name std::string passed to AffiliationLookup; remove accidentally committed debug code;
2 years ago
Bryan Biedenkapp e2514c1f8f mild include reorg;
2 years ago
Bryan Biedenkapp 31ca17449d *BEWARE* this commit alters the RPI_ARM cross-compiler and may break things *BEWARE*; implement support for HTTPS SSL REST API configuration; add contrib binary overlay for the RPI_ARM compiler (to add libssl-dev dependences);
2 years ago
Bryan Biedenkapp cda6b5965f add support for optional TCP SSL/TLS sockets;
2 years ago
Bryan Biedenkapp b4f9b2d201 fix some issues with the "unsupported no no mode" that people continue to abuse; correct issue with calculating list offsets when announcing RID lists to the host;
2 years ago
Bryan Biedenkapp ecdce85e8a clean up file;
2 years ago
Bryan Biedenkapp 9dadc06130 I was asked for ASCII art, and I deliver, thus, ASCII art;
2 years ago
Bryan Biedenkapp c3f9b69454 catch and log certain situations where a buffer in a buffer vector may be released (this is likely due to a non-tread safe network flush); expose size of inclusion, exclusion and rewrite lists so we don't need to copy them to know the size;
2 years ago
Bryan Biedenkapp ba785f3d91 hide debug here (m_debug/m_verbose should be adhered to in classes as they *optionally* enable debug trace for modules, allowing the LogLevel to be set to 1 and not spam the log/console with unintended debug statements); alter bad handling of a compiler constant string for the Server/User-Agent strings;
2 years ago
Bryan Biedenkapp 1e8a842a30 document functions in the Thread class; add a helper detach() method for future use;
2 years ago
Bryan Biedenkapp 4acb60aeff add more plumbing to the CFNE for future use;
2 years ago
Bryan Biedenkapp e7ce1d1f20 report errno errors from pthread_create;
2 years ago
Bryan Biedenkapp c4ca72581f for performance reasons on very noisy/busy setups that may have *lots* of peers, use of an alternate port to service diagnostic and activity log transfers helps ensure the traffic port doesn't become overloaded with data;
2 years ago
Bryan Biedenkapp 8ca4ed5a40 implement a few more CFNE NAK types to notify the peer of invalid conditions; take first steps towards FNE-side authoritative grants by implementing some logic plumbing;
2 years ago
Bryan Biedenkapp b7ebfa43e4 reorganize source code slightly, we shouldn't define logic in the CPP files for the talkgroup rules data classes, and instead we should define the logic in the header (since logic for these data classes shouldn't be anything complicated anyway);
2 years ago
Patrick W3AXL d8eff1f1f4
got tgid editing via REST mostly working (#49)
2 years ago
Bryan Biedenkapp 5d6c99da43 add missing mutex unlocks for the lookup tables (I'm not sure how this hasn't caused a problem); reorganize the code in FNENetwork and make threadedNetworkRx private; add some counting logic to ensure the voice tag classes flush voice frames every 5 peers to ensure timely delivery of packets;
2 years ago

Powered by TurnKey Linux.