oscam-2.26.01-11942-802-wit.../webif/pages_wiki.c

656 lines
248 KiB
C
Raw Normal View History

/*
* OSCam WebIf Wiki data - AUTO GENERATED, DO NOT EDIT!
* Generated by wiki_gen from wiki markdown files
*/
#define MODULE_LOG_PREFIX "webif"
#include "../globals.h"
#if defined(WEBIF) && defined(WEBIF_WIKI)
#include "pages_wiki.h"
#include <string.h>
static const struct wiki_entry wiki_entries[] = {
{ .param = "Parameters", .config = "ratelimit", .section = "", .text = "- **CAID**: Conditional Access Identification in hexadecimal (e.g., 0100, 0500, 1702)\n- **provider ID**: Provider ID in hexadecimal (e.g., 000000, 003411)\n- **service ID**: Service ID in hexadecimal (specific channel or use wildcard)\n- **ChID**: Channel ID in hexadecimal\n- **ratelimitecm**: Number of different SIDs (channels) allowed within the time interval\n- **ratelimitseconds**: Time interval in seconds for the rate limit\n- **srvidholdseconds**: Extra time in seconds a service ID is kept in a slot before another service ID can take its place", .status = 0 },
{ .param = "Rate", .config = "ratelimit", .section = "", .text = "1. OSCam tracks ECM requests for each CAID:ProvID combination\n2. It maintains a list of recently accessed service IDs (channels)\n3. When a new channel is requested, OSCam checks if the limit is reached\n4. If the limit is exceeded within the time window, the request is denied\n5. After the time interval expires, the counter resets", .status = 0 },
{ .param = "Slot", .config = "ratelimit", .section = "", .text = "The `srvidholdseconds` parameter adds \"stickiness\" to channel slots:\n- When you switch to a channel, it occupies a slot\n- That slot is held for the specified extra time\n- This prevents rapid slot turnover and encourages staying on channels longer\n- After the hold time expires, the slot can be reused for a different channel", .status = 0 },
{ .param = "Preventing", .config = "ratelimit", .section = "", .text = "Limit users to 3 channels per 30 seconds:\n\n```\n1702:000000::::0003:0030:0010\n```\n\nThis allows accessing 3 different channels in 30 seconds, with each channel held for 10 extra seconds.", .status = 0 },
{ .param = "Provider-Specific", .config = "ratelimit", .section = "", .text = "Different limits for different providers:\n\n```\n# Sky Germany - 2 channels per 15 seconds\n1702:000000::::0002:0015:0005\n\n# HD+ - 4 channels per 20 seconds\n1830:003411::::0004:0020:0008\n\n# Canal+ - 3 channels per 30 seconds\n0100:003311::::0003:0030:0010\n```", .status = 0 },
{ .param = "Strict", .config = "ratelimit", .section = "", .text = "Very restrictive limit for shared cards:\n\n```\n0500:032830::::0001:0060:0030\n```\n\nThis allows only 1 channel per 60 seconds, effectively preventing channel switching for a full minute.", .status = 0 },
{ .param = "Moderate", .config = "ratelimit", .section = "", .text = "Balanced approach for normal usage:\n\n```\n# Allow 5 channels per 20 seconds\n1702:000000::::0005:0020:0005\n```", .status = 0 },
{ .param = "All", .config = "ratelimit", .section = "", .text = "```\n0100:::::0003:0030:0010\n```\n\nApplies to all providers under CAID 0100.", .status = 0 },
{ .param = "All", .config = "ratelimit", .section = "", .text = "```\n:::::0002:0015:0005\n```\n\nApplies globally to all CAIDs and providers (use with caution).", .status = 0 },
{ .param = "Setting", .config = "ratelimit", .section = "", .text = "- Consider normal viewing patterns (most users watch 1-2 channels)\n- Allow some flexibility for legitimate channel browsing\n- Balance between preventing abuse and user experience\n- Test limits with real usage before deploying", .status = 0 },
{ .param = "Time", .config = "ratelimit", .section = "", .text = "- Shorter intervals (10-20 seconds) provide tighter control\n- Longer intervals (30-60 seconds) are more lenient\n- Match intervals to your usage policy goals", .status = 0 },
{ .param = "Hold", .config = "ratelimit", .section = "", .text = "- Hold times should be shorter than the rate limit interval\n- Typical values: 3-10 seconds\n- Longer hold times discourage rapid switching\n- Too long may frustrate legitimate users", .status = 0 },
{ .param = "Monitoring", .config = "ratelimit", .section = "", .text = "- Monitor logs for rate limit violations\n- Adjust limits based on actual usage patterns\n- Consider different limits for different user groups\n- Review and update limits periodically", .status = 0 },
{ .param = "Users", .config = "ratelimit", .section = "", .text = "- Limits may be too restrictive\n- Increase `ratelimitecm` value\n- Increase `ratelimitseconds` interval\n- Reduce `srvidholdseconds` hold time", .status = 0 },
{ .param = "Abuse", .config = "ratelimit", .section = "", .text = "- Limits may be too lenient\n- Decrease `ratelimitecm` value\n- Decrease `ratelimitseconds` interval\n- Increase `srvidholdseconds` hold time", .status = 0 },
{ .param = "Legitimate", .config = "ratelimit", .section = "", .text = "- Review actual usage patterns\n- Adjust limits to accommodate normal behavior\n- Consider different limits for trusted users\n- Use per-user limits in oscam.user instead", .status = 0 },
2026-02-17 10:48:41 +00:00
{ .param = "Parameters", .config = "ac", .section = "", .text = "- **CAID**: Conditional Access Identification - numeric identifier for the encryption provider\n- **provider ID**: Numeric identifier for the Pay TV provider\n- **seconds**: Time interval in seconds defining the minimum time between control word changes\n\nThe asterisk (*) can be used to define a default value for all providers not explicitly listed.", .status = 0 },
{ .param = "Basic", .config = "ac", .section = "", .text = "```\n0100:000000=10\n*=7\n```\n\nFor CAID 0100 with provider 000000, the time interval is set to 10 seconds. For all other CAIDs not explicitly defined, the default interval is 7 seconds.", .status = 0 },
{ .param = "Sky", .config = "ac", .section = "", .text = "```\n1702:000000 = 7 # Sky S02 - 7 second interval\n1833:000401 = 7 # HD+ - 7 second interval\n*=7 # Default 7 seconds for all other providers\n```", .status = 0 },
{ .param = "Alternative", .config = "ac", .section = "", .text = "```\n1702:000000 = 10 # Sky S02 - 10 second interval\n1833:000401 = 10 # HD+ - 10 second interval\n*=7 # Default 7 seconds for all other providers\n```", .status = 0 },
{ .param = "Multiple", .config = "ac", .section = "", .text = "```\n0100:000000=10 # Provider 1 - 10 seconds\n0200:000001=8 # Provider 2 - 8 seconds\n0300:000002=12 # Provider 3 - 12 seconds\n*=7 # Default for all others\n```", .status = 0 },
{ .param = "Choosing", .config = "ac", .section = "", .text = "- Typical intervals range from 7 to 10 seconds\n- Shorter intervals (5-7 seconds) provide stricter anti-cascading protection\n- Longer intervals (10-15 seconds) are more lenient but may miss some cascading attempts\n- Consider the normal channel switching behavior of legitimate users", .status = 0 },
{ .param = "Configuration", .config = "ac", .section = "", .text = "1. Start with a default value using the wildcard (*) entry\n2. Add specific entries for high-value providers that need stricter control\n3. Test the configuration to ensure legitimate users aren't affected\n4. Monitor logs for potential cascading attempts", .status = 0 },
{ .param = "Common", .config = "ac", .section = "", .text = "- **1702:000000**: Sky Germany (S02 cards)\n- **1833:000401**: HD+ Germany\n- **0100:000000**: Seca/Mediaguard systems\n- **0500:000000**: Viaccess systems\n- **0D95:000000**: ORF ICE", .status = 0 },
{ .param = "label", .config = "server", .section = "reader", .text = "**🔴 Required parameter**\n\nName for reader.\n\n**Format:**\n```ini\nlabel = name\n```\n\n**Example:**\n```ini\nlabel = easymouse2\n```", .status = 0 },
{ .param = "description", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nDescription of reader (text).\n\n**Format:**\n```ini\ndescription = text\n```\n\n**Example:**\n```ini\ndescription = My main card reader\n```\n\n**Default:**\n```ini\ndescription =\n```", .status = 0 },
{ .param = "enable", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nDeactivate reader.\n\n```ini\nenable = 0 # off\nenable = 1 # on (default)\n```\n\n**Format:**\n```ini\nenable = 0|1\n```\n\n**Example:**\n```ini\nenable = 0\n```\n\n**Default:**\n```ini\nenable = 1\n```", .status = 0 },
{ .param = "protocol", .config = "server", .section = "reader", .text = "**🔴 Required parameter**\n\nReader protocol.\n\n**Values:**\n```ini\nprotocol = mouse # Local cardreader\n = internal # All cardreader with \"device=/dev/sciX\", and internal Coolstream-Reader\n = camd35 # Cascading - camd 3.5-compatible remote server - UDP\n = cs357x # Cascading - camd 3.5-compatible remote server - UDP\n = mp35\n = smartreader\n = serial\n = cs378x # Camd 3.5-compatible remote server - TCP\n = gbox\n = newcamd # newcamd protocol\n = newcamd525\n = newcamd524\n = cccam\n = radegast\n = pcsc\n = constcw\n = sc8in1\n = smargo\n```", .status = 0 },
{ .param = "device", .config = "server", .section = "reader", .text = "**🔴 Required parameter**\n\nDefine local or remote reader.\n\n**Syntax:**\n```ini\ndevice = [<readertype>;]serial:serialnum|bus:device|<device|device:slot>|<ip|hostname>,<port>[,<lport>]|pcsc|<0|1>|constantcw\n```\n\n**Reader Types:**\n- `SR:` Smartreader+ (default)\n- `SRv2:` Smartreader V2\n- `Infinity:` Infinity USB\n- `TripleP1:` Smargo Triple Reader port 1\n- `TripleP2:` Smargo Triple Reader port 2\n- `TripleP3:` Smargo Triple Reader port 3\n\n**Device Formats:**\n- `bus:device` - Bus name and device name of the smartreader+ (get the name with lsusb 'Bus' and 'Device')\n- `serialnum` - Serial number of Smartreader+ or Infinity USB (get the serial number while starting OSCam)\n- `device` - Device name\n- `device:slot` - Device name and slot number sc8in1 (1-8), only one sc8in1 reader supported\n- `ip|hostname` - IP address or host name\n- `port` - TCP/IP port\n- `lport` - Remapping to local TCP/IP port\n- `PCSC` - Number of PCSC reader, starting with 0. Alternative: select via reader name (part), e.g., \"-1:SCR 3310\" (names of detected readers are shown by \"oscam -d 32\")\n- `0|1` - **For Coolstream HD-1 STB only:** select reader 0 or reader 1\n- `constantcw` - Constant CW file name\n\n**CW File Format:**\n\n*Standard:*\n```\nCAID:Provider ID:Service ID:PMT ID:ECM PID::key (16 Bytes separated by spaces)\n```\nExample:\n```\n1234:123456:1234:2345:3456::00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n```\n\n*Extended OSCam-Format:*\n```\nCAID:Provider ID:Service ID:PMT ID:ECM PID:Video PID:key (16 Bytes separated by spaces)\n```\nExample:\n```\n1234:123456:1234:2345:3456:7890:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n```\n\n**Examples:**\n```ini\ndevice = /dev/ttyS0 # Reader on COM1 (Linux i386 and Windows)\ndevice = /dev/tts/1 # Reader on COM2 (Linux dbox2 with multicam)\ndevice = /dev/ttyUSB0 # Reader on USB (Linux i386)\ndevice = /dev/ttyUSB0:1 # Slot 1 SC8in1 or MCR 4/8 (Linux i386)\n```\n\n⚠️ **Attention:** Counting begins with 0, that means number of device is one less than number of COM-Port! E.g., ttyS0 = COM1, tts/1 = COM2.", .status = 0 },
{ .param = "ipv4force", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nForce IPv4 connection for this reader even when IPv6 is available.\n\n```ini\nipv4force = 0 # use IPv6 if available (default)\nipv4force = 1 # force IPv4 only\n```\n\n**Format:**\n```ini\nipv4force = 0|1\n```\n\n**Example:**\n```ini\nipv4force = 1\n```\n\n**Default:**\n```ini\nipv4force = 0\n```", .status = 0 },
{ .param = "key", .config = "server", .section = "reader", .text = "**🔵 Parameter depends on setup/program version**\n\nKey for newcamd remote reader encryption.\n\n**Format:**\n```ini\nkey = 14_hex_bytes\n```\n\n**Example:**\n```ini\nkey = 0102030405060708091011121314\n```\n\n**Default:**\n```ini\nkey =\n```", .status = 0 },
{ .param = "user", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nUser for remote reader (name).\n\n**Format:**\n```ini\nuser = username\n```\n\n**Example:**\n```ini\nuser = username\n```\n\n**Default:**\n```ini\nuser =\n```", .status = 0 },
{ .param = "password", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nPassword for remote reader.\n\n**Format:**\n```ini\npassword = secret\n```\n\n**Example:**\n```ini\npassword = secret\n```\n\n**Default:**\n```ini\npassword =\n```", .status = 0 },
{ .param = "pincode", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nPincode for **Conax, Cryptoworks and Viaccess** SCs.\n\n**Example:**\n```ini\npincode = 1234\n```\n\n**Default:**\n```ini\npincode =\n```", .status = 0 },
{ .param = "readnano", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nWrite file (usually a copy of a file saved by `savenano`) to your smartcard. If no path is specified, the specified file is searched for in the configuration directory. Only valid for physical readers!\n\n**Examples:**\n```ini\nreadnano = write.emm\n = /var/oscam/write.emm\n = # Blank (default)\n```", .status = 0 },
{ .param = "services", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n⚠️ **Attention:** If loadbalancing is enabled in `oscam.conf [global]` among `lb_mode`, then there may be **no entries**!\n\n⚠️ **Attention:** The number of services that will be considered based reader, is limited to 64, or 64 times [service-name][CAID][provid][srvid]!\n\nAssignment to service group. This requires an `oscam.services` file to be present.\n\n**Logic (in this order):**\n1. If the field is empty (or invalid), the request is allowed.\n2. When a negative service (i.e., those with \"!\") is applicable, the request is rejected.\n3. If a positive service is applicable or there is no positive service, the request is allowed.\n4. If none of the previous points, the request is rejected.\n\nThis means that negative services are only necessary in individual cases - when services has positive entries, but you want to exclude some. This is not recommended, because misconfiguration can occur easily. Instead, create an additional service that contains all the relevant channels.\n\n**Syntax:**\n```ini\nservices = [!]service[,[!]service]...\n = # Blank (default)\n```", .status = 0 },
{ .param = "lb_whitelist_services", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nReader assignment to service group for channels which may never be blocked by the loadbalancer to the reader.\n\n**Syntax:**\n```ini\nlb_whitelist_services = <services>,<services>...\n```\n\n**Default:**\n```ini\nlb_whitelist_services =\n```", .status = 0 },
{ .param = "inactivitytimeout", .config = "server", .section = "reader", .text = "**🔵 Parameter depends on setup/program version**\n\nInactivity timeout in seconds.\n\n```ini\ninactivitytimeout = -1 # Reconnect on network failure for newcamd based readers, even in idle\ninactivitytimeout = 0 # Default\n```\n\n**Format:**\n```ini\ninactivitytimeout = -1|0|seconds\n```\n\n**Example:**\n```ini\ninactivitytimeout = 300\n```\n\n**Default:**\n```ini\ninactivitytimeout = 0\n```", .status = 0 },
{ .param = "reconnecttimeout", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nReconnect from a remote reader, if missing answers in seconds.\n\n**Format:**\n```ini\nreconnecttimeout = seconds\n```\n\n**Example:**\n```ini\nreconnecttimeout = 20\n```\n\n**Default:**\n```ini\nreconnecttimeout =\n```", .status = 0 },
{ .param = "reconnectdelay", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nDelay in milliseconds before reconnecting to the remote server after a connection loss.\n\n**Format:**\n```ini\nreconnectdelay = milliseconds\n```\n\n**Example:**\n```ini\nreconnectdelay = 30000\n```\n\n**Default:**\n```ini\nreconnectdelay = 60000\n```", .status = 0 },
{ .param = "resetcycle", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nNumber of ECMs until SC reset is performed.\n\n⚠️ **Hint:** Valid for physical readers only!\n\n**Format:**\n```ini\nresetcycle = count\n```\n\n**Example:**\n```ini\nresetcycle = 5\n```\n\n**Default:**\n```ini\nresetcycle = 0\n```", .status = 0 },
{ .param = "disableserverfilter", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nIgnore CAID and ident settings of reader due to faulty clients.\n\n```ini\ndisableserverfilter = 0 # Not ignore (default)\ndisableserverfilter = 1 # Ignore\n```\n\n**Format:**\n```ini\ndisableserverfilter = 0|1\n```\n\n**Example:**\n```ini\ndisableserverfilter = 1\n```\n\n**Default:**\n```ini\ndisableserverfilter = 0\n```", .status = 0 },
{ .param = "connectoninit", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nAllow newcamd connections to be established on startup although there isn't a request yet.\n\n```ini\nconnectoninit = 0 # Default\nconnectoninit = 1 # Allow connection on init\n```\n\n**Format:**\n```ini\nconnectoninit = 0|1\n```\n\n**Example:**\n```ini\nconnectoninit = 1\n```\n\n**Default:**\n```ini\nconnectoninit = 0\n```", .status = 0 },
{ .param = "keepalive", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nKeep connection alive.\n\n```ini\nkeepalive = 0 # Always on if cacheex reader type (default)\nkeepalive = 1 # Allow cs378x TCP socket to be always connected\n```\n\n**Format:**\n```ini\nkeepalive = 0|1\n```\n\n**Example:**\n```ini\nkeepalive = 1\n```\n\n**Default:**\n```ini\nkeepalive = 0\n```", .status = 0 },
{ .param = "smargopatch", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nEnable workaround for smartreader+ and reader until native mode works.\n\n```ini\nsmargopatch = 0 # Disabled (default)\nsmargopatch = 1 # Enabled\n```\n\n**Format:**\n```ini\nsmargopatch = 0|1\n```\n\n**Example:**\n```ini\nsmargopatch = 1\n```\n\n**Default:**\n```ini\nsmargopatch = 0\n```", .status = 0 },
{ .param = "autospeed", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nAuto speed detection.\n\n```ini\nautospeed = 0 # Disabled\nautospeed = 1 # Enabled (default) - Sets mhz according to ATR\n```\n\nCurrently only used for smartreader, smargo protocol and Dreambox-readers internal protocol. Other readers will be adapted to use this parameter as well.\n\nIf you want to overclock your card, set autospeed to 0.\n\n**Format:**\n```ini\nautospeed = 0|1\n```\n\n**Example:**\n```ini\nautospeed = 0\n```\n\n**Default:**\n```ini\nautospeed = 1\n```", .status = 0 },
{ .param = "sc8in1_dtrrts_patch", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nEnable fix for SC8in1/MCR DTR/RTS kernel bug.\n\n```ini\nsc8in1_dtrrts_patch = 0 # Disabled (default)\nsc8in1_dtrrts_patch = 1 # Enabled\n```\n\n**Format:**\n```ini\nsc8in1_dtrrts_patch = 0|1\n```\n\n**Example:**\n```ini\nsc8in1_dtrrts_patch = 1\n```\n\n**Default:**\n```ini\nsc8in1_dtrrts_patch = 0\n```", .status = 0 },
{ .param = "fallback", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nDefine reader as fallback. Standard and fallback reader must have the same group (see **group** parameter)!\n\n```ini\nfallback = 0 # No fallback reader (default)\nfallback = 1 # Fallback reader\n```\n\n**Format:**\n```ini\nfallback = 0|1\n```\n\n**Example:**\n```ini\nfallback = 1\n```\n\n**Default:**\n```ini\nfallback = 0\n```", .status = 0 },
{ .param = "fallback_percaid", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nUse reader as fallback for defined CAIDs only. Two digit wildcards CAIDs are possible. `fallback_percaid` overrules `fallback`.\n\n**Syntax:**\n```ini\nfallback_percaid = <CAID>[:<ident>[,ident]]...[;<CAID>[:<ident>[,ident]]...]...\n```\n\n**Example:**\n```ini\nfallback_percaid = 1234:234567;10:345678\n```\n\n**Default:**\n```ini\nfallback_percaid =\n```", .status = 0 },
{ .param = "localcards", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nUse this reader (for defined CAIDs only) as \"local\" in LB/reader selection. It will be handled as a local reader per LB and preferlocalcards settings. In this way, we can consider a network reader as local, like we had a cardreader.\n\n**Syntax:**\n```ini\nlocalcards = <CAID>[:<ident>[,ident]]...[;<CAID>[:<ident>[,ident]]...]...\n```", .status = 0 },
{ .param = "disablecrccws_only_for", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**Syntax:**\n```ini\ndisablecrccws_only_for = CAID:PROVID;CAID:PROVID\n```\n\n**Example:**\n```ini\ndisablecrccws_only_for = 0500:032830;098C:000000\n```", .status = 0 },
{ .param = "cacheex", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nEnable cache exchange mode for camd 3.5x and CCcam protocol.\n\n```ini\ncacheex = 0 # Disabled (default)\ncacheex = 1 # Enable cache exchange pull mode\ncacheex = 2 # Enable cache exchange push mode\ncacheex = 3 # Enable cache exchange reverse push mode\n```\n\n📋 See also on `oscam.user`!\n\n⚠️ Identical cache exchange modes must be set on local OSCam server and remote OSCam user account!\n\n**Format:**\n```ini\ncacheex = 0|1|2|3\n```\n\n**Example:**\n```ini\ncacheex = 2\n```\n\n**Default:**\n```ini\ncacheex = 0\n```\n\n#### cacheex modes\n\n#### cacheex = 1 - cachepull\n\n**Situation:**\n- OSCam A reader1 has `cacheex = 1`\n- OSCam B account1 has `cacheex = 1`\n\nOSCam A gets an ECM request, reader1 sends this request to OSCam B.\n\nOSCam B checks his cache:\n- Not found in cache: return NOK\n- Found in cache: return OK+CW\n- Not found in cache, but found pending request: wait `cacheexwaittime` in `oscam.conf [global]` and check again. OSCam B never requests new EMMs.\n\n**CW-flow:** B → A\n\n#### cacheex = 2 - cachepush\n\n**Situation:**\n- OSCam A reader1 has `cacheex = 2`\n- OSCam B account1 has `cacheex = 2`\n\nIf OSCam B gets a CW, it's pushed to OSCam A. Reader has normal functionality and can request ECMs.\n\n- Problem: OSCam can only push CWs if OSCam A is connected\n- Problem or feature?: OSCam A reader can request ECMs from OSCam B\n\n**CW-flow:** B → A\n\n#### cacheex = 3 - reversecachepush\n\n**Situation:**\n- OSCam A reader1 has `cacheex = 3`\n\nIf OSCam A gets a CW, it's pushed to OSCam B. OSCam A never requests new ECMs.\n\n**CW-flow:** A → B", .status = 0 },
{ .param = "cacheex_maxhop", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nDefine maximum hops for cache exchange.\n\n**Format:**\n```ini\ncacheex_maxhop = hops\n```\n\n**Example:**\n```ini\ncacheex_maxhop = 5\n```\n\n**Default:**\n```ini\ncacheex_maxhop = 10\n```", .status = 0 },
{ .param = "cacheex_maxhop_lg", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nDefine a maxhop for lg-flagged CWs for push/receive, to allow a higher maxhop than for non-flagged CWs.\n\n```ini\ncacheex_maxhop_lg = 0 # Use value of cacheex_maxhop (default)\ncacheex_maxhop_lg = 1 to 10 # Set maxhop (if value is lower than cacheex_maxhop, value of cacheex_maxhop is used)\n```\n\n**Format:**\n```ini\ncacheex_maxhop_lg = 0-10\n```\n\n**Example:**\n```ini\ncacheex_maxhop_lg = 5\n```\n\n**Default:**\n```ini\ncacheex_maxhop_lg = 0\n```", .status = 0 },
{ .param = "cacheex_ecm_filter", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nCacheEx ECM filter for this reader. Defines which CAIDs/providers/services are allowed for cache exchange.\n\n**Format:**\n```ini\ncacheex_ecm_filter = [caid][&mask][@provid][$servid],n\n```\n\n**Example:**\n```ini\ncacheex_ecm_filter = 1234@000001,1234@000002\n```\n\n**Default:**\n```ini\ncacheex_ecm_filter =\n```", .status = 0 },
{ .param = "cacheex_allow_request", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nAllow ECM requests from this CacheEx reader.\n\n```ini\ncacheex_allow_request = 0 # ECM requests disabled (default)\ncacheex_allow_request = 1 # ECM requests allowed\n```\n\n**Format:**\n```ini\ncacheex_allow_request = 0|1\n```\n\n**Example:**\n```ini\ncacheex_allow_request = 1\n```\n\n**Default:**\n```ini\ncacheex_allow_request = 0\n```", .status = 0 },
{ .param = "cacheex_drop_csp", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nDrop CWs received via CSP (Cardservproxy protocol) for this reader.\n\n```ini\ncacheex_drop_csp = 0 # accept CSP CWs (default)\ncacheex_drop_csp = 1 # drop CSP CWs\n```\n\n**Format:**\n```ini\ncacheex_drop_csp = 0|1\n```\n\n**Example:**\n```ini\ncacheex_drop_csp = 1\n```\n\n**Default:**\n```ini\ncacheex_drop_csp = 0\n```", .status = 0 },
{ .param = "cacheex_allow_filter", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nAllow this reader to set CacheEx ECM filters remotely.\n\n```ini\ncacheex_allow_filter = 0 # remote filter setting disabled\ncacheex_allow_filter = 1 # remote filter setting allowed (default)\n```\n\n**Format:**\n```ini\ncacheex_allow_filter = 0|1\n```\n\n**Example:**\n```ini\ncacheex_allow_filter = 0\n```\n\n**Default:**\n```ini\ncacheex_allow_filter = 1\n```", .status = 0 },
{ .param = "cacheex_allow_maxhop", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nSet maxhop settings remotely, if remote reader/user has `cacheex_allow_maxhop = 1`.\n\n```ini\ncacheex_allow_maxhop = 0 # Opt-in (default)\ncacheex_allow_maxhop = 1 # Allow\n```\n\n**Format:**\n```ini\ncacheex_allow_maxhop = 0|1\n```\n\n**Example:**\n```ini\ncacheex_allow_maxhop = 1\n```\n\n**Default:**\n```ini\ncacheex_allow_maxhop = 0\n```", .status = 0 },
{ .param = "cacheex_block_fakecws", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nBlock fake CWs for this reader.\n\n```ini\ncacheex_block_fakecws = 0 # allow all CWs (default)\ncacheex_block_fakecws = 1 # block fake CWs\n```\n\n**Format:**\n```ini\ncacheex_block_fakecws = 0|1\n```\n\n**Example:**\n```ini\ncacheex_block_fakecws = 1\n```\n\n**Default:**\n```ini\ncacheex_block_fakecws = 0\n```", .status = 0 },
{ .param = "cacheex_cw_check_for_push", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nPush only when `cacheex_cw_check` counter reached. Localgenerated-flagged CWs are always pushed out.\n\n```ini\ncacheex_cw_check_for_push = 0 # Opt-in (default)\ncacheex_cw_check_for_push = 1 # Enable\n```\n\n**Format:**\n```ini\ncacheex_cw_check_for_push = 0|1\n```\n\n**Example:**\n```ini\ncacheex_cw_check_for_push = 1\n```\n\n**Default:**\n```ini\ncacheex_cw_check_for_push = 0\n```", .status = 0 },
{ .param = "cacheex_lg_only_remote_settings", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nPossibility to deny cacheex-receiver/client (cx2: user / cx3: reader) to overwrite the following settings at cacheex-sending-instance:\n- `cacheex_localgenerated_only`\n- `cacheex_lg_only_tab`\n\nIt makes sense if you want to force your local settings. If the user/reader isn't allowed to overwrite your values:\n- It is still possible for the cacheex-receiver to set `cacheex_localgenerated_only=1`, if the user/reader defines `cacheex_localgenerated_only_in=1`; but it is only at cacheex-sending-instance possible to disable it\n- It is still possible for the cacheex-receiver to add `cacheex_lg_only_tab`, if the user/reader defines `cacheex_lg_only_in_tab=1234,1337`; but it is only merged to the sender-instance `cacheex_lg_only_tab` values\n\nIf `cacheex_lg_only_remote_settings` in `oscam.conf` is enabled, the user/reader-settings are ignored.\n\n```ini\ncacheex_lg_only_remote_settings = 0 # Opt-out (default)\ncacheex_lg_only_remote_settings = 1 # Deny remote overwrite\n```\n\n**Format:**\n```ini\ncacheex_lg_only_remote_settings = 0|1\n```\n\n**Example:**\n```ini\ncacheex_lg_only_remote_settings = 1\n```\n\n**Default:**\n```ini\ncacheex_lg_only_remote_settings = 0\n```", .status = 0 },
{ .param = "cacheex_localgenerated_only", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nForward only CWs which are flagged as localgenerated.\n\n```ini\ncacheex_localgenerated_only = 0 # Opt-in (default)\ncacheex_localgenerated_only = 1 # Enable\n```\n\n**Format:**\n```ini\ncacheex_localgenerated_only = 0|1\n```\n\n**Example:**\n```ini\ncacheex_localgenerated_only = 1\n```\n\n**Default:**\n```ini\ncacheex_localgenerated_only = 0\n```", .status = 0 },
{ .param = "cacheex_localgenerated_only_caid", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nCAID table for localgenerated-only filter. Deprecated: use cacheex_lg_only_tab instead.\n\n**Format:**\n```ini\ncacheex_localgenerated_only_caid = CAID1[,CAID2]...\n```\n\n**Example:**\n```ini\ncacheex_localgenerated_only_caid = 0100,0500,1702\n```\n\n**Default:**\n```ini\ncacheex_localgenerated_only_caid =\n```", .status = 0 },
{ .param = "cacheex_lg_only_tab", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nForward only CWs which are lg-flagged for this list of caid/provid(s).\n\nIf provid FFFFFE is set, all provids for this caid are valid!\n\n**Syntax:**\n```ini\ncacheex_lg_only_tab = caid1:provid1[,provid2];caid2:provid1;\n```", .status = 0 },
{ .param = "cacheex_lg_only_in_aio_only", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nUse drop lg-only settings (`cacheex_localgenerated_only_in` & `cacheex_lg_only_in_tab`) only if peer is detected as cx-aio-patched or svn >= 11588.\n\n```ini\ncacheex_lg_only_in_aio_only = 0 # Opt-in (default)\ncacheex_lg_only_in_aio_only = 1 # Enable\n```\n\n**Format:**\n```ini\ncacheex_lg_only_in_aio_only = 0|1\n```\n\n**Example:**\n```ini\ncacheex_lg_only_in_aio_only = 1\n```\n\n**Default:**\n```ini\ncacheex_lg_only_in_aio_only = 0\n```", .status = 0 },
{ .param = "cacheex_localgenerated_only_in", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nDrop incoming CWs which are NOT flagged as localgenerated.\n\n```ini\ncacheex_localgenerated_only_in = 0 # Opt-in (default)\ncacheex_localgenerated_only_in = 1 # Enable\n```\n\n**Format:**\n```ini\ncacheex_localgenerated_only_in = 0|1\n```\n\n**Example:**\n```ini\ncacheex_localgenerated_only_in = 1\n```\n\n**Default:**\n```ini\ncacheex_localgenerated_only_in = 0\n```", .status = 0 },
{ .param = "cacheex_localgenerated_only_in_caid", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nCAID table for incoming localgenerated-only filter. Deprecated: use cacheex_lg_only_in_tab instead.\n\n**Format:**\n```ini\ncacheex_localgenerated_only_in_caid = CAID1[,CAID2]...\n```\n\n**Example:**\n```ini\ncacheex_localgenerated_only_in_caid = 0100,0500,1702\n```\n\n**Default:**\n```ini\ncacheex_localgenerated_only_in_caid =\n```", .status = 0 },
{ .param = "cacheex_lg_only_in_tab", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nAllow incoming CWs only if they are lg-flagged for this list of caid/provid(s).\n\nIf provid FFFFFE is set, all provids for this caid are valid!\n\n**Syntax:**\n```ini\ncacheex_lg_only_in_tab = caid1:provid1[,provid2];caid2:provid1;\n```", .status = 0 },
{ .param = "cacheex_nopushafter", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nDon't forward CWs from local/proxy-reader via CacheEx, if the defined time_in_ms for the CAID is reached.\n\n**Syntax:**\n```ini\ncacheex_nopushafter = CAID:time_in_ms[,n]\n```", .status = 0 },
{ .param = "caid", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nDefine and mapping of CAIDs for reader.\n\n**Syntax:**\n```ini\ncaid = <CAID>[&<mask>][:<target CAID>][,<CAID>[&<mask>][:<target CAID>]]...\n```\n\n**Examples:**\n```ini\ncaid = 0100\ncaid = 0200&ffee:0300\ncaid = 0400&ff00:0500,0600\ncaid = 0702,0722\ncaid = 0702&ffdf # Shortcut for the example above\n```\n\n**Default:** All CAIDs with mask FFFF", .status = 0 },
{ .param = "atr", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nSet a custom ATR (Answer To Reset) for the reader. Override the automatic ATR detection.\n\n**Format:**\n```ini\natr = hex_bytes\n```\n\n**Example:**\n```ini\natr = 3B9F21E49067534C000000280F28000069FF6500\n```\n\n**Default:**\n```ini\natr =\n```", .status = 0 },
{ .param = "boxid", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nNDS receiver box ID.\n\n**Example:**\n```ini\nboxid = 12345678\n```\n\n**Default:**\n```ini\nboxid =\n```", .status = 0 },
{ .param = "boxkey", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nBox key for Nagravision SCs / CAM key for Irdeto SCs / sessionkey for Seca SCs / CamID for Viaccess.\n\n**Default:**\n```ini\nboxkey =\n```", .status = 0 },
{ .param = "rsakey", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nRSA key for Nagravision/Tiger SCs / CAM key data for Irdeto SCs, Conax SCs.\n\n**Default:**\n```ini\nrsakey =\n```", .status = 0 },
{ .param = "cwpkkey", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nCWPK (Control Word Protection Key) for Nagra readers.\n\n**Format:**\n```ini\ncwpkkey = index:hex_bytes\n```\n\n**Example:**\n```ini\ncwpkkey = 0:0102030405060708090A0B0C0D0E0F10\n```\n\n**Default:**\n```ini\ncwpkkey =\n```", .status = 0 },
{ .param = "deskey", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nDES key for the reader in hexadecimal format.\n\n**Format:**\n```ini\ndeskey = hex_bytes\n```\n\n**Example:**\n```ini\ndeskey = 0102030405060708090A0B0C0D0E\n```\n\n**Default:**\n```ini\ndeskey =\n```", .status = 0 },
{ .param = "cak7_mode", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nInitialize card in CAK7 (Merlin) mode for Nagravision readers.\n\n```ini\ncak7_mode = 0 # standard mode (default)\ncak7_mode = 1 # CAK7/Merlin mode\n```\n\n**Format:**\n```ini\ncak7_mode = 0|1\n```\n\n**Example:**\n```ini\ncak7_mode = 1\n```\n\n**Default:**\n```ini\ncak7_mode = 0\n```", .status = 0 },
{ .param = "card_startdate_basemonth", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nBase month for card start date calculation.\n\n**Format:**\n```ini\ncard_startdate_basemonth = month\n```\n\n**Example:**\n```ini\ncard_startdate_basemonth = 1\n```\n\n**Default:**\n```ini\ncard_startdate_basemonth = 1\n```", .status = 0 },
{ .param = "card_startdate_baseyear", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nBase year for card start date calculation.\n\n**Format:**\n```ini\ncard_startdate_baseyear = year\n```\n\n**Example:**\n```ini\ncard_startdate_baseyear = 1997\n```\n\n**Default:**\n```ini\ncard_startdate_baseyear = 1997\n```", .status = 0 },
{ .param = "card_expiredate_basemonth", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nBase month for card expiration date calculation.\n\n**Format:**\n```ini\ncard_expiredate_basemonth = month\n```\n\n**Example:**\n```ini\ncard_expiredate_basemonth = 1\n```\n\n**Default:**\n```ini\ncard_expiredate_basemonth = 1\n```", .status = 0 },
{ .param = "card_expiredate_baseyear", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nBase year for card expiration date calculation.\n\n**Format:**\n```ini\ncard_expiredate_baseyear = year\n```\n\n**Example:**\n```ini\ncard_expiredate_baseyear = 1997\n```\n\n**Default:**\n```ini\ncard_expiredate_baseyear = 1997\n```", .status = 0 },
{ .param = "ins7e", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nAdd 26 hex-bytes payload for **NDS Videoguard 2 SCs**.\n\n```ini\nins7e = payload # 26 hex bytes\n = # None (default)\n```\n\n⚠️ **Attention:** Valid for physical readers only", .status = 0 },
{ .param = "ins42", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nINS42 command data for Irdeto readers.\n\n**Format:**\n```ini\nins42 = hex_bytes\n```\n\n**Example:**\n```ini\nins42 = 0102030405\n```\n\n**Default:**\n```ini\nins42 =\n```", .status = 0 },
{ .param = "ins7e11", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nAdd TA1 Byte for **NDS Videoguard 2 SCs**.\n\n```ini\nins7e11 = # None (default)\n = 11 # 0001 FI + 0001 DI (1 x)\n = 13 # 0001 FI + 0011 DI (4 x)\n = 14 # 0001 FI + 0100 DI (8 x)\n = 15 # 0001 FI + 0101 DI (16 x)\n```\n\n⚠️ **Attention:** Valid for physical readers only", .status = 0 },
{ .param = "ins2e06", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nAdd check control for pin payload (4 hex bytes) for **NDS Videoguard 2 SCs**.\n\n```ini\nins2e06 = Payload # 4 hex bytes\n = # None (blank, default)\n```\n\n⚠️ **Attention:** Valid for physical readers only", .status = 0 },
{ .param = "k1_generic", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nGeneric K1 key for DRE/Bulcrypt readers. DES or 3DES key in hexadecimal.\n\n**Format:**\n```ini\nk1_generic = hex_bytes\n```\n\n**Example:**\n```ini\nk1_generic = 0102030405060708\n```\n\n**Default:**\n```ini\nk1_generic =\n```", .status = 0 },
{ .param = "k1_unique", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nUnique K1 key for DRE/Bulcrypt readers. DES or 3DES key in hexadecimal.\n\n**Format:**\n```ini\nk1_unique = hex_bytes\n```\n\n**Example:**\n```ini\nk1_unique = 0102030405060708\n```\n\n**Default:**\n```ini\nk1_unique =\n```", .status = 0 },
{ .param = "fix07", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nEnable 0x07 fix for **NDS Videoguard 2 SCs**.\n\n```ini\nfix07 = 0 # Disabled\nfix07 = 1 # Enabled (default)\n```\n\n⚠️ **Attention:** Valid for physical readers only\n\n**Format:**\n```ini\nfix07 = 0|1\n```\n\n**Example:**\n```ini\nfix07 = 0\n```\n\n**Default:**\n```ini\nfix07 = 1\n```", .status = 0 },
{ .param = "fix9993", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nEnable fix for 9993 error with CAID 0919 SCs.\n\n```ini\nfix9993 = 0 # Disabled (default)\nfix9993 = 1 # Enabled\n```\n\n**Format:**\n```ini\nfix9993 = 0|1\n```\n\n**Example:**\n```ini\nfix9993 = 1\n```\n\n**Default:**\n```ini\nfix9993 = 0\n```", .status = 0 },
{ .param = "readtiers", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nMethod to get tiers of **NDS Videoguard SCs**.\n\n```ini\nreadtiers = 0 # Disabled (default)\nreadtiers = 1 # ins70 (new) method\nreadtiers = 2 # ins76 (old) method\n```\n\n**Format:**\n```ini\nreadtiers = 0|1|2\n```\n\n**Example:**\n```ini\nreadtiers = 1\n```\n\n**Default:**\n```ini\nreadtiers = 0\n```", .status = 0 },
{ .param = "force_irdeto", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nForce Irdeto SC mode even if RSA key is set for Irdeto tunneled Nagravision SC.\n\n```ini\nforce_irdeto = 0 # No (default)\nforce_irdeto = 1 # Yes\n```\n\n**Format:**\n```ini\nforce_irdeto = 0|1\n```\n\n**Example:**\n```ini\nforce_irdeto = 1\n```\n\n**Default:**\n```ini\nforce_irdeto = 0\n```", .status = 0 },
{ .param = "ecmnotfoundlimit", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nNumber of ECMs with \"not found\" answer until the reader will be restarted.\n\n```ini\necmnotfoundlimit = count\n = 0 # No limit (default)\n```\n\n**Default:**\n```ini\necmnotfoundlimit = 0\n```", .status = 0 },
{ .param = "ecmwhitelist", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nDefine valid ECM length **in hex** and provid for physical reader.\n\n**Syntax:**\n```ini\necmwhitelist = [CAID[@provid]:]length[,length]...[;[CAID[@provid]:]length[,length]...]...\n```\n\n**Examples:**\n```ini\necmwhitelist = 10,20,30,0a,0b,0c\necmwhitelist = 0100:10,20;0200@12345:0a,4b\n = # None (default) and provid 000000\n```\n\n⚠️ **In normal operation mode this parameter is not required!**\n\n📋 **[List of ECM lengths](http://www.streamboard.tv/oscam/wiki/ECMLengthList)**", .status = 0 },
{ .param = "ecmheaderwhitelist", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nSet valid ECM header per CAID and provid **in hex**.\n\n**Syntax:**\n```ini\necmheaderwhitelist = [CAID[@provid]:]header[,header]...[;[@provid]:]header[,header]...]...\n```\n\n**Default:** None, provid = 000000\n\n📋 **[HeaderWhitelist](http://www.streamboard.tv/oscam/wiki/HeaderWhitelist)**", .status = 0 },
{ .param = "detect", .config = "server", .section = "reader", .text = "**🔵 Parameter depends on setup/program version**\n\nCard status (inserted or removed) is detected via a serial device (UART/SCI) handshake input line.\n\n**Values:**\n```ini\ndetect = cd (default) # Carrier Detect\n = cts # Clear To Send\n = dsr # Data Set Ready\n = ring # Ring Indicator\n = none # No detection line connected, card always detected as inside\n```\n\n- `none` means: no detection line connected to the card reader. The card is always detected as being inside cardreader.\n- Inverse detect signal: prefix \"!\" (e.g., `detect = !cts`)\n\n**If `use_gpio = 1` is set:**\n```ini\ndetect = gpio1...gpio7 # Card status detected via a GPIO\n```\n\nGPIO means \"general purpose input output\".\n\n**Example:**\n```ini\n[reader]\nlabel = mymouse\ndescription = mymouse xxx\nprotocol = mouse\ndevice = /dev/ttyUSB0\nservices = xxx\nboxkey = 1122334455667788\nforce_irdeto = 1\ndetect = cd\nmhz = 1000\ncardmhz = 600\ngroup = 1,2,3\nemmcache = 1,3,2\n```", .status = 0 },
{ .param = "nagra_read", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nRead **Nagravision** records (on NCMED cards only).\n\n```ini\nnagra_read = 0 # Disabled (default)\nnagra_read = 1 # Read all records with expired rights\nnagra_read = 2 # Read records with valid rights only\n```\n\n**Format:**\n```ini\nnagra_read = 0|1|2\n```\n\n**Example:**\n```ini\nnagra_read = 2\n```\n\n**Default:**\n```ini\nnagra_read = 0\n```", .status = 0 },
{ .param = "detect_seca_nagra_tunneled_card", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nDetect Seca cards tunneled through Nagra for hybrid cards.\n\n```ini\ndetect_seca_nagra_tunneled_card = 0 # detection disabled\ndetect_seca_nagra_tunneled_card = 1 # detection enabled (default)\n```\n\n**Format:**\n```ini\ndetect_seca_nagra_tunneled_card = 0|1\n```\n\n**Example:**\n```ini\ndetect_seca_nagra_tunneled_card = 0\n```\n\n**Default:**\n```ini\ndetect_seca_nagra_tunneled_card = 1\n```", .status = 0 },
{ .param = "mhz", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nSet reader frequency in units of 10 kHz. If mhz > cardmhz you are in overclocking mode.\n\n**Example:**\n```ini\ncardmhz = 600 # (6000 KHz = 6 MHz)\nmhz = 1000 # (10000 KHz = 10 MHz)\n```\n\n**Default:** 357\n\nAuto clock speed in **Dreambox mode**: set to -1.\n\n📋 **[List of default and overclocking card frequencies](http://www.streamboard.tv/oscam/wiki/CardsList)**", .status = 0 },
{ .param = "cardmhz", .config = "server", .section = "reader", .text = "**🔵 Parameter depends on setup/program version**\n\nSet standard SC frequency in units of 10 kHz. For Irdeto SC set to 600.\n\n**Examples:**\n```ini\ncardmhz = 600 # Irdeto card\n = 357 # Default (blank)\n```\n\n**INTERNAL READERS**\n\nIf you use `cardmhz > 2000` OSCam will switch to PLL clocking. Internal readers of boxes from Dream Multimedia GmbH can be clocked more precise with it.\n\nThe used cardmhz should reflect the highest frequency of the PLL crystal in the internal cardreader. OSCam will calculate the best PLL divider that comes nearest to the wanted user card speed specified in cardmhz.\n\n**Recommended settings:**\n- Models with PPC-CPU (DM500/DM600/DM7000/DM7020): `cardmhz = 3150`\n- Models with MIPS-CPU (DM500HD/DM800/DM800SE/DM8k/DM7020HD etc.): `cardmhz = 2700`\n- DM7025 (special): `cardmhz = 8300`\n\n⚠️ **If only the parameter cardmhz is set (without mhz = xxx) then OSCam clocks the card automatically with the ATR!**\n\n**Example:**\nYou have a DM800 HD PVR (MIPS), so you should set cardmhz to 2700. If you have a Nagra card that should run on 5 MHz:\n- Normal clocking: `cardmhz = 2700` and `mhz = 500`\n- Overclocking: `cardmhz = 2700` and `mhz = 900` (card will run at 9 MHz)\n\n⚠️ Keep in mind that most internal readers of non-dreamboxes clock the cards automatically and completely ignore any user clockspeed setting. But you should set cardmhz and mhz anyway, as it's still used to calculate the correct timings in OSCam.\n\n📋 **[List of default and overclocking card frequencies](http://www.streamboard.tv/oscam/wiki/CardsList)**", .status = 0 },
{ .param = "mode", .config = "server", .section = "reader", .text = "**🔵 Parameter depends on setup/program version**\n\nSet card init mode for **AzBox** reader.\n\n```ini\nmode = 1 # AzBox-Reader\n = 0 # None (default)\n```\n\n**Default:**\n```ini\nmode = 0\n```", .status = 0 },
{ .param = "ident", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n⚠️ **Attention:** If in `oscam.conf [global]` loadbalancing is enabled among `lb_mode`, then there may be **no entries**!\n\n⚠️ **Note:** This parameter is only used for EMM and not for ECM. You cannot force ECM to be sent to the card using this parameter.\n\nDefine CAID and ident **SC specific** for reader.\n\n**Syntax:**\n```ini\nident = <CAID>:<ident>[,ident]...[;<CAID>:<ident>[,ident]...]...\n```\n\n**Example:**\n```ini\nident = 0100:123456,234567;0200:345678,456789\n = # Blank, no definition (default)\n```", .status = 0 },
{ .param = "chid", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nDefine **Irdeto ChID** for reader.\n\n**Examples:**\n```ini\nchid = 0100:12\nchid = 0100:12;0604:0000BA,000101,00010E,000141\n = # Blank (default)\n```", .status = 0 },
{ .param = "class", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nDefine class **in hex** SC specific for reader.\n\n**Example:**\n```ini\nclass = 01,02,!1b,!2b # 01 and 02 yes, 1b and 2b no\n = # Blank, no definition (default)\n```", .status = 0 },
{ .param = "aeskeys", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nMultiple 16 bytes AES keys for Viaccess SCs (the used postprocessing AES key is specified through the D2 nano of the ECM).\n\n**Syntax:**\n```\nCAID@ident:AES key #0 CAID #0[,AES key #1 CAID #0],...[;CAID #1@ident:AES key #0 CAID #1[,AES key #1 CAID #1],...]...\n```\n\n**Special AES keys:**\n- `00` = do not return any CW, no AES key specified\n- `FF` = return CW received from the SC, no AES key specified\n\n**Examples:**\n```ini\naeskeys = 0500@012345:000102030405060708090a0b0c0d0e0f;0500@543210:0,0,0f0e0d0c0b0a090807060504030201\naeskeys = 0500@012345:key0,key1,key2,key3,key4,key5,...;0500@543210:key0,key1,key2,key3,key4,key5,...\n```\n\nIf keys are unknown, replace them with 0:\n```ini\naeskeys = 0500@012345:key0,key1,0,0,key4,key5,...\n```", .status = 0 },
{ .param = "group", .config = "server", .section = "reader", .text = "**🔴 Required parameter**\n\nReader assignment to group. Each reader must be listed in one or more groups. This will determine which client has access to what reader.\n\nValid values: 1-64\n\n**Syntax:**\n```ini\ngroup = 1...64[,1...64]...\n```\n\n**Examples:**\n```ini\ngroup = 1 # One group\ngroup = 1,4,5 # Multiple groups\n```\n\n⚠️ **Setting required parameter blank is not allowed!**", .status = 0 },
{ .param = "emmcache", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nSet EMM cache of local reader.\n\n⚠️ **Attention:** Without this parameter, no EMMs are shown in the log!\n\n**Format:**\n```ini\nemmcache = <usecache>,<rewrite>,<logging>,<stb-emm>\n```\n\n**Parameters:**\n\n**`<usecache>`:**\n- `0` = Disable usage of emmcache and emmstats (default)\n- `1` = Enable emmcache, emmstats and save to file if OSCam is stopped\n- `2` = Enable emmcache, emmstats but don't save to file if OSCam is stopped\n\n**`<rewrite>`:**\n- `n` = Determines how often one and the same EMM is written (only if `<usecache>` = 1 or 2)\n\n**`<logging>`:**\n- `0` = EMM logging disabled\n- `1` = Logging EMM errors\n- `2` = Logging written EMMs\n- `4` = Logging skipped EMMs\n- `8` = Logging blocked EMMs\n- `16` = Logging audisabled EMMs\n\nSummarizing these values is possible. 31 shows all kinds of messages.\n\n**`<stb-emm>`:**\n- `0` = EMM for STB are ignored (default)\n- `1` = EMM for STB are sent to the reader (very specific usage)\n\n**Examples:**\n```ini\nemmcache = 1,3,10,0 # Cache on, write 3x, log written (2) and blocked (8) = 10, don't send stb-emm\nemmcache = 1,2,6,1 # Cache on, write 2x, log written (2) and skipped (4) = 6, send stb-emm\n```\n\n**Note:** **stb-emm** is only handy for specific usage (Viaccess: see commit [#10584](http://www.streamboard.tv/oscam/changeset/10584)). In Viaccess we saw some EMM-G that are for the STB and not for the card. Those EMMs are used, for example, to define overencryption key (AES) into the STB to encrypt STB-Card dialog.", .status = 0 },
{ .param = "blockemm-unknown", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nBlock unknown types of EMMs.\n\n```ini\nblockemm-unknown = 0 # No block (default)\nblockemm-unknown = 1 # Block all unknown kinds of EMMs\n```\n\n**Format:**\n```ini\nblockemm-unknown = 0|1\n```\n\n**Example:**\n```ini\nblockemm-unknown = 1\n```\n\n**Default:**\n```ini\nblockemm-unknown = 0\n```", .status = 0 },
{ .param = "blockemm-u", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nBlock unique EMMs.\n\n```ini\nblockemm-u = 0 # No block (default)\nblockemm-u = 1 # Block EMMs, which are addressed to card immediately\n```\n\n**Format:**\n```ini\nblockemm-u = 0|1\n```\n\n**Example:**\n```ini\nblockemm-u = 1\n```\n\n**Default:**\n```ini\nblockemm-u = 0\n```", .status = 0 },
{ .param = "blockemm-s", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nBlock shared EMMs.\n\n```ini\nblockemm-s = 0 # No block (default)\nblockemm-s = 1 # Block EMMs, which are addressed to certain groups of cards\n```\n\n**Format:**\n```ini\nblockemm-s = 0|1\n```\n\n**Example:**\n```ini\nblockemm-s = 1\n```\n\n**Default:**\n```ini\nblockemm-s = 0\n```", .status = 0 },
{ .param = "blockemm-g", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nBlock global EMMs.\n\n```ini\nblockemm-g = 0 # No block (default)\nblockemm-g = 1 # Block EMMs, which are addressed to all cards\n```\n\n**Format:**\n```ini\nblockemm-g = 0|1\n```\n\n**Example:**\n```ini\nblockemm-g = 1\n```\n\n**Default:**\n```ini\nblockemm-g = 0\n```", .status = 0 },
{ .param = "saveemm-unknown", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nSave unknown EMMs to file. The path can be defined with `emmlogdir=` in `oscam.conf` (default=config-dir).\n\n```ini\nsaveemm-unknown = 0 # Disabled (default)\nsaveemm-unknown = 1 # Enabled\n```\n\n**Format:**\n```ini\nsaveemm-unknown = 0|1\n```\n\n**Example:**\n```ini\nsaveemm-unknown = 1\n```\n\n**Default:**\n```ini\nsaveemm-unknown = 0\n```", .status = 0 },
{ .param = "saveemm-u", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nSave unique EMMs to file. The path can be defined with `emmlogdir=` in `oscam.conf` (default=config-dir).\n\n```ini\nsaveemm-u = 0 # Disabled (default)\nsaveemm-u = 1 # Enabled\n```\n\n**Format:**\n```ini\nsaveemm-u = 0|1\n```\n\n**Example:**\n```ini\nsaveemm-u = 1\n```\n\n**Default:**\n```ini\nsaveemm-u = 0\n```", .status = 0 },
{ .param = "saveemm-s", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nSave shared EMMs to file. The path can be defined with `emmlogdir=` in `oscam.conf` (default=config-dir).\n\n```ini\nsaveemm-s = 0 # Disabled (default)\nsaveemm-s = 1 # Enabled\n```\n\n**Format:**\n```ini\nsaveemm-s = 0|1\n```\n\n**Example:**\n```ini\nsaveemm-s = 1\n```\n\n**Default:**\n```ini\nsaveemm-s = 0\n```", .status = 0 },
{ .param = "saveemm-g", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nSave global EMMs to file. The path can be defined with `emmlogdir=` in `oscam.conf` (default=config-dir).\n\n```ini\nsaveemm-g = 0 # Disabled (default)\nsaveemm-g = 1 # Enabled\n```\n\n**Format:**\n```ini\nsaveemm-g = 0|1\n```\n\n**Example:**\n```ini\nsaveemm-g = 1\n```\n\n**Default:**\n```ini\nsaveemm-g = 0\n```", .status = 0 },
{ .param = "blockemm-bylen", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nBlock all types of EMMs by length. Maximum 10 values.\n\n**Syntax:**\n```ini\nblockemm-bylen = [length range,length range]... (decimal)\n```\n\n**Example:**\n```ini\nblockemm-bylen = 1-10,11-\n```\n\n**Default:**\n```ini\nblockemm-bylen =\n```", .status = 0 },
{ .param = "lb_weight", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nThe higher the value, the higher the probability for reader selection. It's a divider for the average response time.\n\n**Format:**\n```ini\nlb_weight = weight\n```\n\n**Example:**\n```ini\nlb_weight = 200\n```\n\n**Default:**\n```ini\nlb_weight = 100\n```", .status = 0 },
{ .param = "lb_force_fallback", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nSet the reader always as fallback for load balancing without considering the reader's statistics.\n\n```ini\nlb_force_fallback = 0 # Default\nlb_force_fallback = 1 # Set reader always as fallback\n```\n\n**Format:**\n```ini\nlb_force_fallback = 0|1\n```\n\n**Example:**\n```ini\nlb_force_fallback = 1\n```\n\n**Default:**\n```ini\nlb_force_fallback = 0\n```", .status = 0 },
{ .param = "savenano", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nList of EMM-nanos (in hex w/o 0x) to save or all EMM-nanos. Only valid for physical readers. The path can be defined with `emmlogdir=` in `oscam.conf` (default=config-dir).\n\n**Syntax:**\n```ini\nsavenano = nano[,nano]...|all\n```\n\n**Examples:**\n```ini\nsavenano = 45,93,7a,ff\n = all\n = # Blank (default)\n```", .status = 0 },
{ .param = "blocknano", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nList of EMM-nanos to block (in hex w/o 0x) or all EMM-nanos. Only valid for physical readers!\n\n**Examples:**\n```ini\nblocknano = 45,93,7a,ff\n = all\n = # Blank (default)\n```", .status = 0 },
{ .param = "dropbadcws", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nReject bad CWs, send \"not found\" instead of bad CWs.\n\n```ini\ndropbadcws = 0 # Default\ndropbadcws = 1 # Reject bad CWs\n```\n\n**Format:**\n```ini\ndropbadcws = 0|1\n```\n\n**Example:**\n```ini\ndropbadcws = 1\n```\n\n**Default:**\n```ini\ndropbadcws = 0\n```", .status = 0 },
{ .param = "disablecrccws", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nDisable CW checksum test.\n\n```ini\ndisablecrccws = 0 # Enable (default)\ndisablecrccws = 1 # Disable CW checksum test\n```\n\n**Format:**\n```ini\ndisablecrccws = 0|1\n```\n\n**Example:**\n```ini\ndisablecrccws = 1\n```\n\n**Default:**\n```ini\ndisablecrccws = 0\n```", .status = 0 },
{ .param = "use_gpio", .config = "server", .section = "reader", .text = "**🔵 Parameter depends on setup/program version**\n\nUse GPIO as card detect/reset.\n\n```ini\nuse_gpio = 0 # Off (default)\nuse_gpio = 1 # On\n```\n\n**Format:**\n```ini\nuse_gpio = 0|1\n```\n\n**Example:**\n```ini\nuse_gpio = 1\n```\n\n**Default:**\n```ini\nuse_gpio = 0\n```", .status = 0 },
{ .param = "cccversion", .config = "server", .section = "reader", .text = "**🔵 Parameter depends on setup/program version**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\n**Only for CCcam**\n\nDefine CCcam version.\n\n**Syntax:**\n```ini\ncccversion = <mainversion>,<version>,<sub version>\n```\n\n**Example:**\n```ini\ncccversion = 1.2.34\n```", .status = 0 },
{ .param = "cccmaxhops", .config = "server", .section = "reader", .text = "**🔵 Parameter depends on setup/program version**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nDefine CCcam maximum SC distance hops.\n\n```ini\ncccmaxhops = 0 # Local SCs only\n = 1 # Local SCs + 1 hop\n = 2 # Local SCs + 2 hops\n = ... # And so on\n = 10 # Default\n```\n\n**Default:**\n```ini\ncccmaxhops = 10\n```", .status = 0 },
{ .param = "cccmindown", .config = "server", .section = "reader", .text = "**🔵 Parameter depends on setup/program version**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nFilters all readers with hops smaller than number.\n\n```ini\ncccmindown = number\n = 0 # Default\n```\n\n**Default:**\n```ini\ncccmindown = 0\n```", .status = 0 },
{ .param = "ccckeepalive", .config = "server", .section = "reader", .text = "**🔵 Parameter depends on setup/program version**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nSend keepalive messages to keep connection to remote CCCam server up.\n\n```ini\nccckeepalive = 0 # No (default)\nccckeepalive = 1 # Yes\n```\n\n**Format:**\n```ini\nccckeepalive = 0|1\n```\n\n**Example:**\n```ini\nccckeepalive = 1\n```\n\n**Default:**\n```ini\nccckeepalive = 0\n```", .status = 0 },
{ .param = "cccam_reshare", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nReshare level of CCC proxy cards to be sent into gbox network.\n\n```ini\ncccam_reshare = -1 # No resharing (default)\n = 0 # Reshare for direct peer only\n = 1 # Reshare for direct peer plus next level\n = x # Resharing for direct peer plus x share level\n```\n\n**Default:**\n```ini\ncccam_reshare = -1\n```", .status = 0 },
{ .param = "cccreconnect", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nReconnect again after ECM request timeout in milliseconds.\n\n```ini\ncccreconnect = timeout # Timeout in milliseconds\n = 12000 # Default\n```\n\n**Default:**\n```ini\ncccreconnect = 12000\n```", .status = 0 },
{ .param = "ccchop", .config = "server", .section = "reader", .text = "**🔵 Parameter depends on setup/program version**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nSet hop for **non** CCCam readers.\n\n```ini\nccchop = hop\n = 0 # Default\n```\n\n**Default:**\n```ini\nccchop = 0\n```", .status = 0 },
{ .param = "resetalways", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nAlways reset the card before each ECM request.\n\n```ini\nresetalways = 0 # normal operation (default)\nresetalways = 1 # always reset card\n```\n\n**Format:**\n```ini\nresetalways = 0|1\n```\n\n**Example:**\n```ini\nresetalways = 1\n```\n\n**Default:**\n```ini\nresetalways = 0\n```", .status = 0 },
{ .param = "deprecated", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nFirst the SC will be initialized in normal mode. If it fails, the SC will be automatically reverted to deprecated mode, so that the SC speed will not be changed and the communication will remain on normal ATR speed of 9600 baud.\n\n```ini\ndeprecated = 0 # Normal mode (default)\ndeprecated = 1 # Use deprecated SC mode only\n```\n\n**Format:**\n```ini\ndeprecated = 0|1\n```\n\n**Example:**\n```ini\ndeprecated = 1\n```\n\n**Default:**\n```ini\ndeprecated = 0\n```", .status = 0 },
{ .param = "audisabled", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nExclude reader from auto AU (auto update).\n\n```ini\naudisabled = 0 # Not excluded (default)\naudisabled = 1 # Excluded\n```\n\n**Format:**\n```ini\naudisabled = 0|1\n```\n\n**Example:**\n```ini\naudisabled = 1\n```\n\n**Default:**\n```ini\naudisabled = 0\n```", .status = 0 },
{ .param = "auprovid", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nSet provider ID to use the right reader for auto AU.\n\n**Example:**\n```ini\nauprovid = 123456\n```\n\n**Default:**\n```ini\nauprovid =\n```", .status = 0 },
{ .param = "ndsversion", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nSet NDS **Videoguard** version.\n\n```ini\nndsversion = 0 # Autodetection (default)\n = 1 # NDS Videoguard 1\n = 12 # NDS Videoguard 1+\n = 2 # NDS Videoguard 2\n```\n\n**Default:**\n```ini\nndsversion = 0\n```", .status = 0 },
{ .param = "ratelimitecm", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nNumber of different SIDs in ECMs allowed for an interval.\n\n```ini\nratelimitecm = number\n = 0 # Default\n```\n\n**Default:**\n```ini\nratelimitecm = 0\n```", .status = 0 },
{ .param = "ecmunique", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nEnable check for matching ECM hash in ratelimit slot.\n\n```ini\necmunique = 0 # Default\necmunique = 1 # Enable check for matching ECM hash in ratelimit slot\n```\n\n⚠️ **Remark:** Parameter `ratelimitecm` must be set to be able to enable this option!\n\n**Format:**\n```ini\necmunique = 0|1\n```\n\n**Example:**\n```ini\necmunique = 1\n```\n\n**Default:**\n```ini\necmunique = 0\n```", .status = 0 },
{ .param = "ratelimittime", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nInterval for rate limit in milliseconds.\n\n```ini\nratelimittime = milliseconds\n = 0 # Default\n```\n\n**Default:**\n```ini\nratelimittime = 0\n```", .status = 0 },
{ .param = "srvidholdtime", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nTime to keep service ID in ratelimit slot. During this time checking for `ecmunique` is disabled.\n\n```ini\nsrvidholdtime = milliseconds\n = 0 # Default\n```\n\n**Default:**\n```ini\nsrvidholdtime = 0\n```", .status = 0 },
{ .param = "cooldown", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nDefine cooldown.\n\n**Syntax:**\n```ini\ncooldown = delay,duration\n```\n\n**Parameters:**\n- `delay` = Delay in milliseconds for which the reader is allowed to do more ECM requests than defined by parameter `ratelimitecm`\n- `duration` = Duration in milliseconds the reader needs to cooldown\n\nBoth parameters are mandatory when used.\n\n⚠️ **Parameters `ratelimitecm` and `ratelimittime` are required!**\n\n**Default:**\n```ini\ncooldown =\n```", .status = 0 },
{ .param = "cooldowndelay", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nCooldown delay in milliseconds. Time delay during which the reader is allowed to process more ECM requests than defined by ratelimitecm.\n\n**Format:**\n```ini\ncooldowndelay = milliseconds\n```\n\n**Example:**\n```ini\ncooldowndelay = 5000\n```\n\n**Default:**\n```ini\ncooldowndelay =\n```", .status = 0 },
{ .param = "cooldowntime", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nCooldown duration in milliseconds. Time the reader needs to cool down after exceeding rate limits.\n\n**Format:**\n```ini\ncooldowntime = milliseconds\n```\n\n**Example:**\n```ini\ncooldowntime = 60000\n```\n\n**Default:**\n```ini\ncooldowntime =\n```", .status = 0 },
{ .param = "maxparallel", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nMaximum number of parallel active services allowed for this reader.\n\nUseful for limiting load on readers with slot restrictions. When the limit is reached, the reader is temporarily skipped and other readers are tried. A service slot is reserved only when a reader delivers a CW (not when the request is sent). This prevents readers from blocking capacity for services they don't end up serving when multiple readers are queried simultaneously.\n\nA service slot expires when no ECM is received within the measured ECM interval plus the `paralleltimeout` buffer.\n\n```ini\nmaxparallel = 0 # unlimited (default)\nmaxparallel = 1 # only 1 active service at a time\nmaxparallel = 2 # max 2 active services\n```\n\n**Format:**\n```ini\nmaxparallel = count\n```\n\n**Example:**\n```ini\nmaxparallel = 2\n```\n\n**Default:**\n```ini\nmaxparallel = 0\n```\n\n⚠️ **After changing `maxparallel` or `parallelfactor`, OSCam must be restarted.**", .status = 0 },
{ .param = "parallelfactor", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nMultiplier for pending slots used during zapping. Pending slots allow temporary capacity overrun while switching channels, preventing black screens when zapping with a single reader.\n\nWhen zapping, new services go to pending slots if active slots are full. Pending services are promoted to active when slots free up (FIFO), or dropped when active services prove they're still active by sending ECMs (FIFO).\n\nThe number of pending slots is calculated as: `round(maxparallel × parallelfactor)`\n\n```ini\nparallelfactor = 0 # disable pending slots (strict limit, may cause black screen when zapping)\nparallelfactor = 1.5 # default - with maxparallel=2: 3 pending slots\nparallelfactor = 2.0 # with maxparallel=2: 4 pending slots\n```\n\n**Pending slots by configuration:**\n\n| maxparallel | parallelfactor | Pending Slots |\n|-------------|----------------|---------------|\n| 1 | 1.5 | 2 |\n| 2 | 1.5 | 3 |\n| 4 | 1.5 | 6 |\n| 1 | 0 | 0 (disabled) |\n\n**Format:**\n```ini\nparallelfactor = factor\n```\n\n**Example:**\n```ini\nparallelfactor = 1.5\n```\n\n**Default:**\n```ini\nparallelfactor = 1.5\n```\n\n⚠️ **After changing `maxparallel` or `parallelfactor`, OSCam must be restarted.**", .status = 0 },
{ .param = "paralleltimeout", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nTimeout buffer in milliseconds added to the measured ECM interval to determine when a service slot expires.\n\nThe ECM interval is measured automatically per service. A service slot expires when no ECM is received within (measured_interval + paralleltimeout). If no interval has been measured yet, a default timeout of 10000 ms plus paralleltimeout is used.\n\n```ini\nparalleltimeout = 1000 # default\nparalleltimeout = 1500 # 1.5 seconds buffer\n```\n\n**Format:**\n```ini\nparalleltimeout = milliseconds\n```\n\n**Example:**\n```ini\nparalleltimeout = 1500\n```\n\n**Default:**\n```ini\nparalleltimeout = 1000\n```", .status = 0 },
{ .param = "read_old_classes", .config = "server", .section = "reader", .text = "**🟢 Optional parameter**\n\nRead old classes from Viaccess cards.\n\n```ini\nread_old_classes = 0 # read only current classes\nread_old_classes = 1 # read old classes too (default)\n```\n\n**Format:**\n```ini\nread_old_classes = 0|1\n```\n\n**Example:**\n```ini\nread_old_classes = 0\n```\n\n**Default:**\n```ini\nread_old_classes = 1\n```", .status = 0 },
{ .param = "P", .config = "dvbapi", .section = "", .text = "```\nP: [CAID]:[provider ID]:[service ID]:[ECM PID]:[CHID] [continue]\n```\nSets priority for specific CAIDs or providers. The optional `continue` parameter (value: 1) forces continuous retry attempts on the specified CAID, useful for Pay-Per-View services or card activation scenarios.", .status = 0 },
{ .param = "I", .config = "dvbapi", .section = "", .text = "```\nI: [CAID]:[provider ID]:[service ID]:[ECM PID]:[CHID]\n```\nIgnores specific encryption providers or Pay TV providers to prevent unnecessary ECM requests.", .status = 0 },
{ .param = "M", .config = "dvbapi", .section = "", .text = "```\nM: [CAID]:[provider ID]:[service ID]:[ECM PID] [target CAID]:[target provider ID]\n```\nMaps one CAID/provider to another, useful for redirecting requests (e.g., mapping Sky HD channels for S02 or D02 cards).", .status = 0 },
{ .param = "D", .config = "dvbapi", .section = "", .text = "```\nD: [CAID]:[provider ID]:[service ID]:[ECM PID] delay\n```\nAdds a delay in milliseconds before writing the control word, useful when the server responds too quickly.", .status = 0 },
{ .param = "L", .config = "dvbapi", .section = "", .text = "```\nL: [CAID]:[provider ID]:[service ID]:[ECM PID] ECM length (hexa)\n```\nFilters ECM requests to only allow specific ECM lengths (in hexadecimal), useful for filtering broken mappings.", .status = 0 },
{ .param = "X", .config = "dvbapi", .section = "", .text = "```\nX: [CAID]:[provider ID]:[service ID]:[ECM PID] demux\n```\nAdds decoding on an extra demux index on the same CA device (not supported on all set-top boxes).", .status = 0 },
{ .param = "J", .config = "dvbapi", .section = "", .text = "```\nJ: [CAID]:[provider ID]:[service ID]:[ECM PID] join\n```\nJoins a CAID/provider/ECM PID to another ECM PID.", .status = 0 },
{ .param = "A", .config = "dvbapi", .section = "", .text = "```\nA: ::[service ID]:[video PID]:[provider ID]::[ECM PID]\n```\nSets a dummy ECM request with CAID FFFF for services with constant control words (for STBs without PMT PID support only).", .status = 0 },
{ .param = "S", .config = "dvbapi", .section = "", .text = "```\nS: [device] [PMT file name]\n```\nSettings for DVB API device name and PMT file name (only valid for STAPI).", .status = 0 },
{ .param = "Priority", .config = "dvbapi", .section = "", .text = "```\nP: 0100:123456 # Prioritize CAID 0100 with provider 123456\nP: 0100 1 # Prioritize CAID 0100 with continuous retry (for PPV/card activation)\nP: : 1 # Client continues requesting after 3 failed attempts (all CAIDs)\nP: :1234 # Prioritize ECM with provider ID 1234 on all services\nP: 0200 # Prioritize CAID 0200\nP: 0300::9ABC # Prioritize CAID 0300 only on service 9ABC\nP: 1702 # Prioritize Sky S02\nP: 1830 # Prioritize HD+ HD01\nP: 0D95 # Prioritize ORF-ICE\n```", .status = 0 },
{ .param = "Ignore", .config = "dvbapi", .section = "", .text = "```\nI: :654321 # Ignore provider ID 654321 for all services\nI: 0 # Ignore all CAIDs not previously specified in this file\nI: 09C4 # Ignore Sky V13\n```", .status = 0 },
{ .param = "Mapping", .config = "dvbapi", .section = "", .text = "```\nM: 0400 0500:123456 # Map CAID 0400 to CAID 0500 with provider ID 123456\nM: 1834:000000:007E 1722 # Map CAID 1834 with provider 000000 and SID 007E to CAID 1722\n```", .status = 0 },
{ .param = "Delay", .config = "dvbapi", .section = "", .text = "```\nD: 0600 200 # Wait 200 ms before writing CW for CAID 0600\n```", .status = 0 },
{ .param = "ECM", .config = "dvbapi", .section = "", .text = "```\nL: 0700 8e # Only allow ECM length 8e (hex) for this CAID to filter broken mappings\n```", .status = 0 },
{ .param = "Multicrypt", .config = "dvbapi", .section = "", .text = "For channels with multiple encryption systems (e.g., Sky Germany with both Nagravision and NDS), prioritize the CAID matching your available cards to avoid unnecessary requests and speed up channel opening.", .status = 0 },
{ .param = "Pay-Per-View", .config = "dvbapi", .section = "", .text = "Use the `continue` parameter to keep retrying on a specific CAID until the card is activated:\n```\nP: 0100 1\n```", .status = 0 },
{ .param = "Server", .config = "dvbapi", .section = "", .text = "Ignore CAIDs for which you have no cards to prevent unnecessary server requests:\n```\nI: 09C4 # Ignore if you don't have V13 cards\n```", .status = 0 },
{ .param = "Parameters", .config = "srvid2", .section = "", .text = "- **service ID**: Service ID (channel ID) in hexadecimal\n- **CAID**: One or more CAIDs in hexadecimal\n- **@PROVID**: Optional provider ID(s) in hexadecimal\n- **channel_name**: Channel name (optional)\n- **type**: Channel type like TV, Radio, etc. (optional)\n- **description**: Additional description (optional)\n- **provider**: Provider or satellite position (optional)", .status = 0 },
{ .param = "Simple", .config = "srvid2", .section = "", .text = "```\n000a:0001,0002,0003|tv name|tv|my description 1|provider 1\n000a:0004,0005,0006|radio name 2|radio|my description 2|provider 2\n000b:0006|tv name 3||my description 3|provider 3\n000b:0007|tv name 4|||provider 4\n```", .status = 0 },
{ .param = "Service", .config = "srvid2", .section = "", .text = "```\n# Service ID 1111, CAID 0100, all provider IDs\n1111:0100|x|y|z|v\n```", .status = 0 },
{ .param = "Service", .config = "srvid2", .section = "", .text = "```\n# Service ID 1111, CAID 0100, provider ID 123456\n1111:0100@123456|x|y|z|v\n```", .status = 0 },
{ .param = "Service", .config = "srvid2", .section = "", .text = "```\n# Service ID 1111, CAID 0100, all providers\n1111:0100@000000|x|y|z|v\n```", .status = 0 },
{ .param = "Multiple", .config = "srvid2", .section = "", .text = "```\n# Service ID 1111, CAID 0100 with provider 123456 AND CAID 0200 with provider 654321\n1111:0100@123456,0200@654321|x|y|z|v\n```", .status = 0 },
{ .param = "Sky", .config = "srvid2", .section = "", .text = "**Sky SAT:**\n\n```\n007F:098C,098D,09F0|13th Street|TV|Sky Starter Paket|Sky\n0085:098C,098D,09F0|Beate Uhse|TV|Sky Starter Paket|Sky\n0194:098C,098D,09F0|Cartoon Network|TV|Sky Starter Paket|Sky\n```\n\n**Sky Vodafone:**\n\n```\n0074:098E,1838,1850,1854,1868|Sky Cinema Action HD|TV|Sky Cinema Paket|Sky\n006B:098E,1838,1850,1854,1868|Sky Cinema Classics HD|TV|Sky Cinema Paket|Sky\n008B:098E,1838,1850,1854,1868|Sky Cinema Family HD|TV|Sky Cinema Paket|Sky\n```", .status = 0 },
{ .param = "HD", .config = "srvid2", .section = "", .text = "```\nEF10:1830,1843,1860,186A,186D,09C4,098C,098D|RTL HD|TV||Astra HD+\nEF11:1830,1843,1860,186A,186D,09C4,098C,098D|VOX HD|TV||Astra HD+\nEF74:1830,1843,1860,186A,186D,09C4,098C,098D|SAT.1 HD|TV||Astra HD+\n```", .status = 0 },
{ .param = "ORF", .config = "srvid2", .section = "", .text = "```\n132F:0D95,0D98,0648,0650,09C4,098C|ORF1 HD|||ORF Digital\n1330:0D95,0D98,0648,0650,09C4,098C|ORF2 HD|||ORF Digital\n33AC:0D95,0D98,0648,0650,09C4,098C|ATV HD|||ORF Digital\n```", .status = 0 },
{ .param = "Multicrypt", .config = "srvid2", .section = "", .text = "For multicrypt channels, list all CAIDs including the management CAID 0000:\n\n```\n0025:0000,1702,1837,1833,09C4,098C,0D05,0D95,0648,0D98,0650|AXN Action|TV||austriasat 19.2°E\n```\n\nThis prevents \"unknown program\" messages in the web interface and shows all CAIDs used by the channel.", .status = 0 },
{ .param = "Finding", .config = "srvid2", .section = "", .text = "Switch to the channel and check the OSCam logs:\n\n```\n2013/10/12 17:45:22 4DB510 c [DVBAPI] Receiver sends PMT command 3 for channel 0025\n2013/10/12 17:45:22 4DB510 c [ADD PID 0] CAID: 1702 ECM_PID: 1725 PROVID: 000000\n2013/10/12 17:45:22 4DB510 c [ADD PID 1] CAID: 1837 ECM_PID: 1FD1 PROVID: 000000\n2013/10/12 17:45:22 4DB510 c [ADD PID 2] CAID: 1833 ECM_PID: 1825 PROVID: 000000\n```\n\nCreate the entry:\n```\n0025:0000,1702,1837,1833,09C4,098C,0D05,0D95,0648,0D98,0650|AXN Action|TV||austriasat 19.2°E\n```", .status = 0 },
{ .param = "Free-to-Air", .config = "srvid2", .section = "", .text = "For FTA channels, use CAID FFFE and provider ID FFFFFE:\n\n```\n2404:FFFE@FFFFFE|Film4|TV||Freesat 28.2°E\n```\n\nNote: FTA CAID changed from 0000 to FFFE, and provider ID changed from 000000 to FFFFFE. Management CAID 0000 is reserved for multicrypt channels.", .status = 0 },
{ .param = "oscam", .config = "srvid2", .section = "", .text = "```\n098C,098D,09F0:007F|Sky|13th Street|TV|Sky Starter Paket\n```", .status = 0 },
{ .param = "oscam", .config = "srvid2", .section = "", .text = "```\n007F:098C,098D,09F0|13th Street|TV|Sky Starter Paket|Sky\n```\n\nThe srvid2 format:\n- Places service ID first (easier to sort by channel)\n- Swaps the position of provider and name fields\n- Otherwise functions identically to oscam.srvid", .status = 0 },
{ .param = "Finding", .config = "srvid2", .section = "", .text = "1. Check OSCam logs for service ID information\n2. Use DVB analysis tools to scan channels\n3. Monitor ECM requests in OSCam logs\n4. Check the web interface status page\n5. Consult online channel databases", .status = 0 },
{ .param = "Extracting", .config = "srvid2", .section = "", .text = "Look for lines like:\n```\n[DVBAPI] Receiver wants to demux srvid 0025 on adapter 0000\n```\n\nThe service ID is 0025 in this example.", .status = 0 },
{ .param = "Organization", .config = "srvid2", .section = "", .text = "- Sort entries by service ID for easy lookup\n- Group related channels together\n- Use comments to separate sections\n- Document special entries", .status = 0 },
{ .param = "Naming", .config = "srvid2", .section = "", .text = "- Use clear, descriptive channel names\n- Include satellite position in provider field\n- Specify channel type (TV, Radio, etc.)\n- Add useful descriptions", .status = 0 },
{ .param = "Maintenance", .config = "srvid2", .section = "", .text = "- Update when channel lineups change\n- Remove obsolete channels\n- Add new channels as they appear\n- Keep synchronized with actual channel availability", .status = 0 },
{ .param = "Example", .config = "srvid2", .section = "", .text = "```\n# Sky Germany SAT - 19.2E (Service IDs 007F-0194)\n007F:098C,098D,09F0|13th Street|TV|Sky Starter Paket|Sky\n0085:098C,098D,09F0|Beate Uhse|TV|Sky Starter Paket|Sky\n\n# Sky Germany Vodafone - Cable (Service IDs 0074-008B)\n0074:098E,1838,1850,1854,1868|Sky Cinema Action HD|TV|Sky Cinema Paket|Sky\n006B:098E,1838,1850,1854,1868|Sky Cinema Classics HD|TV|Sky Cinema Paket|Sky\n\n# HD+ - 19.2E (Service IDs EF10-EF74)\nEF10:1830,1843,1860,186A,186D,09C4,098C,098D|RTL HD|TV||Astra HD+\nEF11:1830,1843,1860,186A,186D,09C4,098C,098D|VOX HD|TV||Astra HD+\n\n# ORF Digital - 19.2E (Service IDs 132F-33AC)\n132F:0D95,0D98,0648,0650,09C4,098C|ORF1 HD|||ORF Digital\n1330:0D95,0D98,0648,0650,09C4,098C|ORF2 HD|||ORF Digital\n```", .status = 0 },
{ .param = "Channel", .config = "srvid2", .section = "", .text = "- Verify file is named oscam.srvid2\n- Check file is in correct configuration directory\n- Ensure Unix line endings (not Windows CRLF)\n- Verify CAID:ProvID:SrvID matches exactly\n- Restart OSCam after changes", .status = 0 },
{ .param = "Wrong", .config = "srvid2", .section = "", .text = "- Check for duplicate entries\n- Verify provider ID priority rules\n- Ensure hexadecimal values are correct\n- Check for typos in CAID/ProvID/SrvID", .status = 0 },
{ .param = "Memory", .config = "srvid2", .section = "", .text = "- Reduce file size by removing unused entries\n- Keep descriptions short\n- Remove unnecessary fields\n- Consider external service ID management", .status = 0 },
2026-02-17 10:48:41 +00:00
{ .param = "Parameters", .config = "provid", .section = "", .text = "- **caid**: Conditional Access Identification in hexadecimal (e.g., 0100, 0500, 1702)\n- **provid**: Provider ID in hexadecimal (e.g., 000000, 003411, 000401)\n- **provider**: Human-readable provider name (e.g., \"Sky Germany\", \"Canal+\")\n- **satellite**: Satellite position or transmission method (e.g., \"19.2E\", \"Astra\", \"Cable\")\n- **language**: Language code or description (e.g., \"de\", \"en\", \"fr\")", .status = 0 },
{ .param = "Basic", .config = "provid", .section = "", .text = "```\n0100:012345|MyPay-TV|Astra 19E|German\n```\n\nThis maps CAID 0100 with Provider ID 012345 to \"MyPay-TV\" on Astra 19.2E in German.", .status = 0 },
{ .param = "Real-World", .config = "provid", .section = "", .text = "```\n# Sky Germany\n1702:000000|Sky Germany S02|19.2E|de\n1833:000401|Sky Germany HD+|19.2E|de\n\n# Canal+\n0100:003311|Canal+ France|19.2E|fr\n0100:003315|Canal+ Espana|19.2E|es\n\n# HD+\n1830:003411|HDplus HD01|19.2E|de\n\n# ORF\n0D05:000000|ORF|19.2E|de\n0D05:000004|ORF ICE|19.2E|de\n\n# Mediaset\n0100:00000B|Mediaset Italy|13E|it\n```", .status = 0 },
{ .param = "With", .config = "provid", .section = "", .text = "```\n# oscam.provid\n# Provider table for OSCam\n# Format: <caid>:<provid>|<provider>|<satellite>|<language>\n\n# German Providers\n1702:000000|Sky Germany S02|19.2E|de\n1830:003411|HDplus HD01|19.2E|de\n\n# French Providers\n0100:003311|Canal+ France|19.2E|fr\n0500:032830|Fransat|5W|fr\n```", .status = 0 },
{ .param = "Sky", .config = "provid", .section = "", .text = "```\n1702:000000|Sky Germany S02|19.2E|de\n1833:000401|Sky Germany NDS|19.2E|de\n09C4:000000|Sky Germany V13|19.2E|de\n```", .status = 0 },
{ .param = "HD", .config = "provid", .section = "", .text = "```\n1830:003411|HDplus HD01|19.2E|de\n1843:003411|HDplus HD02|19.2E|de\n```", .status = 0 },
{ .param = "Canal", .config = "provid", .section = "", .text = "```\n0100:003311|Canal+ France|19.2E|fr\n0100:003315|Canal+ Espana|19.2E|es\n0100:003317|Canal+ Polska|13E|pl\n```", .status = 0 },
{ .param = "ORF", .config = "provid", .section = "", .text = "```\n0D05:000000|ORF|19.2E|de\n0D05:000004|ORF ICE|19.2E|de\n0D95:000000|ORF|19.2E|de\n0D95:000004|ORF ICE|19.2E|de\n```", .status = 0 },
{ .param = "Viaccess", .config = "provid", .section = "", .text = "```\n0500:032830|Fransat|5W|fr\n0500:042400|SRG Swiss|13E|de/fr/it\n0500:050F00|Bis TV|19.2E|fr\n```", .status = 0 },
{ .param = "Finding", .config = "provid", .section = "", .text = "1. Check OSCam logs for CAID:ProvID values\n2. Look at reader statistics in the web interface\n3. Consult online provider databases\n4. Use card information tools", .status = 0 },
{ .param = "Adding", .config = "provid", .section = "", .text = "1. Identify the CAID:ProvID from logs or web interface\n2. Research the provider name and details\n3. Add a new line with the appropriate format\n4. Restart OSCam or reload configuration\n5. Verify the display in web interface", .status = 0 },
{ .param = "Organization", .config = "provid", .section = "", .text = "- Group providers by country or encryption system\n- Use comments to separate sections\n- Keep entries alphabetically sorted within sections\n- Include satellite position for clarity", .status = 0 },
{ .param = "Naming", .config = "provid", .section = "", .text = "- Use clear, descriptive provider names\n- Include card generation if applicable (S02, HD01, etc.)\n- Specify satellite position in standard format (19.2E, 13E, etc.)\n- Use standard language codes (de, en, fr, es, it, etc.)", .status = 0 },
{ .param = "Maintenance", .config = "provid", .section = "", .text = "- Update entries when providers change\n- Remove obsolete providers marked as \"(Old)\"\n- Add new providers as they become available\n- Keep the file synchronized across your OSCam instances", .status = 0 },
{ .param = "Parameters", .config = "ird", .section = "", .text = "- **byte3**: The value of byte 3 in the ECM signature (hexadecimal)\n- **byte4-7**: The values of bytes 4 through 7 in the ECM signature (hexadecimal)\n- **CAID**: The Conditional Access Identification number (hexadecimal)\n- **SID**: The Service ID (hexadecimal)", .status = 0 },
{ .param = "Irdeto", .config = "ird", .section = "", .text = "The primary use case is with Irdeto conditional access systems:\n- Irdeto 1 (CAID 0x0600)\n- Irdeto 2 (CAID 0x0602, 0x0604, 0x0606, 0x0608, etc.)\n- Various Irdeto providers with different signature patterns", .status = 0 },
{ .param = "Automatic", .config = "ird", .section = "", .text = "When working with Irdeto cards or emulators where CAID needs to be determined from ECM signatures rather than being explicitly provided.", .status = 0 },
{ .param = "Empty", .config = "ird", .section = "", .text = "Even if you don't need signature mapping, create an empty file to suppress warnings:\n\n```bash\ntouch oscam.ird\n```", .status = 0 },
{ .param = "Signature", .config = "ird", .section = "", .text = "To populate this file, you typically need to:\n1. Analyze ECM messages from your Irdeto provider\n2. Extract the signature bytes from positions 3-7\n3. Determine the correct CAID and SID for each signature\n4. Add entries to the file", .status = 0 },
{ .param = "Testing", .config = "ird", .section = "", .text = "After adding entries:\n1. Restart OSCam\n2. Monitor logs for CAID detection\n3. Verify that channels open correctly\n4. Adjust mappings if needed", .status = 0 },
{ .param = "Parameters", .config = "srvid", .section = "", .text = "- **CAID**: One or more CAIDs in hexadecimal (max 10 per line)\n- **@PROVID**: Optional provider ID(s) in hexadecimal\n- **service ID**: Service ID (channel ID) in hexadecimal\n- **provider**: Provider or satellite position (optional)\n- **name**: Channel name (optional)\n- **type**: Channel type like TV, Radio, etc. (optional)\n- **description**: Additional description (optional)", .status = 0 },
{ .param = "Simple", .config = "srvid", .section = "", .text = "```\n0001,0002,0003:000a|my provider 1|tv name|tv|my tv package\n0004,0005,0006:000a|my provider 2|radio name 2|radio|my radio package\n0006:000b|my provider 3|tv name 3|\n```", .status = 0 },
{ .param = "CAID", .config = "srvid", .section = "", .text = "```\n# CAID 0100, all provider IDs, service ID 1111\n0100:1111:x|y|z|v\n```", .status = 0 },
{ .param = "CAID", .config = "srvid", .section = "", .text = "```\n# CAID 0100, provider ID 123456, service ID 1111\n0100@123456:1111:x|y|z|v\n```", .status = 0 },
{ .param = "CAID", .config = "srvid", .section = "", .text = "```\n# CAID 0100, all providers, service ID 1111\n0100@000000:1111:x|y|z|v\n```", .status = 0 },
{ .param = "Multiple", .config = "srvid", .section = "", .text = "```\n# CAID 0100 with provider 123456 AND CAID 0200 with provider 654321, both for service ID 1111\n0100@123456,0200@654321:1111:x|y|z|v\n```", .status = 0 },
{ .param = "Sky", .config = "srvid", .section = "", .text = "**Sky SAT:**\n\n```\n098C,098D,09F0:007F|Sky|13th Street|TV|Sky Starter Paket\n098C,098D,09F0:0085|Sky|Beate Uhse|TV|Sky Starter Paket\n098C,098D,09F0:0194|Sky|Cartoon Network|TV|Sky Starter Paket\n```\n\n**Sky Vodafone:**\n\n```\n098E,1838,1850,1854,1868:0074|Sky|Sky Cinema Action HD|TV|Sky Cinema Paket\n098E,1838,1850,1854,1868:006B|Sky|Sky Cinema Classics HD|TV|Sky Cinema Paket\n098E,1838,1850,1854,1868:008B|Sky|Sky Cinema Family HD|TV|Sky Cinema Paket\n```", .status = 0 },
{ .param = "HD", .config = "srvid", .section = "", .text = "```\n1830,1843,1860,186A,186D,09C4,098C,098D:EF10|Astra HD+|RTL HD|TV|\n1830,1843,1860,186A,186D,09C4,098C,098D:EF11|Astra HD+|VOX HD|TV|\n1830,1843,1860,186A,186D,09C4,098C,098D:EF74|Astra HD+|SAT.1 HD|TV|\n```", .status = 0 },
{ .param = "ORF", .config = "srvid", .section = "", .text = "```\n0D95,0D98,0648,0650,09C4,098C:132F|ORF Digital|ORF1 HD\n0D95,0D98,0648,0650,09C4,098C:1330|ORF Digital|ORF2 HD\n0D95,0D98,0648,0650,09C4,098C:33AC|ORF Digital|ATV HD\n```", .status = 0 },
{ .param = "Multicrypt", .config = "srvid", .section = "", .text = "For multicrypt channels, you can list all CAIDs used by the channel, including the management CAID 0000:\n\n```\n0000,1702,1837,1833,09C4,098C,0D05,0D95,0648,0D98,0650:0025|austriasat 19.2°E|AXN Action|TV|\n```\n\nThis prevents \"unknown program\" messages in the web interface and makes it easy to see all CAIDs used by a channel.", .status = 0 },
{ .param = "Finding", .config = "srvid", .section = "", .text = "Switch to the channel and check the OSCam logs:\n\n```\n2013/10/12 17:45:22 4DB510 c [DVBAPI] Receiver sends PMT command 3 for channel 0025\n2013/10/12 17:45:22 4DB510 c [ADD PID 0] CAID: 1702 ECM_PID: 1725 PROVID: 000000\n2013/10/12 17:45:22 4DB510 c [ADD PID 1] CAID: 1837 ECM_PID: 1FD1 PROVID: 000000\n2013/10/12 17:45:22 4DB510 c [ADD PID 2] CAID: 1833 ECM_PID: 1825 PROVID: 000000\n```\n\nUse these CAIDs in your oscam.srvid entry.", .status = 0 },
{ .param = "Free-to-Air", .config = "srvid", .section = "", .text = "For FTA channels, use CAID FFFE:\n\n```\nFFFE:2404|Freesat 28.2°E|Film4|TV|Movies|\n```\n\nNote: FTA CAID changed from 0000 to FFFE. Management CAID 0000 is reserved for multicrypt channels.", .status = 0 },
{ .param = "Finding", .config = "srvid", .section = "", .text = "1. Check OSCam logs for service ID information\n2. Use DVB analysis tools to scan channels\n3. Monitor ECM requests in OSCam logs\n4. Check the web interface status page\n5. Consult online channel databases", .status = 0 },
{ .param = "Extracting", .config = "srvid", .section = "", .text = "Look for lines like:\n```\n[DVBAPI] Receiver wants to demux srvid 0025 on adapter 0000\n```\n\nThe service ID is 0025 in this example.", .status = 0 },
{ .param = "Organization", .config = "srvid", .section = "", .text = "- Group channels by provider or satellite\n- Use comments to separate sections\n- Keep entries sorted by CAID and service ID\n- Document special entries", .status = 0 },
{ .param = "Naming", .config = "srvid", .section = "", .text = "- Use clear, descriptive channel names\n- Include satellite position in provider field\n- Specify channel type (TV, Radio, etc.)\n- Add useful descriptions", .status = 0 },
{ .param = "Maintenance", .config = "srvid", .section = "", .text = "- Update when channel lineups change\n- Remove obsolete channels\n- Add new channels as they appear\n- Keep synchronized with actual channel availability", .status = 0 },
{ .param = "Example", .config = "srvid", .section = "", .text = "```\n# Sky Germany SAT - 19.2E\n098C,098D,09F0:007F|Sky|13th Street|TV|Sky Starter Paket\n098C,098D,09F0:0085|Sky|Beate Uhse|TV|Sky Starter Paket\n\n# Sky Germany Vodafone - Cable\n098E,1838,1850,1854,1868:0074|Sky|Sky Cinema Action HD|TV|Sky Cinema Paket\n098E,1838,1850,1854,1868:006B|Sky|Sky Cinema Classics HD|TV|Sky Cinema Paket\n\n# HD+ - 19.2E\n1830,1843,1860,186A,186D,09C4,098C,098D:EF10|Astra HD+|RTL HD|TV|\n1830,1843,1860,186A,186D,09C4,098C,098D:EF11|Astra HD+|VOX HD|TV|\n\n# ORF Digital - 19.2E\n0D95,0D98,0648,0650,09C4,098C:132F|ORF Digital|ORF1 HD\n0D95,0D98,0648,0650,09C4,098C:1330|ORF Digital|ORF2 HD\n```", .status = 0 },
{ .param = "Channel", .config = "srvid", .section = "", .text = "- Verify file is named oscam.srvid\n- Check file is in correct configuration directory\n- Ensure Unix line endings (not Windows CRLF)\n- Verify CAID:ProvID:SrvID matches exactly\n- Restart OSCam after changes", .status = 0 },
{ .param = "Wrong", .config = "srvid", .section = "", .text = "- Check for duplicate entries\n- Verify provider ID priority rules\n- Ensure hexadecimal values are correct\n- Check for typos in CAID/ProvID/SrvID", .status = 0 },
{ .param = "Memory", .config = "srvid", .section = "", .text = "- Reduce file size by removing unused entries\n- Keep descriptions short\n- Remove unnecessary fields\n- Consider external service ID management", .status = 0 },
{ .param = "Syntax", .config = "tiers", .section = "", .text = "```\nCAID[,CAID]...:TIER_ID|description\n```", .status = 0 },
{ .param = "Format", .config = "tiers", .section = "", .text = "- **CAID**: Conditional Access ID (4-digit hexadecimal), multiple CAIDs can be specified separated by commas\n- **TIER_ID**: Tier/Channel ID (4-digit hexadecimal)\n- **description**: Human-readable description of the tier/service package\n- **:** Separator between CAID list and TIER_ID\n- **|** Separator between TIER_ID and description", .status = 0 },
{ .param = "Important", .config = "tiers", .section = "", .text = "- Use Unix text file format only (LF line endings, not CRLF)\n- Comments start with `#`\n- Multiple CAIDs can share the same TIER_ID\n- Entries should be sorted by TIER_ID within each card/provider section", .status = 0 },
{ .param = "Basic", .config = "tiers", .section = "", .text = "```\n0001,0002,0003:000a|my TIER 1\n0004:000b|my TIER 2\n0005:000b|my TIER 3\n```", .status = 0 },
{ .param = "Sky", .config = "tiers", .section = "", .text = "```\n09C4,09C7:0046|HDplus [NDS]\n09C4,09C7:007D|Sky Sport [NDS]\n09C4,09C7:0081|Sky Bundesliga [NDS]\n09C4,09C7:008E|Beate Uhse [NDS]\n09C4,09C7:00C7|Sky Welt [NDS]\n09C4,09C7:00C8|Sky Film [NDS]\n09C4,09C7:00C9|Sky Welt HD [NDS]\n09C4,09C7:00CA|Sky Film HD [NDS]\n09C4,09C7:00CB|Sky Sport HD [NDS]\n```", .status = 0 },
{ .param = "Sky", .config = "tiers", .section = "", .text = "```\n1702,1833,1722,1834:000F|Sky Sport Portal\n1702,1833,1722,1834:00F0|Sky Bundesliga\n1702,1833,1722,1834:026C|Sky Welt Extra 1\n1702,1833,1722,1834:05E7|Blue Movie Portal\n1702,1833,1722,1834:05F1|Sky Welt HD\n1702,1833,1722,1834:0614|Sky Sport News [SD/HD]\n1702,1833,1722,1834:7D21|Sky Welt\n1702,1833,1722,1834:7D22|Sky Film\n1702,1833,1722,1834:7D23|Sky Sport\n```", .status = 0 },
{ .param = "HD", .config = "tiers", .section = "", .text = "```\n# HDplus HD01 [Nagra]\n1830:0064|Gratis Jahr\n1830:0065|Ungenutzt\n1830:0BEA|HDplus Paket\n\n# HDplus HD02 [Nagra]\n1843:0066|HDplus Paket [Nagra HD02]\n1843:0067|HDplus Paket [Nagra HD02]\n1843:0BEA|HDplus Paket [Nagra HD02]\n```", .status = 0 },
{ .param = "ORF-ICE", .config = "tiers", .section = "", .text = "```\n# Provider 1\n0648:0001|ORF\n0648:0002|ATV / Private\n0648:000D|ORF-ICE Irdeto-Mode Unknown\n0648:F000|ORF-ICE Irdeto-Mode Unknown\n\n# Provider 2\n0648:0015|ORF-ICE Irdeto-Mode Unknown\n```", .status = 0 },
{ .param = "ORF", .config = "tiers", .section = "", .text = "```\n0D05,0D95:0001|ORF All\n0D05,0D95:0010|ATV\n```", .status = 0 },
{ .param = "Understanding", .config = "tiers", .section = "", .text = "TIERs (or CHIDs) are identifiers used by conditional access systems to define which services or channels a subscriber has access to. Each smartcard contains entitlements that specify which TIERs are active.", .status = 0 },
{ .param = "TIER", .config = "tiers", .section = "", .text = "To determine the TIERs available on an NDS card:\n\n1. Set OSCam debug level to 4\n2. Check bytes 11 and 12 in the line below \"Decrypted (Payload)\" in the log\n3. Use this command to extract TIER IDs:\n\n```bash\ngrep -ia -A1 'Decrypted' /tmp/oscam.log | tail -n 1 | sed 's/ */ /g' | cut -d \" \" -f16,17 | sed 's/ //g'\n```", .status = 0 },
{ .param = "WebIF", .config = "tiers", .section = "", .text = "Starting with OSCam 1.20-unstable r5920:\n- If no TIER/CHID assignments are found in `oscam.tiers`\n- OSCam will display CAID/Provider assignments from `oscam.provid` in the WebIF (if available)\n- This provides fallback information when tier definitions are not configured", .status = 0 },
{ .param = "Organizing", .config = "tiers", .section = "", .text = "1. **Group by Provider**: Keep all entries for the same provider together\n2. **Add Comments**: Use comments to identify provider and card type\n3. **Sort by TIER_ID**: Within each provider section, sort entries by TIER_ID (ascending)\n4. **Include Date**: Add a date comment when updating the file", .status = 0 },
{ .param = "Example", .config = "tiers", .section = "", .text = "```\n# oscam.tiers\n# Last updated: 2024-01-15\n# Source: http://www.streamboard.tv/wiki/Tiers\n\n# ============================================\n# Sky Germany V13/G02/G09 [NDS]\n# ============================================\n09C4,09C7:0046|HDplus [NDS]\n09C4,09C7:007D|Sky Sport [NDS]\n# ... more entries ...\n\n# ============================================\n# HD+ [Nagra]\n# ============================================\n1830,1843:0064|HD+ Gratisjahr (HD01)\n1830,1843:0BEA|Jahresabo HD+\n# ... more entries ...\n```", .status = 0 },
{ .param = "Maintaining", .config = "tiers", .section = "", .text = "- TIERs can change when providers update their systems\n- Keep your `oscam.tiers` file updated with current information\n- Community resources like the Streamboard Wiki maintain updated TIER lists\n- Test your configuration after updates to ensure correct display in WebIF", .status = 0 },
{ .param = "Supported", .config = "tiers", .section = "", .text = "The `oscam.tiers` file commonly includes definitions for:\n\n- **Sky Germany**: NDS (09C4, 09C7) and Nagra (1702, 1833, 1722, 1834) systems\n- **HD+**: Nagra systems (1830, 1843)\n- **ORF**: Irdeto (0648, 0650) and CryptoWorks (0D05, 0D95) systems\n- **Unity Media**: Nagra systems (1722, 1831, 1835, 1838)\n- **MTV Unlimited**: Conax systems (0B00)", .status = 0 },
{ .param = "CAID", .config = "tiers", .section = "", .text = "Common CAIDs used in tier definitions:\n\n- **09C4, 09C7, 098C**: NDS (VideoGuard) - Sky Germany\n- **1702, 1722, 1833, 1834**: Nagra - Sky Germany\n- **1830, 1843**: Nagra - HD+\n- **0648, 0650**: Irdeto - ORF\n- **0D05, 0D95, 0D98**: CryptoWorks - ORF\n- **0B00**: Conax - MTV Unlimited", .status = 0 },
{ .param = "TIERs", .config = "tiers", .section = "", .text = "1. **Check File Format**: Ensure Unix line endings (LF, not CRLF)\n2. **Verify Syntax**: Check for correct format with colons and pipes\n3. **Match CAIDs**: Ensure CAIDs in the file match your card's CAID\n4. **Check Permissions**: Verify OSCam can read the file\n5. **Restart OSCam**: Changes require OSCam restart to take effect", .status = 0 },
{ .param = "Finding", .config = "tiers", .section = "", .text = "If you need to identify unknown TIER IDs:\n\n1. Enable debug logging in OSCam (set debug level to 4)\n2. Monitor the log file during card initialization\n3. Look for \"Decrypted (Payload)\" entries\n4. Extract bytes 11-12 for the TIER ID\n5. Add the new TIER to your configuration file", .status = 0 },
{ .param = "Incorrect", .config = "tiers", .section = "", .text = "- Verify TIER_ID matches the actual service\n- Check for typos in hexadecimal values\n- Consult community resources for accurate descriptions\n- Update from maintained TIER lists", .status = 0 },
{ .param = "Parameters", .config = "cert", .section = "", .text = "- **CAID**: Conditional Access Identification - numeric identifier for the encryption provider (in hexadecimal)\n- **reserved**: Reserved field (typically set to 00000000)\n- **IPK**: Issuer Public Key or session key in hexadecimal format", .status = 0 },
{ .param = "Cryptoworks", .config = "cert", .section = "", .text = "This file is specifically designed for Cryptoworks conditional access systems where:\n- Issuer Public Keys are required for decryption\n- Session keys need to be mapped to specific CAIDs\n- Multiple providers may use different keys", .status = 0 },
{ .param = "Key", .config = "cert", .section = "", .text = "The file provides a centralized location for:\n- Storing cryptographic keys\n- Managing multiple CAID mappings\n- Updating keys without modifying other configuration files", .status = 0 },
{ .param = "Parameters", .config = "guess", .section = "", .text = "- **length of ECM**: The length of the ECM message in hexadecimal format\n- **CAID**: The Conditional Access Identification number in hexadecimal format", .status = 0 },
{ .param = "BOMBA", .config = "guess", .section = "", .text = "The primary use case is with the BOMBA protocol, which does not transmit CAID information:\n\n```\n# BOMBA protocol CAID guessing\n10:0B00\n12:0D00\n14:0E00\n```", .status = 0 },
{ .param = "Legacy", .config = "guess", .section = "", .text = "Some older or proprietary protocols may also benefit from CAID guessing:\n- Custom card sharing protocols\n- Modified or stripped-down protocols\n- Legacy conditional access systems", .status = 0 },
{ .param = "m", .config = "whitelist", .section = "", .text = "```\nm: 3456:123456::::: 4567:234567:\n```\n\nUsed for mapping between different identifiers.", .status = 0 },
{ .param = "w", .config = "whitelist", .section = "", .text = "```\nw: [CAID][:][provider ID][:][service ID][:][ECM PID][:][CHID][:][ECM length 1[,ECM length 2]...]]\n```\n\nDefines ECM length whitelisting rules. Only ECMs matching these criteria will be processed.", .status = 0 },
{ .param = "l", .config = "whitelist", .section = "", .text = "```\nl: [CAID][:][provider ID][:][service ID][:][ECM PID][:][CHID][:][ECM length 1[,ECM length 2]...]]\n```\n\nECM length whitelisting that does not proceed with any other ECM length. This is an abbreviation for normal ECM length whitelisting using the `w:` parameter.", .status = 0 },
{ .param = "i", .config = "whitelist", .section = "", .text = "```\ni: [CAID][:][provider ID][:][service ID][:][ECM PID][:][CHID][:][ECM length 1[,ECM length 2]...]]\n```\n\nIgnores ECM requests matching the specified criteria.", .status = 0 },
{ .param = "Field", .config = "whitelist", .section = "", .text = "```\n[prefix]:[CAID][:][provider ID][:][service ID][:][ECM PID][:][CHID][:][ECM length 1[,ECM length 2]...]]\n```", .status = 0 },
{ .param = "Field", .config = "whitelist", .section = "", .text = "- **prefix**: Entry type (`m`, `w`, `l`, or `i`)\n- **CAID**: Conditional Access ID (4-digit hexadecimal)\n- **provider ID**: Provider identifier (hexadecimal)\n- **service ID**: Service identifier (hexadecimal)\n- **ECM PID**: ECM Process ID (hexadecimal)\n- **CHID**: Channel ID (hexadecimal)\n- **ECM length**: ECM length in bytes (decimal), multiple values separated by commas\n\nAll fields after the prefix are optional. Empty fields are indicated by consecutive colons.", .status = 0 },
{ .param = "Basic", .config = "whitelist", .section = "", .text = "```\n# Whitelist all CAID 0100\nw:0100\n\n# Ignore CAID 0200 with service ID 1234\ni:0200::1234\n\n# Ignore CHID 2345\ni:::::2345\n\n# Allow all others (blacklist mode)\nw:\n```", .status = 0 },
{ .param = "Provider-Specific", .config = "whitelist", .section = "", .text = "#### Sky Germany S02 (Nagra)\n\n```\n# S02\nw:1702:000000::::93\n```\n\n#### Sky Germany S02-Tunnel\n\n```\n# S02-Tunnel\nw:1833:000000::::89\n```\n\n#### Sky Germany V13 (NDS)\n\n```\n# V13\nw:09C4:000000::::46,58,90,95\n```\n\n#### HD+ (Nagra)\n\n```\n# HD+\nw:1830:000000::::92\nw:1830:003411::::92\nw:1830:008011::::92\n```\n\n#### ORF (CryptoWorks)\n\n```\n# CAMD3-Keys\nw:0D05:::::9C\n```", .status = 0 },
{ .param = "Whitelist", .config = "whitelist", .section = "", .text = "In whitelist mode, only explicitly allowed ECMs are processed:\n\n```\n# Allow only specific CAIDs\nw:1702\nw:09C4\nw:1830\n\n# Block everything else (implicit - no w: at end)\n```", .status = 0 },
{ .param = "Blacklist", .config = "whitelist", .section = "", .text = "In blacklist mode, all ECMs are allowed except those explicitly blocked:\n\n```\n# Block specific problematic services\ni:0500::1234\ni:0100::5678\n\n# Allow everything else\nw:\n```", .status = 0 },
{ .param = "Mixed", .config = "whitelist", .section = "", .text = "Combine whitelist and blacklist rules:\n\n```\n# Whitelist specific CAID with certain ECM lengths\nw:1702:000000::::93\n\n# Ignore problematic service\ni:0500::1234\n\n# Allow all other CAIDs\nw:\n```", .status = 0 },
{ .param = "Optimizing", .config = "whitelist", .section = "", .text = "1. **Be Specific**: Use specific rules to reduce processing overhead\n2. **Order Matters**: Place most frequently matched rules at the top\n3. **Minimize Entries**: Only include rules you actually need\n4. **Memory Consideration**: Avoid copying entire whitelist databases; use only what you need", .status = 0 },
{ .param = "Finding", .config = "whitelist", .section = "", .text = "To determine ECM lengths for your setup:\n\n1. Enable debug logging in OSCam\n2. Monitor ECM requests in the log\n3. Note the ECM lengths for services you want to whitelist\n4. Add appropriate entries to oscam.whitelist", .status = 0 },
{ .param = "Testing", .config = "whitelist", .section = "", .text = "1. Start with a permissive configuration (`w:` at the end)\n2. Add ignore rules for problematic services\n3. Monitor logs to verify filtering is working\n4. Gradually refine rules based on actual usage", .status = 0 },
{ .param = "Allow", .config = "whitelist", .section = "", .text = "```\nw:1702\n```", .status = 0 },
{ .param = "Allow", .config = "whitelist", .section = "", .text = "```\nw:1702:000000\n```", .status = 0 },
{ .param = "Allow", .config = "whitelist", .section = "", .text = "```\nw:09C4:000000::::46,58,90,95\n```", .status = 0 },
{ .param = "Ignore", .config = "whitelist", .section = "", .text = "```\ni:0500::1234\n```", .status = 0 },
{ .param = "Ignore", .config = "whitelist", .section = "", .text = "```\ni:::::2345\n```", .status = 0 },
{ .param = "Allow", .config = "whitelist", .section = "", .text = "```\nw:\n```", .status = 0 },
{ .param = "No", .config = "whitelist", .section = "", .text = "- Check if you have a catch-all `w:` rule at the end\n- Verify your whitelist rules match your actual CAIDs\n- Check for typos in hexadecimal values\n- Ensure file has proper permissions", .status = 0 },
{ .param = "Wrong", .config = "whitelist", .section = "", .text = "- Review rule order (first match wins)\n- Check for overlapping rules\n- Verify ECM lengths are correct\n- Enable debug logging to see which rules are matching", .status = 0 },
{ .param = "Performance", .config = "whitelist", .section = "", .text = "- Reduce number of rules\n- Use more specific rules to match faster\n- Remove unused entries\n- Consider using only essential whitelisting", .status = 0 },
{ .param = "oscam", .config = "whitelist", .section = "", .text = "The whitelist file works in conjunction with oscam.conf settings:\n\n```ini\n[global]\n# Enable ECM length filtering\necmwhitelist = /path/to/oscam.whitelist\n```", .status = 0 },
{ .param = "Related", .config = "whitelist", .section = "", .text = "- **oscam.conf**: Main configuration file\n- **oscam.services**: Service definitions\n- **oscam.user**: User-specific settings that may override whitelist behavior", .status = 0 },
{ .param = "Combining", .config = "whitelist", .section = "", .text = "```\n# Whitelist specific CAID, provider, and ECM length\nw:1702:000000::::93\n\n# Ignore specific CAID and service combination\ni:0500:123456:1234\n```", .status = 0 },
{ .param = "Provider-Specific", .config = "whitelist", .section = "", .text = "```\n# Allow HD+ with all providers\nw:1830:000000::::92\nw:1830:003411::::92\nw:1830:008011::::92\n\n# Block specific problematic provider\ni:0500:BADPROV\n```", .status = 0 },
{ .param = "Service-Level", .config = "whitelist", .section = "", .text = "```\n# Allow specific services only\nw:1702::SERVICE1\nw:1702::SERVICE2\n\n# Block all others (no catch-all w:)\n```", .status = 0 },
{ .param = "Required", .config = "services", .section = "", .text = "All parameters are required for each service definition:\n\n- **[service name]**: Unique name for the service group (section header)\n- **caid**: One or more CAIDs in hexadecimal, comma-separated\n- **provid**: One or more Provider IDs in hexadecimal, comma-separated\n- **srvid**: One or more Service IDs in hexadecimal, comma-separated", .status = 0 },
{ .param = "Optional", .config = "services", .section = "", .text = "These parameters were added in SVN revision 11588 (August 23, 2020):\n\n- **disablecrccws_only_for_exception**: Define service as exception for disablecrccws_only_for settings (0|1, default: 0)\n- **no_wait_time**: Define service as wait_time exception (0|1, default: 0)\n- **lg_only_exception**: Define service as localgenerated-only exception for cache exchange (0|1, default: 0)", .status = 0 },
{ .param = "HD", .config = "services", .section = "", .text = "```\n[hdplus]\ncaid = 1830,1843,1860,186A,186D\nprovid =\nsrvid = 0002,126E,126F,1519,151A,157C,157F,1581,183D,2774,2E9B,2EAF,307A,30D6,5274,6FEC,6FEE,EF10,EF11,EF14,EF15,EF16,EF17,EF74,EF75,EF76,EF77,EF78,EF79,EF7A,07E4,07D0,07EE,07F8\n```", .status = 0 },
{ .param = "Sky", .config = "services", .section = "", .text = "```\n[SAT-Sky-Starter-Paket]\ncaid = 098C,098D,09F0\nprovid =\nsrvid = 007F,0085,0194,0192,0016,0071,0191,00A8,0082,0077,0206,000D,0070,0017,0076,0093,007C,008E,006C,007E,0065,0088,007B\n```", .status = 0 },
{ .param = "Sky", .config = "services", .section = "", .text = "```\n[SAT-Sky-Sport-UHD]\ncaid = 098C,098D,09F0\nprovid =\nsrvid = 0228,0229\n```", .status = 0 },
{ .param = "Sky", .config = "services", .section = "", .text = "```\n[UM-Sky-Sport-Paket]\ncaid = 098E,1838,1850,1854,1868\nprovid =\nsrvid = 010C,0116,0120,012A,0134,013E,0148,0152,0102,010D,0011,0091,0090,008D,0072,0081\n```", .status = 0 },
{ .param = "ORF", .config = "services", .section = "", .text = "```\n[orfcw]\ncaid = 0D95,0D98\nprovid =\nsrvid = 32C9,32CA,32CB,32CC,32CD,32CE,32CF,32D0,32D1,32D2,32D3,32D6,32D4,33A7,4E27,33A5,332D,3337,132F,1330,33AC,33FD,1334,33FA,33FB,33FC,33F5,33F6,33F7,33F8,33F9,1331,33FC,14B8\n```", .status = 0 },
{ .param = "With", .config = "services", .section = "", .text = "```\n[special_service]\ncaid = 0100\nprovid = 000001\nsrvid = 5000,5001\ndisablecrccws_only_for_exception = 1\nno_wait_time = 1\nlg_only_exception = 1\n```\n\nThis service is configured with all exception flags enabled for special handling.", .status = 0 },
{ .param = "Separate", .config = "services", .section = "", .text = "```\n[sky_sport_channels]\ncaid = 098C,098D,09F0\nprovid =\nsrvid = 0228,0229,010C,0116\n\n[sky_cinema_channels]\ncaid = 098E,1838,1850,1854,1868\nprovid =\nsrvid = 0074,006B,008B\n\n[hd_basic_channels]\ncaid = 1830,1843,1860,186A,186D\nprovid =\nsrvid = EF10,EF11,EF74,EF75\n```", .status = 0 },
{ .param = "In", .config = "services", .section = "", .text = "```\n[account]\nuser = john\npwd = password\nservices = hdplus,SAT-Sky-Starter-Paket\n```\n\nUser \"john\" can only access channels defined in hdplus and SAT-Sky-Starter-Paket service groups.", .status = 0 },
{ .param = "In", .config = "services", .section = "", .text = "```\n[reader]\nlabel = myreader\nprotocol = internal\ndevice = /dev/sci0\nservices = orfcw,hdplus\n```\n\nThis reader is restricted to only serve channels defined in the orfcw and hdplus service groups.", .status = 0 },
{ .param = "Naming", .config = "services", .section = "", .text = "- Use descriptive, meaningful service names\n- Use lowercase with underscores (e.g., sky_de_sport)\n- Group related channels logically\n- Keep names short but clear", .status = 0 },
{ .param = "Organization", .config = "services", .section = "", .text = "- Group services by provider or package\n- Separate by content type (sports, movies, kids, etc.)\n- Use comments to document service groups\n- Keep related services together in the file", .status = 0 },
{ .param = "Maintenance", .config = "services", .section = "", .text = "- Document which channels belong to each service\n- Update service definitions when channel lineups change\n- Remove obsolete service definitions\n- Test service restrictions after changes", .status = 0 },
{ .param = "Performance", .config = "services", .section = "", .text = "- Stay within the 64-service limit per reader\n- Combine related channels into single services when possible\n- Avoid overly granular service definitions\n- Balance between flexibility and simplicity", .status = 0 },
{ .param = "User", .config = "services", .section = "", .text = "- Verify the service is assigned to the user in oscam.user\n- Check that the service definition includes the correct CAID/ProvID/SrvID\n- Ensure service names match exactly (case-sensitive)\n- Verify the reader has access to the service", .status = 0 },
{ .param = "Service", .config = "services", .section = "", .text = "- Check for typos in service names\n- Verify hexadecimal values are correct\n- Ensure all required parameters are present\n- Check for duplicate service names", .status = 0 },
{ .param = "64-Service", .config = "services", .section = "", .text = "- Consolidate similar services\n- Remove unused service definitions\n- Use broader service definitions\n- Consider splitting across multiple readers", .status = 0 },
{ .param = "enableled", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nLED-Support.\n\n```ini\nenableled = 0 # LED support disabled (default)\nenableled = 1 # LED support enabled for routers\nenableled = 2 # LED support enabled for Qbox HD\n```\n\n**Format:**\n```ini\nenableled = 0|1|2\n```\n\n**Example:**\n```ini\nenableled = 1\n```\n\n**Default:**\n```ini\nenableled = 0\n```", .status = 0 },
{ .param = "disablelog", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nSwitches logfile **off**.\n\n```ini\ndisablelog = 0 # log (default)\ndisablelog = 1 # no log\n```\n\n**Format:**\n```ini\ndisablelog = 0|1\n```\n\n**Example:**\n```ini\ndisablelog = 1\n```\n\n**Default:**\n```ini\ndisablelog = 0\n```", .status = 0 },
{ .param = "loghistorylines", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` or `MODULE_MONITOR` compilation flag)**\n\nNumber of log lines to keep in memory for display in WebIF status page.\n\n**Format:**\n```ini\nloghistorylines = count\n```\n\n**Example:**\n```ini\nloghistorylines = 512\n```\n\n**Default:**\n```ini\nloghistorylines = 256\n```\n\nMinimum value is 64. Values below 64 are adjusted automatically.", .status = 0 },
{ .param = "serverip", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nBind service to specified IP address.\n\n**Example:**\n```ini\nserverip = 192.168.178.1\n```\n\n**Default:**\n```ini\nserverip = # OSCam listens to all IPs\n```", .status = 0 },
{ .param = "logfile", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nLogging target.\n\n**Format:**\n```ini\nlogfile = [filename][;syslog][;stdout]\n```\n\nYou can define a maximum of one filename (not more!) and additionally to log to stdout or syslog (you can also only log to stdout or syslog and omit the filename).\n\n**Opportunities:**\n```ini\nlogfile = /var/log/oscam.log # file or linux device (for example /dev/tty)\nlogfile = syslog # log to syslogd\nlogfile = stdout # showing the log on the console\n```\n\n**Example:**\n```ini\nlogfile = /etc/oscam/logs/oscam.log;stdout\n```\n\n**Default:**\n```ini\nlogfile = /var/log/oscam.log\n```\n\n**Format logfile:**\n```\nCAID&ident/provider/length:checksum\n```", .status = 0 },
{ .param = "initial_debuglevel", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nSet the debuglevel on startup.\n\n**Example:**\n```ini\ninitial_debuglevel = 8\n```\n\n**Default:**\n```ini\ninitial_debuglevel = 0\n```", .status = 0 },
{ .param = "sysloghost", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nIf set, remote syslog server will be activated. Messages will be sent to this IPv4 address. If not set, remote syslog server does not work.\n\n**Format:**\n```ini\nsysloghost = IP_address\n```\n\n**Example:**\n```ini\nsysloghost = 192.168.1.167\n```\n\n**Default:**\n```ini\nsysloghost =\n```", .status = 0 },
{ .param = "syslogport", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nIf set *sysloghost*, remote syslog server will be activated. Messages will be sent to this port. If not set, port 514 is used as default.\n\n**Example:**\n```ini\nsyslogport = 515\n```\n\n**Default:**\n```ini\nsyslogport = 514\n```", .status = 0 },
{ .param = "logduplicatelines", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n```ini\nlogduplicatelines = 0 # enable detection of duplicate lines in logfile (default)\nlogduplicatelines = 1 # disable detection of duplicate lines in log file\n```\n\n**Format:**\n```ini\nlogduplicatelines = 0|1\n```\n\n**Example:**\n```ini\nlogduplicatelines = 1\n```\n\n**Default:**\n```ini\nlogduplicatelines = 0\n```", .status = 0 },
{ .param = "pidfile", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nChange PID file name and path. If default = oscam.pid in /tmp\n\n**Format:**\n```ini\npidfile = path/filename\n```\n\n**Example:**\n```ini\npidfile = /var/run/oscam.pid\n```\n\n**Default:**\n```ini\npidfile =\n```", .status = 0 },
{ .param = "disableuserfile", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nEven if a logfile is switched on (see logfile), the userfile can be turned off!\n\n```ini\ndisableuserfile = 0 # userfile (default)\ndisableuserfile = 1 # no userfile\n```\n\n**Format:**\n```ini\ndisableuserfile = 0|1\n```\n\n**Example:**\n```ini\ndisableuserfile = 1\n```\n\n**Default:**\n```ini\ndisableuserfile = 0\n```", .status = 0 },
{ .param = "disablemail", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nDisable saving NDS Videoguard mail messages from provider.\n\n```ini\ndisablemail = 0 # enabled\ndisablemail = 1 # disabled (default)\n```\n\n**Format:**\n```ini\ndisablemail = 0|1\n```\n\n**Example:**\n```ini\ndisablemail = 0\n```\n\n**Default:**\n```ini\ndisablemail = 1\n```", .status = 0 },
{ .param = "usrfileflag", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nSetting the logging-mode.\n\n```ini\nusrfileflag = 0 # Only login and logout will be logged (default)\nusrfileflag = 1 # Each zapping from client will be logged\n```\n\n**Format:**\n```ini\nusrfileflag = 0|1\n```\n\n**Example:**\n```ini\nusrfileflag = 1\n```\n\n**Default:**\n```ini\nusrfileflag = 0\n```", .status = 0 },
{ .param = "clienttimeout", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nValue in milliseconds for client process to wait for key.\n\n**Examples:**\n```ini\nclienttimeout = 10000 # after 10 seconds timeout\nclienttimeout = 10 # timeout after 10 milliseconds! (see note below)\nclienttimeout = 8 # timeout after 8000 milliseconds (= 8 seconds), see note below\n```\n\n**Default:**\n```ini\nclienttimeout = 5000 # timeout after 5000 milliseconds (= 5 seconds)\n```\n\n⚠️ **Attention:** Values < 10 (so 1 to 9) are multiplied with 1000, so a \"5\" results in 5000 ms.", .status = 0 },
{ .param = "fallbacktimeout", .config = "conf", .section = "global", .text = "**🔵 Parameter depends on setup/program version**\n\nMaximum waiting time of the cardserver in milliseconds for primary reader, before fallback reader (if any!) are questioned.\n\n**Example:**\n```ini\nfallbacktimeout = 1500\n```\n\n**Default:**\n```ini\nfallbacktimeout = 2500\n```\n\n⚠️ **Attention:** The value must be greater than the value in \"serialreadertimeout\", otherwise the default is used.", .status = 0 },
{ .param = "fallbacktimeout_percaid", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nTime falling back to CAID restricted fallback reader.\n\n**Format:**\n```ini\nfallbacktimeout_percaid = milliseconds\n```\n\n**Default:**\n```ini\nfallbacktimeout_percaid = 2500\n```", .status = 0 },
{ .param = "clientmaxidle", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nValue for client process being idle before disconnect in seconds.\n\n**Example:**\n```ini\nclientmaxidle = 200 # Disconnect after 200 seconds\nclientmaxidle = 0 # idle disconnect disabled\n```\n\n**Default:**\n```ini\nclientmaxidle = 120 # Disconnect after 120 seconds\n```", .status = 0 },
{ .param = "bindwait", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nValue in seconds to wait for bind request to complete. If OSCam within this time cannot bind, it finishes with \"Bind Request failed\".\n\nCauses may include:\n- Double assignment of ports\n- \"Crashed\" OSCam has not released the ports again\n- OSCam was started several times\n\n**Example:**\n```ini\nbindwait = 20 # waiting time 20 seconds\n```\n\n**Default:**\n```ini\nbindwait = 120 # waiting time 120 seconds\n```", .status = 0 },
{ .param = "netprio", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nNetwork priority for QoS (Quality of Service). This parameter sets two values:\n\n- **IPP (IP Precedence)**: Applied to `SO_PRIORITY` for system-internal socket prioritization\n- **DSCP (Differentiated Services Code Point)**: Applied to `IP_TOS` / `IPV6_TCLASS` for the TOS field in the IP packet header\n\nThis allows routers and network equipment to prioritize OSCam traffic appropriately.\n\n**Format:**\n```ini\nnetprio = 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20\n```\n\n**Values:**\n\n- **0** (IPP 0, CS0): Best Effort (default)\n- **1** (IPP 1, CS1): Scavenger / Background\n- **2** (IPP 1, AF11): Assured Forwarding (Low Drop)\n- **3** (IPP 1, AF12): Assured Forwarding (Medium Drop)\n- **4** (IPP 1, AF13): Assured Forwarding (High Drop)\n- **5** (IPP 2, CS2): OAM (Operations/Administration/Management)\n- **6** (IPP 2, AF21): Assured Forwarding (Low Drop)\n- **7** (IPP 2, AF22): Assured Forwarding (Medium Drop)\n- **8** (IPP 2, AF23): Assured Forwarding (High Drop)\n- **9** (IPP 3, CS3): Broadcast Video\n- **10** (IPP 3, AF31): Assured Forwarding (Low Drop)\n- **11** (IPP 3, AF32): Assured Forwarding (Medium Drop)\n- **12** (IPP 3, AF33): Assured Forwarding (High Drop)\n- **13** (IPP 4, CS4): Real-Time Interactive\n- **14** (IPP 4, AF41): Assured Forwarding (Low Drop)\n- **15** (IPP 4, AF42): Assured Forwarding (Medium Drop)\n- **16** (IPP 4, AF43): Assured Forwarding (High Drop)\n- **17** (IPP 5, CS5): Signaling\n- **18** (IPP 5, EF): Expedited Forwarding (Voice/Video)\n- **19** (IPP 6, CS6): Network Control\n- **20** (IPP 7, CS7): Reserved (Highest Priority)\n\n**DSCP Classes Explained:**\n- **CS (Class Selector)**: Backward compatible with IP Precedence (CS0-CS7)\n- **AF (Assured Forwarding)**: AFxy where x=class (1-4), y=drop precedence (1=low, 2=medium, 3=high)\n- **EF (Expedited Forwarding)**: Low latency, low jitter - ideal for real-time traffic\n\n**Example:**\n```ini\nnetprio = 18 # EF - Expedited Forwarding, best for time-critical CW delivery\n```\n\n**Default:**\n```ini\nnetprio = 0 # CS0 - Best Effort, no special treatment\n```\n\n⚠️ **Note:** The effectiveness depends on your network equipment supporting and respecting DSCP markings. Many consumer routers ignore these values.", .status = 0 },
{ .param = "sleep", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nTime waiting for inactive users in minutes, can be overwritten per user in oscam.user.\n\n**Example:**\n```ini\nsleep = 5 # waiting time 5 minutes\n```\n\n**Default:**\n```ini\nsleep = # no waiting time\n```", .status = 0 },
{ .param = "unlockparental", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**Only Seca and Viaccess**\n\nUnlock parental mode option to disable PIN code request for adult movie. In order to work properly, this option may require that you define the card PIN code in your card reader configuration.\n\n**Example:**\n```ini\nunlockparental = 1 # parental lock mode disabled\n```\n\n**Default:**\n```ini\nunlockparental = 0 # parental lock mode enabled\n```", .status = 0 },
{ .param = "nice", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**System priority**\n\nOSCam requires almost no CPU-power. But if CPU-power is required, it should be available immediately. Values between 20 and -20 are possible. 20 = low, -20 = very high. If this parameter is commented out (#), this function is not called. Important for example for dbox2, if the error messages \"*relocation error:setpriority*\". See [Priority Scheduling](http://de.wikipedia.org/wiki/Prioritätsscheduling).\n\n**Example:**\n```ini\nnice = -1\n```\n\n**Default:**\n```ini\nnice = 99\n```", .status = 0 },
{ .param = "maxlogsize", .config = "conf", .section = "global", .text = "**🔴 Required parameter**\n\nMaximum size of logfiles in KBytes. This is especially important for servers with only a small amount of memory (dbox2). Therefore it is strongly recommended to determine carefully that size at such servers. Not infrequently a system \"bursts\" because the logfile uncontrolled large scale adopted!\n\n**Example:**\n```ini\nmaxlogsize = 20 # Logfile reaches to 20 KBytes\nmaxlogsize = 0 # Logfile unlimited\n```\n\n**Default:**\n```ini\nmaxlogsize = 10 # Logfile reaches to 10 KBytes\n```", .status = 0 },
{ .param = "waitforcards", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nWait for local SCs on startup before opening network ports.\n\n**Example:**\n```ini\nwaitforcards = 0 # don't wait\n```\n\n**Default:**\n```ini\nwaitforcards = 1 # wait\n```", .status = 0 },
{ .param = "waitforcards_extra_delay", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nAdditional delay in milliseconds after waiting for local SCs on startup before opening network ports.\n\n**Format:**\n```ini\nwaitforcards_extra_delay = milliseconds\n```\n\n**Default:**\n```ini\nwaitforcards_extra_delay = 500\n```", .status = 0 },
{ .param = "preferlocalcards", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nTry decoding on local cards first.\n\n**Example:**\n```ini\npreferlocalcards = 0 # local cards are used like remote reader\npreferlocalcards = 1 # prefer CacheEx sources\npreferlocalcards = 2 # prefer local cards\n```\n\n**Default:**\n```ini\npreferlocalcards = 1 # prefer CacheEx sources\n```", .status = 0 },
{ .param = "readerrestartseconds", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nWaiting time in seconds between restarts.\n\n**Example:**\n```ini\nreaderrestartseconds = 10 # waiting time 10 seconds\nreaderrestartseconds = 0 # no restarts!\n```\n\n**Default:**\n```ini\nreaderrestartseconds = 5 # waiting time 5 seconds\n```", .status = 0 },
{ .param = "dropdups", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nMode for duplicate client connections.\n\n```ini\ndropdups = 0 # mark client as duplicate, but don't disconnect them (default)\ndropdups = 1 # drop duplicate connections instead of marking as duplicate\n```\n\n**Format:**\n```ini\ndropdups = 0|1\n```\n\n**Example:**\n```ini\ndropdups = 1\n```\n\n**Default:**\n```ini\ndropdups = 0\n```", .status = 0 },
{ .param = "SIGHUP", .config = "conf", .section = "global", .text = "The following parameters control what OSCam reloads when it receives a SIGHUP signal. When enabled, sending SIGHUP to the OSCam process will reload the corresponding configuration without requiring a full restart.", .status = 0 },
{ .param = "reload_useraccounts", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nReload user accounts (oscam.user) on SIGHUP signal.\n\n**Format:**\n```ini\nreload_useraccounts = 0|1\n```\n\n**Example:**\n```ini\nreload_useraccounts = 1\n```\n\n**Default:**\n```ini\nreload_useraccounts = 0\n```", .status = 0 },
{ .param = "reload_readers", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nReload readers (oscam.server) on SIGHUP signal.\n\n**Format:**\n```ini\nreload_readers = 0|1\n```\n\n**Example:**\n```ini\nreload_readers = 1\n```\n\n**Default:**\n```ini\nreload_readers = 0\n```", .status = 0 },
{ .param = "reload_provid", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nReload provider IDs (oscam.provid) on SIGHUP signal.\n\n**Format:**\n```ini\nreload_provid = 0|1\n```\n\n**Example:**\n```ini\nreload_provid = 1\n```\n\n**Default:**\n```ini\nreload_provid = 0\n```", .status = 0 },
{ .param = "reload_services_ids", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nReload services IDs (oscam.srvid / oscam.srvid2) on SIGHUP signal.\n\n**Format:**\n```ini\nreload_services_ids = 0|1\n```\n\n**Example:**\n```ini\nreload_services_ids = 1\n```\n\n**Default:**\n```ini\nreload_services_ids = 0\n```", .status = 0 },
{ .param = "reload_tier_ids", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nReload tier IDs (oscam.tiers) on SIGHUP signal.\n\n**Format:**\n```ini\nreload_tier_ids = 0|1\n```\n\n**Example:**\n```ini\nreload_tier_ids = 1\n```\n\n**Default:**\n```ini\nreload_tier_ids = 0\n```", .status = 0 },
{ .param = "reload_fakecws", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nReload fake control words (oscam.fakecws) on SIGHUP signal.\n\n**Format:**\n```ini\nreload_fakecws = 0|1\n```\n\n**Example:**\n```ini\nreload_fakecws = 1\n```\n\n**Default:**\n```ini\nreload_fakecws = 0\n```", .status = 0 },
{ .param = "reload_ac_stat", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nReload anti-cascading statistics on SIGHUP signal.\n\n**Format:**\n```ini\nreload_ac_stat = 0|1\n```\n\n**Example:**\n```ini\nreload_ac_stat = 1\n```\n\n**Default:**\n```ini\nreload_ac_stat = 0\n```", .status = 0 },
{ .param = "reload_log", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nReopen log file on SIGHUP signal. Useful for log rotation.\n\n**Format:**\n```ini\nreload_log = 0|1\n```\n\n**Example:**\n```ini\nreload_log = 1\n```\n\n**Default:**\n```ini\nreload_log = 0\n```", .status = 0 },
{ .param = "block_same_ip", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nReject looping ECMs from clients to reader with the same IP address.\n\n```ini\nblock_same_ip = 0 # no reject\nblock_same_ip = 1 # reject looping ECMs (default)\n```\n\n**Format:**\n```ini\nblock_same_ip = 0|1\n```\n\n**Example:**\n```ini\nblock_same_ip = 0\n```\n\n**Default:**\n```ini\nblock_same_ip = 1\n```", .status = 0 },
{ .param = "block_same_name", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nReject looping ECMs from clients to reader with the same name.\n\n```ini\nblock_same_name = 0 # no reject\nblock_same_name = 1 # reject looping ECMs (default)\n```\n\n**Format:**\n```ini\nblock_same_name = 0|1\n```\n\n**Example:**\n```ini\nblock_same_name = 0\n```\n\n**Default:**\n```ini\nblock_same_name = 1\n```", .status = 0 },
{ .param = "usrfile", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nSet a name for userfile.\n\n**Format of the userfile:**\n```\ndate\ntime\nCWs per second\nusername\nIP address of client\nTCP/IP port\nCWs found\nCWs from cache\nCWs not found\nCWs ignored\nCWs timeout\nCWs tunneled\nlogin time in UNIX/POSIX format\nlogout time in UNIX/POSIX format\nprotocol\n```\n\n**Example:**\n```ini\nusrfile = userfile\n```\n\n**Default:**\n```ini\nusrfile = 0\n```", .status = 0 },
{ .param = "mailfile", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nDefine file saving NDS Videoguard mail messages from provider.\n\n**Default:**\n```ini\nmailfile = # none\n```", .status = 0 },
{ .param = "cwlogdir", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nA path for CW logging can be configured here. The path is relative to the work directory and must exist. Otherwise no logs are created and no errors are reported.\n\nCWs (control words) are the answers of the card which decrypts a certain channel for some seconds before the next CW is transmitted. The CW log file can be used for delayed decoding of this channel. This is also called offline decoding.\n\nOSCam creates a new `*.cwl` file for each channel and each day. The file name contains the date, service ID and service name, e.g., `110808_I000B_Sky_Cinema_+1.cwl` with these contents:\n\n```\n# OSCam cardserver v0.99.4 - http://streamboard.gmc.to:8001/oscam/wiki\n# control word log file for use with tsdec offline decrypter\n# DATE 2011-08-08, TIME 23:49:10, TZ CEST\n# CAID 0x1702, SID 0x000B, SERVICE \"Sky_Cinema_+1\"\n1 9E E3 BB 3C A4 C3 BE 25 # 23:49:10\n0 D0 24 B3 A7 95 82 3B 52 # 23:49:17\n1 A9 76 35 54 37 38 F3 62 # 23:49:23\n0 55 70 87 4C 22 26 C4 0C # 23:49:30\n1 F0 16 22 28 36 3A 03 73 # 23:49:38\n0 5D 83 44 24 8F C7 5D B3 # 23:49:44\n```\n\nAll CWs are logged if at least one user watches the channel. Please choose a path with enough space, since per day and channel some 10KB of data are created. A script that moves/deletes the log files regularly is recommended.\n\n**Example:**\n```ini\ncwlogdir = /var/log/\n```\n\n**Default:**\n```ini\ncwlogdir = # no path for cw-log, logging disabled\n```", .status = 0 },
{ .param = "emmlogdir", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nSetting a path for EMM-log. You can define with the \"saveemm-*\"-Parameters in oscam.server which EMMs should be logged.\n\n**Example:**\n```ini\nemmlogdir = /var/log/\n```\n\n**Default:**\n```ini\nemmlogdir = # the config folder will be used for emm logging\n```", .status = 0 },
{ .param = "lb_mode", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nLoadbalance mode.\n\n```ini\nlb_mode = 0 # loadbalance disabled, ECMs go to all readers (default)\nlb_mode = 1 # fastest reader first, after 5 ECMs the reader with the fastest\n # response time will be selected\nlb_mode = 2 # oldest reader first, reader with the longest no answer\nlb_mode = 3 # lowest usage level, the usage level will be calculated by the\n # sum of 5 ECMs response times, the higher a reader is busy,\n # the higher is usage level\nlb_mode = 10 # LB is switched off, but statistics are built\n```\n\n**Format:**\n```ini\nlb_mode = 0|1|2|3|10\n```\n\n**Example:**\n```ini\nlb_mode = 1\n```\n\n**Default:**\n```ini\nlb_mode = 0\n```", .status = 0 },
{ .param = "lb_save", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nSave autoloadbalance statistics (counts). To save CPU power a minimum count of 100 is recommended.\n\n**Example:**\n```ini\nlb_save = 100 # counts of ECMs after statistics are saved\n```\n\n**Default:**\n```ini\nlb_save = 0 # no save\n```", .status = 0 },
{ .param = "lb_nbest_readers", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nSet count of best readers for loadbalancing.\n\n**Example:**\n```ini\nlb_nbest_readers = 2 # requests always go to two readers\n```\n\n**Default:**\n```ini\nlb_nbest_readers = 1 # requests go to one reader\n```", .status = 0 },
{ .param = "lb_nfb_readers", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nSet count of fallback readers for loadbalancing.\n\n**Example:**\n```ini\nlb_nfb_readers = 2 # two fallback readers\n```\n\n**Default:**\n```ini\nlb_nfb_readers = 1 # one fallback reader\n```", .status = 0 },
{ .param = "lb_min_ecmcount", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nMinimal ECM count to evaluate loadbalancing values.\n\n**Example:**\n```ini\nlb_min_ecmcount = 2 # 2 counts\n```\n\n**Default:**\n```ini\nlb_min_ecmcount = 5 # 5 counts\n```", .status = 0 },
{ .param = "lb_max_ecmcount", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nMaximum ECM count before resetting loadbalancing values.\n\n**Example:**\n```ini\nlb_max_ecmcount = 200 # 200 counts\n```\n\n**Default:**\n```ini\nlb_max_ecmcount = 500 # 500 counts\n```", .status = 0 },
{ .param = "lb_reopen_seconds", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nTime in seconds between retrying failed readers/CAIDs/providers/services.\n\n**Example:**\n```ini\nlb_reopen_seconds = 500 # retry after 500 seconds\n```\n\n**Default:**\n```ini\nlb_reopen_seconds = 900 # retry after 900 seconds\n```", .status = 0 },
{ .param = "lb_reopen_invalid", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\n```ini\nlb_reopen_invalid = 0 # E_INVALID will be blocked until statistics has been cleaned\nlb_reopen_invalid = 1 # default\n```\n\n**Format:**\n```ini\nlb_reopen_invalid = 0|1\n```\n\n**Example:**\n```ini\nlb_reopen_invalid = 0\n```\n\n**Default:**\n```ini\nlb_reopen_invalid = 1\n```", .status = 0 },
{ .param = "lb_force_reopen_always", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nForce reopening immediately all failing readers if no matching reader was found.\n\n```ini\nlb_force_reopen_always = 0 # default\nlb_force_reopen_always = 1 # force reopening immediately\n```\n\n**Format:**\n```ini\nlb_force_reopen_always = 0|1\n```\n\n**Example:**\n```ini\nlb_force_reopen_always = 1\n```\n\n**Default:**\n```ini\nlb_force_reopen_always = 0\n```", .status = 0 },
{ .param = "lb_retrylimit", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nRetry next readers **only** if response time is higher than lb_retrylimit in milliseconds.\n\n**Example:**\n```ini\nlb_retrylimit = 500 # retry next reader only if response time is higher than 500 ms\n```\n\n**Default:**\n```ini\nlb_retrylimit = 800\n```", .status = 0 },
{ .param = "lb_stat_cleanup", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nHours after the loadbalancing statistics will be deleted.\n\n**Default:**\n```ini\nlb_stat_cleanup = 336\n```", .status = 0 },
{ .param = "lb_max_readers", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nRestrict the reader count to limit during learning.\n\n**Format:**\n```ini\nlb_max_readers = limit\n```\n\n```ini\nlb_max_readers = 0 # unlimited (default)\nlb_max_readers = x # restrict loadbalancer readers to limit x (number)\n```", .status = 0 },
{ .param = "lb_auto_betatunnel", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nEnable automatic Betacrypt tunneling for CAIDs 1801, 1833, 1834 and 1835 in loadbalancing mode.\n\n```ini\nlb_auto_betatunnel = 0 # disabled\nlb_auto_betatunnel = 1 # enabled (default)\n```\n\n**Format:**\n```ini\nlb_auto_betatunnel = 0|1\n```\n\n**Example:**\n```ini\nlb_auto_betatunnel = 0\n```\n\n**Default:**\n```ini\nlb_auto_betatunnel = 1\n```\n\n⚠️ **Attention:** Betacrypt definition in oscam.user with betatunnel will be preferred!", .status = 0 },
{ .param = "lb_auto_betatunnel_mode", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nSet mode for automatic Betacrypt tunneling.\n\n```ini\nlb_auto_betatunnel_mode = 0 # CAID 18XX tunneling to CAID 17X2 only (default)\nlb_auto_betatunnel_mode = 1 # CAID 18XX tunneling to CAID 17X2 and CAID 17X2\n # tunneling to CAID 18XX (CAID 1833/1801)\nlb_auto_betatunnel_mode = 2 # CAID 18XX tunneling to CAID 17X2 and CAID 17X2\n # tunneling to CAID 18XX (CAID 1833/1834)\nlb_auto_betatunnel_mode = 3 # CAID 18XX tunneling to CAID 17X2 and CAID 17X2\n # tunneling to CAID 18XX (CAID 1833/1835)\nlb_auto_betatunnel_mode = 4 # CAID 17X2 tunneling to CAID 18XX (CAID 1833/1801 only)\nlb_auto_betatunnel_mode = 5 # CAID 17X2 tunneling to CAID 18XX (CAID 1833/1834 only)\nlb_auto_betatunnel_mode = 6 # CAID 17X2 tunneling to CAID 18XX (CAID 1833/1835 only)\n```\n\n**Format:**\n```ini\nlb_auto_betatunnel_mode = 0|1|2|3|4|5|6\n```\n\n**Example:**\n```ini\nlb_auto_betatunnel_mode = 1\n```\n\n**Default:**\n```ini\nlb_auto_betatunnel_mode = 0\n```", .status = 0 },
{ .param = "lb_auto_betatunnel_prefer_beta", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nSet preference for automatic selection of Betacrypt/Nagravision.\n\n**Format:**\n```ini\nlb_auto_betatunnel_prefer_beta = number\n```\n\n```ini\nlb_auto_betatunnel_prefer_beta = 0 # disabled (default)\nlb_auto_betatunnel_prefer_beta = 1 # always Betacrypt\nlb_auto_betatunnel_prefer_beta = 105 # represents the middle\nlb_auto_betatunnel_prefer_beta = 200 # always Nagravision\n```", .status = 0 },
{ .param = "lb_savepath", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nFilename for saving loadbalancing statistics.\n\n**Default:**\n```ini\nlb_savepath = /tmp/.oscam/stat\n```", .status = 0 },
{ .param = "lb_retrylimits", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nLoadbalancing retry limit time per CAID in milliseconds, wildcard CAIDs with 2-digit CAIDs possible.\n\n**Format:**\n```ini\nlb_retrylimits = CAID1:time1[,CAID2:time2]...\n```\n\n**Example:**\n```ini\nlb_retrylimits = 12:0100,34:0200,5678:0300 # wildcard CAIDs 12xx and 34xx\n```\n\n**Default:** none", .status = 0 },
{ .param = "lb_nbest_percaid", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nSet count of best readers per CAIDs for loadbalancing, wildcard CAIDs with two-digit CAIDs possible.\n\n**Format:**\n```ini\nlb_nbest_percaid = CAID1:count[,CAID2:count]...\n```\n\n**Example:**\n```ini\nlb_nbest_percaid = 0100:4,0200:3,03:2,04:1 # wildcard CAIDs 03xx and 04xx\n```\n\n**Default:** none", .status = 0 },
{ .param = "lb_noproviderforcaid", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nIgnore provider information CAIDs to reduce statistic data, wildcard CAIDs with two-digit CAIDs possible.\n\n**Format:**\n```ini\nlb_noproviderforcaid = CAID1[,CAID2]...\n```\n\n**Example:**\n```ini\nlb_noproviderforcaid = 12,34,5678 # wildcard CAIDs 12xx and 34xx\n```\n\n**Default:** none", .status = 0 },
{ .param = "lb_auto_timeout", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nEnable automatic timeout based on load balancing statistics.\n\n```ini\nlb_auto_timeout = 0 # default\nlb_auto_timeout = 1 # enable automatic timeout\n```\n\n**Format:**\n```ini\nlb_auto_timeout = 0|1\n```\n\n**Example:**\n```ini\nlb_auto_timeout = 1\n```\n\n**Default:**\n```ini\nlb_auto_timeout = 0\n```", .status = 0 },
{ .param = "lb_auto_timeout_p", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nPercent added to average time as timeout time.\n\n**Format:**\n```ini\nlb_auto_timeout_p = percent\n```\n\n**Default:**\n```ini\nlb_auto_timeout_p = 30\n```", .status = 0 },
{ .param = "lb_auto_timeout_t", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nMinimal time added to average time as timeout time.\n\n**Format:**\n```ini\nlb_auto_timeout_t = milliseconds\n```\n\n**Default:**\n```ini\nlb_auto_timeout_t = 300\n```", .status = 0 },
{ .param = "double_check_caid", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nECM will be sent to two or more readers with the same SC and the CWs will be verified against each other for defined CAID or first two bytes of CAID. `lb_nbest_readers` must be set to 2 or higher.\n\n**Format:**\n```ini\ndouble_check_caid = [CAID1|first two digits of CAID1],[CAID2|first two digits of CAID2]...\n```\n\n**Default:** none", .status = 0 },
{ .param = "ecmfmt", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nDefine ECM log format.\n\n**Format:**\n```ini\necmfmt = format\n```\n\n**Possible variables:**\n```\nc = CAID\nd = PID\ne = CSP hash\ng = ID of origin gbox peer\nh = checksum\ni = Channel ID\nj = distance of gbox and CCcam hops\nl = length\no = ONID\np = provider ID\ns = service ID\nt = tier ID (this ID will be replaced with the tier-description from oscam.tiers if found)\nw = CW\ny = payload (short, 3 bytes)\nY = payload (long, 6 bytes)\n```\n\nUse a value as prefix to hide variable with this value, control characters will be escaped by \"\\\\\".\n\n**Example:**\n```ini\necmfmt = c&0p/i/d/s/l:h.e_w HOP:j # hide provider ID if 0\n```\n\n**Default:**\n```ini\necmfmt = c&p/i/s/l:h\n```", .status = 0 },
{ .param = "resolvegethostbyname", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nSet mode for DNS resolving. These are different libc calls to resolve DNS names and some older systems have problems with the newer implementation *getaddrinfo* (getaddrinfo is also threadsafe whereas *gethostbyname* is not and thus it has some locks around) or have stripped them from their images (dbox2 was such a candidate) even though it is available at compile time.\n\n```ini\nresolvegethostbyname = 0 # getaddrinfo (default)\nresolvegethostbyname = 1 # gethostbyname\n```\n\n**Format:**\n```ini\nresolvegethostbyname = 0|1\n```\n\n**Example:**\n```ini\nresolvegethostbyname = 1\n```\n\n**Default:**\n```ini\nresolvegethostbyname = 0\n```", .status = 0 },
{ .param = "failbantime", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nTime for IP based blocking for clients with an invalid login attempt in minutes.\n\n**Example:**\n```ini\nfailbantime = 5 # IP will be blocked for 5 minutes\n # New logins are denied\n # No clientthread will be created\n```\n\n**Default:**\n```ini\nfailbantime = 0 # failban off (default)\n```", .status = 0 },
{ .param = "failbancount", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nNumber of allowed failed attempts with incorrect data.\n\n```ini\nfailbancount = 0 # IP is blocked on the first try with incorrect data (default)\nfailbancount = n # number of allowed attempts\n```\n\nIf within **failbantime** more than in **failbancount** allowed trials are registered, the IP for the remainder of failbantime is locked. After a period of failbantime, full failbancount is available again. Failbancount is thus a relaxation of rules!", .status = 0 },
{ .param = "suppresscmd08", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nTell camd35 [cs3.57x]-clients not to request again for rejected CAID, service ID and provider ID combination.\n\n```ini\nsuppresscmd08 = 0 # enabled (default)\nsuppresscmd08 = 1 # disabled\n```\n\n**Format:**\n```ini\nsuppresscmd08 = 0|1\n```\n\n**Example:**\n```ini\nsuppresscmd08 = 1\n```\n\n**Default:**\n```ini\nsuppresscmd08 = 0\n```\n\nCan be overwritten in oscam.user!\n\nMore information: [Streamboard-Thread](http://www.streamboard.tv/wbb2/thread.php?threadid=27459)", .status = 0 },
{ .param = "getblockemmauprovid", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nGet provider ID from CAID for blocking EMM AU updates.\n\n**Format:**\n```ini\ngetblockemmauprovid = 0|1\n```\n\n**Example:**\n```ini\ngetblockemmauprovid = 1\n```\n\n**Default:**\n```ini\ngetblockemmauprovid = 0\n```", .status = 0 },
{ .param = "double_check", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nECM will be sent to two or more readers with the same SC and the CWs will be verified against each other. `lb_nbest_readers` must be set to 2 or higher.\n\n**Example:**\n```ini\ndouble_check = 1 # on\n```\n\n**Default:**\n```ini\ndouble_check = 0 # off\n```", .status = 0 },
{ .param = "disablecrccws", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nSkip CW checksum test globally. Some providers send CWs that don't pass the checksum test but are still valid.\n\n**Format:**\n```ini\ndisablecrccws = 0|1\n```\n\n**Example:**\n```ini\ndisablecrccws = 1\n```\n\n**Default:**\n```ini\ndisablecrccws = 0\n```", .status = 0 },
{ .param = "disablecrccws_only_for", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\nSkip CW checksum test only for specific CAIDs/providers/services. Use this for selective disabling instead of the global `disablecrccws` option.\n\n**Format:**\n```ini\ndisablecrccws_only_for = CAID1[:ident1][,CAID2[:ident2]]...\n```\n\n**Example:**\n```ini\ndisablecrccws_only_for = 0100:000030,0500\n```\n\n**Default:** none", .status = 0 },
{ .param = "cacheex_srcname_webif", .config = "conf", .section = "global", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nDisplay CacheEx source name in WebIF status.\n\n**Format:**\n```ini\ncacheex_srcname_webif = 0|1\n```\n\n**Example:**\n```ini\ncacheex_srcname_webif = 1\n```\n\n**Default:**\n```ini\ncacheex_srcname_webif = 0\n```", .status = 0 },
{ .param = "CW", .config = "conf", .section = "cache", .text = "Cache of CWs which are saved to detect/drop old CWs arriving via CacheEx.\nTo enable this feature, you have to define `cw_cache_size` or `cw_cache_memory` to set the cache-size and `cw_cache_settings` to define for what CWs which action is taken.\nIf `cw_cache_size` or `cw_cache_memory` is defined, the default is that incoming known CWs older than 15 seconds are dropped, because they are useless.", .status = 0 },
{ .param = "ECM", .config = "conf", .section = "cache", .text = "Cache of ECMs which are saved to detect/drop old ECMs.\nIf you are facing problems with getting old ECMs, with this feature you are able to drop known ECMs. To enable this feature, you have to define `ecm_cache_size` or `ecm_cache_memory` to set the cache-size.", .status = 0 },
{ .param = "delay", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\nValue to delay cached requests.\n\n**Example:**\n```ini\ndelay = 300\n```\n\n**Default:**\n```ini\ndelay = 0\n```", .status = 0 },
{ .param = "max_time", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\nMaximum time CWs resist in cache after 1st client request (seconds). The time must be 2 seconds higher than the parameter clienttimeout.\n\n**Format:**\n```ini\nmax_time = seconds\n```\n\n**Default:**\n```ini\nmax_time = 15\n```", .status = 0 },
{ .param = "cw_cache_size", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nCount of max. CWs for cw_cache.\n\n**Default:**\n```ini\ncw_cache_size = 0\n```", .status = 0 },
{ .param = "cw_cache_memory", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nSize (in MB) of the cw_cache.\n\n**Default:**\n```ini\ncw_cache_memory = 0\n```", .status = 0 },
{ .param = "cw_cache_settings", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\n**Format:**\n```ini\ncw_cache_settings = caid[&mask][@provid][$servid]:mode:timediff_old_cw[,n]\n```\n\n**Mode:**\n- `1` = just write logs @ log-level 8192\n- `2` = drop CWs which match this rule & write logs @ log-level 8192\n\n**timediff_old_cw:**\n- `time` = time in milliseconds after a known CW is detected/dropped\n\n**Example:**\n```ini\ncw_cache_settings = 0:2:1500,BEEF@012345:2:620,1337:1:170\n```\n\n- For all CWs not matching any other rule → drop if the CW is known for more than 1500ms\n- Drop CWs of caid BEEF with provid 012345, if they are known for more than 620ms\n- Log CWs of caid 1337 with all provids, if they are known for more than 170ms\n\n**Default:**\n```ini\ncw_cache_settings = # disabled\n```", .status = 0 },
{ .param = "ecm_cache_size", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nCount of max. ECMs for ecm_cache.\n\n**Default:**\n```ini\necm_cache_size = 0\n```", .status = 0 },
{ .param = "ecm_cache_memory", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nSize (in MB) of the ecm_cache.\n\n**Default:**\n```ini\necm_cache_memory = 0\n```", .status = 0 },
{ .param = "ecm_cache_droptime", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nTime in seconds after a known ECM is dropped with return-code E_INVALID.\n\n**Default:**\n```ini\necm_cache_droptime = 0\n```", .status = 0 },
{ .param = "max_hit_time", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nMaximum time for cache exchange hits resists in cache for evaluating wait_time (in seconds).\n\n**Default:**\n```ini\nmax_hit_time = 15\n```", .status = 0 },
{ .param = "wait_time", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nWait time for cache exchange (mode 2 & 3 only!) and Cardserver proxy before sending ECM to reader or proxy.\n\n**Format:**\n```ini\nwait_time = milliseconds\n```\n\n**Example:**\n```ini\nwait_time = 0:50:250,0200@00009X:50:150:950,0500@000001:150:1602&ffdf:1200\n```\n\n**Default:**\n```ini\nwait_time = # none\n```", .status = 0 },
{ .param = "cacheex_mode1_delay", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nDelay in milliseconds for asking cache exchange mode 1 readers.\n\n**Format:**\n```ini\ncacheex_mode1_delay = CAID1:time[,CAID2:time]...\n```\n\n**Default:** none", .status = 0 },
{ .param = "cacheexenablestats", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nEnable statistics for cache exchange mode.\n\n```ini\ncacheexenablestats = 0 # disabled (default)\ncacheexenablestats = 1 # enable statistics\n```\n\n**Format:**\n```ini\ncacheexenablestats = 0|1\n```\n\n**Example:**\n```ini\ncacheexenablestats = 1\n```\n\n**Default:**\n```ini\ncacheexenablestats = 0\n```\n\n⚠️ **Warning:** Please consider memory consumption!", .status = 0 },
{ .param = "cacheex_dropdiffs", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nDrop incoming not-localgenerated-flagged CWs which differ from the first CW.\n\n```ini\ncacheex_dropdiffs = 0 # default\ncacheex_dropdiffs = 1 # drop different CWs\n```\n\n**Format:**\n```ini\ncacheex_dropdiffs = 0|1\n```\n\n**Example:**\n```ini\ncacheex_dropdiffs = 1\n```\n\n**Default:**\n```ini\ncacheex_dropdiffs = 0\n```", .status = 0 },
{ .param = "cacheex_push_lg_groups", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nPush all lg-flagged CWs to this/these group/s, without checking the groupmembership of the peer.\n\n**Format:**\n```ini\ncacheex_push_lg_groups = 1[,n]\n```\n\n**Default:**\n```ini\ncacheex_push_lg_groups = # none\n```", .status = 0 },
{ .param = "cacheex_lg_only_remote_settings", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nPossibility to deny cacheex-receiver/client (cx2: user / cx3: reader) to overwrite the following settings @ cacheex-sending-instance:\n- `cacheex_localgenerated_only`\n- `cacheex_lg_only_tab`\n\nIt makes sense if you want to force your local settings. If the user/reader isn't allowed to overwrite your values:\n- It is still possible for the cacheex-receiver to set `cacheex_localgenerated_only=1`, if the user/reader defines `cacheex_localgenerated_only_in=1`; but it is only @ cacheex-sending-instance possible to disable it\n- It is still possible for the cacheex-receiver to add `cacheex_lg_only_tab`, if the user/reader defines `cacheex_lg_only_in_tab=1234,1337`; but it is only merged to the sender-instance `cacheex_lg_only_tab` values\n\nIf `cacheex_lg_only_remote_settings` @oscam.conf is enabled, the user/reader-settings are ignored. If `cacheex_lg_only_remote_settings` @oscam.conf is disabled, the user/reader-settings are used.\n\n```ini\ncacheex_lg_only_remote_settings = 0 # default (opt-out)\ncacheex_lg_only_remote_settings = 1\n```\n\n**Format:**\n```ini\ncacheex_lg_only_remote_settings = 0|1\n```\n\n**Example:**\n```ini\ncacheex_lg_only_remote_settings = 1\n```\n\n**Default:**\n```ini\ncacheex_lg_only_remote_settings = 0\n```", .status = 0 },
{ .param = "cacheex_localgenerated_only", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nForward only CWs which are flagged as localgenerated. Here in oscam.conf, the default value is set; user/reader-settings are prioritized.\n\n```ini\ncacheex_localgenerated_only = 0 # default (opt-in)\ncacheex_localgenerated_only = 1\n```\n\n**Format:**\n```ini\ncacheex_localgenerated_only = 0|1\n```\n\n**Example:**\n```ini\ncacheex_localgenerated_only = 1\n```\n\n**Default:**\n```ini\ncacheex_localgenerated_only = 0\n```", .status = 0 },
{ .param = "cacheex_localgenerated_only_caid", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nCAID table for localgenerated-only filter. Forward only locally generated CWs for these CAIDs. Deprecated: use `cacheex_lg_only_tab` instead.\n\n**Format:**\n```ini\ncacheex_localgenerated_only_caid = CAID1[,CAID2]...\n```\n\n**Example:**\n```ini\ncacheex_localgenerated_only_caid = 0100,0500,1702\n```\n\n**Default:**\n```ini\ncacheex_localgenerated_only_caid =\n```", .status = 0 },
{ .param = "cacheex_lg_only_tab", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nForward only CWs which are lg-flagged for these list of caid/provid(s). Here in oscam.conf, the default value is set; user/reader-settings are prioritized.\n\nIf provid `FFFFFE` is set, all provids for this caid are valid!\n\n**Format:**\n```ini\ncacheex_lg_only_tab = caid1:provid1[,provid2];caid2:provid1;\n```", .status = 0 },
{ .param = "cacheex_lg_only_in_aio_only", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nUse drop lg-only settings (`cacheex_localgenerated_only_in` & `cacheex_lg_only_in_tab`) only if peer is detected as cx-aio-patched or svn >= 11588. Here in oscam.conf, the default value is set; user/reader-settings are prioritized.\n\n```ini\ncacheex_lg_only_in_aio_only = 0 # default (opt-in)\ncacheex_lg_only_in_aio_only = 1\n```\n\n**Format:**\n```ini\ncacheex_lg_only_in_aio_only = 0|1\n```\n\n**Example:**\n```ini\ncacheex_lg_only_in_aio_only = 1\n```\n\n**Default:**\n```ini\ncacheex_lg_only_in_aio_only = 0\n```", .status = 0 },
{ .param = "cacheex_localgenerated_only_in", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nAccept only CWs which are flagged as localgenerated for incoming CacheEx traffic. This is the global enable/disable switch for the incoming localgenerated-only filter. Works in conjunction with `cacheex_localgenerated_only_in_caid` (deprecated) or `cacheex_lg_only_in_tab`. Here in oscam.conf, the default value is set; user/reader-settings are prioritized.\n\n```ini\ncacheex_localgenerated_only_in = 0 # accept all CWs (default)\ncacheex_localgenerated_only_in = 1 # accept only lg-flagged CWs\n```\n\n**Format:**\n```ini\ncacheex_localgenerated_only_in = 0|1\n```\n\n**Example:**\n```ini\ncacheex_localgenerated_only_in = 1\n```\n\n**Default:**\n```ini\ncacheex_localgenerated_only_in = 0\n```", .status = 0 },
{ .param = "cacheex_localgenerated_only_in_caid", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nCAID table for incoming localgenerated-only filter. Accept only locally generated CWs for these CAIDs. Deprecated: use `cacheex_lg_only_in_tab` instead.\n\n**Format:**\n```ini\ncacheex_localgenerated_only_in_caid = CAID1[,CAID2]...\n```\n\n**Example:**\n```ini\ncacheex_localgenerated_only_in_caid = 0100,0500,1702\n```\n\n**Default:**\n```ini\ncacheex_localgenerated_only_in_caid =\n```", .status = 0 },
{ .param = "cacheex_lg_only_in_tab", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nAllow incoming CWs only if they are lg-flagged for these list of caid/provid(s). Here in oscam.conf, the default value is set; user/reader-settings are prioritized.\n\nIf provid `FFFFFE` is set, all provids for this caid are valid!\n\n**Format:**\n```ini\ncacheex_lg_only_in_tab = caid1:provid1[,provid2];caid2:provid1;\n```", .status = 0 },
{ .param = "cacheex_ecm_filter", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nSet a global cacheex_ecm_filter. Here in oscam.conf, the default value is set; user/reader-settings are prioritized.\n\n**Format:**\n```ini\ncacheex_ecm_filter = [caid][&mask][@provid][$servid],n\n```", .status = 0 },
{ .param = "cacheex_ecm_filter_aio", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nSet a global cacheex_ecm_filter which is used if peer is detected as cx-aio-patched or svn >= 11588. The default limit of 15/30 (camd3/cccam) filters is obsolete.\n\nHere in oscam.conf, the default value is set; user/reader-settings (cacheex_ecm_filter) are prioritized.\n\n**Format:**\n```ini\ncacheex_ecm_filter_aio = [caid][&mask][@provid][$servid],n\n```", .status = 0 },
{ .param = "csp_port", .config = "conf", .section = "cache", .text = "**🔴 Required parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nThis is a UDP (**not TCP**) listen port for incoming traffic from CSP nodes.\n\n**Example:**\n```ini\ncsp_port = 12345\n```\n\n**Default:**\n```ini\ncsp_port = # none\n```", .status = 0 },
{ .param = "csp_serverip", .config = "conf", .section = "cache", .text = "**🔴 Required parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nThis is the local bind IP of csp_port.\n\n**Example:**\n```ini\ncsp_serverip = 192.168.1.1\n```\n\n**Default:**\n```ini\ncsp_serverip = # none\n```", .status = 0 },
{ .param = "csp_ecm_filter", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\n**Format:**\n```ini\ncsp_ecm_filter = [caid][&mask][@provid][$servid]\n```", .status = 0 },
{ .param = "csp_allow_request", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\n```ini\ncsp_allow_request = 0\ncsp_allow_request = 1 # default\n```\n\n**Format:**\n```ini\ncsp_allow_request = 0|1\n```\n\n**Example:**\n```ini\ncsp_allow_request = 0\n```\n\n**Default:**\n```ini\ncsp_allow_request = 1\n```", .status = 0 },
{ .param = "csp_allow_reforward", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nAllow reforwarding of CacheEx CWs via CSP (Cardservproxy protocol).\n\n**Format:**\n```ini\ncsp_allow_reforward = 0|1\n```\n\n**Example:**\n```ini\ncsp_allow_reforward = 1\n```\n\n**Default:**\n```ini\ncsp_allow_reforward = 0\n```", .status = 0 },
{ .param = "cacheex_cw_check", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\n**Format:**\n```ini\ncacheex_cw_check = caid[&mask][@provid][$servid]:mode:counter[,n]\n```\n\n**Mode:**\n\nSpecify behaviour for counter parameter:\n- `0` = when wait_time expires, serve highest counter's CW got anyway, even if no counter reached (default)\n- `1` = never serve CW (coming from cacheex) stored in cache if its counter not reaches counter. When wait_time expires, requests will go to normal readers! Only when a CW reaches counter, it can be served to clients.\n\n**Counter:**\n\nSet minimum CW counter to allow CW is used.\n\n**Default:** `1` (use default behaviour: use CW with highest counter when cache is checked)", .status = 0 },
{ .param = "wait_until_ctimeout", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nAnswer when cache exchange timeout expires, if no normal readers are available for sending ECMs.\n\n```ini\nwait_until_ctimeout = 0 # immediately send not found to client (default)\nwait_until_ctimeout = 1 # wait for cache exchange answer until client timeout expires\n```\n\n**Format:**\n```ini\nwait_until_ctimeout = 0|1\n```\n\n**Example:**\n```ini\nwait_until_ctimeout = 1\n```\n\n**Default:**\n```ini\nwait_until_ctimeout = 0\n```", .status = 0 },
{ .param = "csp_block_fakecws", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nBlock fake CWs received via CSP. Fake CWs are control words that match patterns defined in oscam.fakecws.\n\n**Format:**\n```ini\ncsp_block_fakecws = 0|1\n```\n\n**Example:**\n```ini\ncsp_block_fakecws = 1\n```\n\n**Default:**\n```ini\ncsp_block_fakecws = 0\n```", .status = 0 },
{ .param = "cacheex_nopushafter", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nDon't forward CWs from local/proxy-reader via CacheEx, if the defined time_in_ms for the CAID is reached. Here in oscam.conf this setting is for evaluating the response-time for local/proxy-readers and is used for CacheEx2-reader/CacheEx3-user as default, when no reader/user cacheex_nopushafter is set.\n\n**Format:**\n```ini\ncacheex_nopushafter = CAID:time_in_ms[,n]\n```", .status = 0 },
{ .param = "waittime_block_start", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nNumber of (dyn)wait_time timeouts to start blocking the use of (dyn)wait_time for this service (caid:provid:srvid).\n\n**Default:**\n```ini\nwaittime_block_start = 0\n```", .status = 0 },
{ .param = "waittime_block_time", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nSeconds the (dyn)wait_time isn't used and ECMs are forwarded to the reader/s.\n\n**Default:**\n```ini\nwaittime_block_time = 0\n```", .status = 0 },
{ .param = "cwcycle_check_enable", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CW_CYCLE_CHECK` compilation flag)**\n\nEnable CW cycle check.\n\n```ini\ncwcycle_check_enable = 0 # disable (default)\ncwcycle_check_enable = 1 # enable\n```\n\n**Format:**\n```ini\ncwcycle_check_enable = 0|1\n```\n\n**Example:**\n```ini\ncwcycle_check_enable = 1\n```\n\n**Default:**\n```ini\ncwcycle_check_enable = 0\n```", .status = 0 },
{ .param = "cwcycle_check_caid", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CW_CYCLE_CHECK` compilation flag)**\n\n⚠️ **Attention: not for all NDS SCs!**\n\nCAID enabled for CW cycle check.\n\n**Format:**\n```ini\ncwcycle_check_caid = CAID[,CAID]...\n```\n\n**Default:** none", .status = 0 },
{ .param = "cwcycle_maxlist", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CW_CYCLE_CHECK` compilation flag)**\n\nMaximum CW cycle list entries.\n\n**Format:**\n```ini\ncwcycle_maxlist = count\n```\n\n**Default:**\n```ini\ncwcycle_maxlist = 500 # maximum = 4000\n```", .status = 0 },
{ .param = "cwcycle_keeptime", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CW_CYCLE_CHECK` compilation flag)**\n\nMinimum time a learned cycletime resists in memory (minutes).\n\n**Default:**\n```ini\ncwcycle_keeptime = 0 # maximum = 15\n```", .status = 0 },
{ .param = "cwcycle_onbad", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CW_CYCLE_CHECK` compilation flag)**\n\n```ini\ncwcycle_onbad = 0 # log bad CW cycle only\ncwcycle_onbad = 1 # drop bad CW cycle (default)\n```\n\n**Format:**\n```ini\ncwcycle_onbad = 0|1\n```\n\n**Example:**\n```ini\ncwcycle_onbad = 0\n```\n\n**Default:**\n```ini\ncwcycle_onbad = 1\n```", .status = 0 },
{ .param = "cwcycle_dropold", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CW_CYCLE_CHECK` compilation flag)**\n\n```ini\ncwcycle_dropold = 0 # no drop (default)\ncwcycle_dropold = 1 # drop old CW cycle\n```\n\n**Format:**\n```ini\ncwcycle_dropold = 0|1\n```\n\n**Example:**\n```ini\ncwcycle_dropold = 1\n```\n\n**Default:**\n```ini\ncwcycle_dropold = 0\n```", .status = 0 },
{ .param = "cwcycle_sensitive", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CW_CYCLE_CHECK` compilation flag)**\n\n```ini\ncwcycle_sensitive = 0 # disabled (default)\ncwcycle_sensitive = 2 # 2 (or more) same bytes and drop new CW\ncwcycle_sensitive = 3 # 3 (or more) same bytes and drop new CW\ncwcycle_sensitive = 4 # 4 (or more) same bytes and drop new CW\n```\n\n**Format:**\n```ini\ncwcycle_sensitive = 0|2|3|4\n```\n\n**Example:**\n```ini\ncwcycle_sensitive = 3\n```\n\n**Default:**\n```ini\ncwcycle_sensitive = 0\n```", .status = 0 },
{ .param = "cwcycle_allowbadfromffb", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CW_CYCLE_CHECK` compilation flag)**\n\nAllow bad cycles from a fixed fallback reader.\n\n```ini\ncwcycle_allowbadfromffb = 0 # default\ncwcycle_allowbadfromffb = 1 # allow bad cycles from fixed fallback reader\n```\n\n**Format:**\n```ini\ncwcycle_allowbadfromffb = 0|1\n```\n\n**Example:**\n```ini\ncwcycle_allowbadfromffb = 1\n```\n\n**Default:**\n```ini\ncwcycle_allowbadfromffb = 0\n```", .status = 0 },
{ .param = "cwcycle_usecwcfromce", .config = "conf", .section = "cache", .text = "**🟢 Optional parameter**\n\n**(requires `CW_CYCLE_CHECK` compilation flag)**\n\nUse CW info from cache exchange.\n\n```ini\ncwcycle_usecwcfromce = 0 # default\ncwcycle_usecwcfromce = 1 # use CW info from cache exchange\n```\n\n**Format:**\n```ini\ncwcycle_usecwcfromce = 0|1\n```\n\n**Example:**\n```ini\ncwcycle_usecwcfromce = 1\n```\n\n**Default:**\n```ini\ncwcycle_usecwcfromce = 0\n```", .status = 0 },
{ .param = "port", .config = "conf", .section = "newcamd", .text = "**🔴 Required parameter**\n\n**(requires `MODULE_NEWCAMD` compilation flag)**\n\nTCP port/DES key/CAID/ident definitions. Each CAID requires a separate port. If you don't specify a DES key for a port, the default DES Key will be used!\n\n**Format:**\n```ini\nport = port[{DES key}]@CAID[:ident][,ident]...[;port[{DES key}]@CAID[:ident][,ident]...]...\n```\n\n**Example:**\n```ini\nport = 15000@1234:000000\n# CAID 1234 connected with port 15000\n\nport = 15000@1234:000000;15001@5678:000000\n# CAID 1234 connected with port 15000, CAID 5678 with port 15001\n```", .status = 0 },
{ .param = "serverip", .config = "conf", .section = "newcamd", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_NEWCAMD` compilation flag)**\n\nBind service to specified IP address.\n\n**Example:**\n```ini\nserverip = 192.168.178.1\n```\n\n**Default:**\n```ini\nserverip =\n```", .status = 0 },
{ .param = "key", .config = "conf", .section = "newcamd", .text = "**🔴 Required parameter**\n\n**(requires `MODULE_NEWCAMD` compilation flag)**\n\nDES key - Default key for newcamd client encryption.\n\n**Example:**\n```ini\nkey = 0102030405060708091011121314\n```", .status = 0 },
{ .param = "keepalive", .config = "conf", .section = "newcamd", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_NEWCAMD` compilation flag)**\n\nEnable keepalive.\n\n```ini\nkeepalive = 0 # disabled (default)\nkeepalive = 1 # enabled\n```\n\n**Format:**\n```ini\nkeepalive = 0|1\n```\n\n**Example:**\n```ini\nkeepalive = 1\n```\n\n**Default:**\n```ini\nkeepalive = 0\n```", .status = 0 },
{ .param = "mgclient", .config = "conf", .section = "newcamd", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_NEWCAMD` compilation flag)**\n\nEnable mgcamd extended newcamd protocol, allowing for a single connection to work with multiple providers.\n\n```ini\nmgclient = 0 # disabled (default)\nmgclient = 1 # enabled\n```\n\n**Format:**\n```ini\nmgclient = 0|1\n```\n\n**Example:**\n```ini\nmgclient = 1\n```\n\n**Default:**\n```ini\nmgclient = 0\n```", .status = 0 },
{ .param = "port", .config = "conf", .section = "cccam", .text = "**🔴 Required parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nTCP/IP-Ports for CCcam clients, enables CCcam protocol!\n\n**Format:**\n```ini\nport = 0|port[,port...]\n```\n\n**Example:**\n```ini\nport = 12000\nport = 12000,12001\nport = 0 # CCcam protocol disabled (default)\n```", .status = 0 },
{ .param = "serverip", .config = "conf", .section = "cccam", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nBind service to specified IP address.\n\n**Example:**\n```ini\nserverip = 192.168.178.1\n```\n\n**Default:**\n```ini\nserverip =\n```", .status = 0 },
{ .param = "nodeid", .config = "conf", .section = "cccam", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nSet CCcam node ID in hex.\n\n**Format:**\n```ini\nnodeid = ID\n```\n\n**Example:**\n```ini\nnodeid = 0a0b0c0d0e0f1011\n```\n\n**Default:** none", .status = 0 },
{ .param = "version", .config = "conf", .section = "cccam", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nDefine CCcam version, minimum CCcam version 2.0.11, used with original CCcam only.\n\n**Format:**\n```ini\nversion = <main version>,<version>,<sub version>\n```\n\n**Example:**\n```ini\nversion = 2.0.11\n```\n\n**Default:** none", .status = 0 },
{ .param = "reshare", .config = "conf", .section = "cccam", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nReshare level for CCcam clients.\n\n**Format:**\n```ini\nreshare = -1 # no resharing\nreshare = 0 # resharing for direct peer only\nreshare = 1 # resharing for direct peer and next level\nreshare = x # resharing for direct peer and next x level (x for number of level)\nreshare = 10 # default\n```\n\n**Example:**\n```ini\nreshare = 1\n```\n\n**Default:**\n```ini\nreshare = 10\n```\n\nReshare could be defined in 2 ways:\n- reader (`cccreshare`)\n- user-account (`cccreshare`)\n\nA card's reshare value is set to the smallest value of the 2 parameters!", .status = 0 },
{ .param = "reshare_mode", .config = "conf", .section = "cccam", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nCCcam reshare mode.\n\n**Format:**\n```ini\nreshare_mode = 0 # reader reshares only received SCs for CCcam readers,\n # defined filters/CAIDs/idents on other readers (default)\nreshare_mode = 1 # reader reshares received SCs (like=0) and defined services\nreshare_mode = 2 # reader reshares only defined reader services as virtual SCs\nreshare_mode = 3 # reader reshares only defined user services as virtual SCs\nreshare_mode = 4 # reader reshares only received cards\n```\n\n**Example:**\n```ini\nreshare_mode = 1\n```\n\n**Default:**\n```ini\nreshare_mode = 0\n```\n\nEvery server is shared as hop=0 and with defined reshare values.\n\nService reshare only works if positive services defined: no service - no reshare!", .status = 0 },
{ .param = "ignorereshare", .config = "conf", .section = "cccam", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nCCcam reshare setting.\n\n```ini\nignorereshare = 0 # use reshare setting of server (default)\nignorereshare = 1 # use reshare setting of reader or user\n```\n\n**Format:**\n```ini\nignorereshare = 0|1\n```\n\n**Example:**\n```ini\nignorereshare = 1\n```\n\n**Default:**\n```ini\nignorereshare = 0\n```", .status = 0 },
{ .param = "forward_origin_card", .config = "conf", .section = "cccam", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nForward ECM request to reader holding this card, loadbalancer, fallback and caching will be disabled.\n\n```ini\nforward_origin_card = 0 # default\nforward_origin_card = 1 # forward ECM request to reader holding this card\n```\n\n**Format:**\n```ini\nforward_origin_card = 0|1\n```\n\n**Example:**\n```ini\nforward_origin_card = 1\n```\n\n**Default:**\n```ini\nforward_origin_card = 0\n```", .status = 0 },
{ .param = "stealth", .config = "conf", .section = "cccam", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nBehaviour like the original CCcam: no activate partner detection and extended OSCam-CCcam protocol, prevent other OSCam to detect the server as OSCam server.\n\n```ini\nstealth = 0 # stealth disabled (default)\nstealth = 1 # stealth enabled\n```\n\n**Format:**\n```ini\nstealth = 0|1\n```\n\n**Example:**\n```ini\nstealth = 1\n```\n\n**Default:**\n```ini\nstealth = 0\n```", .status = 0 },
{ .param = "updateinterval", .config = "conf", .section = "cccam", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nInterval to provide share list update to CCcam clients in seconds.\n\n**Format:**\n```ini\nupdateinterval = 0 # update based on server updates, values <= 10 are invalid and will be set to 30\nupdateinterval = 240 # default\n```\n\n**Example:**\n```ini\nupdateinterval = 120\n```\n\n**Default:**\n```ini\nupdateinterval = 240\n```", .status = 0 },
{ .param = "minimizecards", .config = "conf", .section = "cccam", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nMode how to provide CCcam servers to CCcam clients.\n\n```ini\nminimizecards = 0 # no aggregation, remove duplicates only (default)\nminimizecards = 1 # based on minimum hop: two SCs with different hops are summarized,\n # new SCs get a smaller hop\n```\n\n**Format:**\n```ini\nminimizecards = 0|1\n```\n\n**Example:**\n```ini\nminimizecards = 1\n```\n\n**Default:**\n```ini\nminimizecards = 0\n```", .status = 0 },
{ .param = "keepconnected", .config = "conf", .section = "cccam", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nSet CCcam keepalive mode.\n\n```ini\nkeepconnected = 0 # disconnect client when max idle time is reached\nkeepconnected = 1 # keep client connected (default)\n```\n\n**Format:**\n```ini\nkeepconnected = 0|1\n```\n\n**Example:**\n```ini\nkeepconnected = 0\n```\n\n**Default:**\n```ini\nkeepconnected = 1\n```", .status = 0 },
{ .param = "recv_timeout", .config = "conf", .section = "cccam", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nSet network timeout for receiving data.\n\n**Format:**\n```ini\nrecv_timeout = milliseconds\n```\n\n**Default:**\n```ini\nrecv_timeout = 2000\n```", .status = 0 },
{ .param = "port", .config = "conf", .section = "camd33", .text = "**🔴 Required parameter**\n\n**(requires `MODULE_CAMD33` compilation flag)**\n\nTCP/IP port for camd 3.3x clients.\n\n**Example:**\n```ini\nport = 15000\nport = 0 # disabled (default)\n```", .status = 0 },
{ .param = "serverip", .config = "conf", .section = "camd33", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CAMD33` compilation flag)**\n\nBind service to specified IP address.\n\n**Example:**\n```ini\nserverip = 192.168.178.1\n```\n\n**Default:**\n```ini\nserverip = # listening to all\n```", .status = 0 },
{ .param = "nocrypt", .config = "conf", .section = "camd33", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CAMD33` compilation flag)**\n\nUnsecured camd 3.3x client connection.\n\n**Format:**\n```ini\nnocrypt = IP address|IP address range[,IP address|IP address range]...\n```\n\n**Example:**\n```ini\nnocrypt = 127.0.0.1,192.168.0.0-192.168.255.255\n```\n\n**Default:**\n```ini\nnocrypt = # none\n```", .status = 0 },
2026-02-17 10:48:41 +00:00
{ .param = "passive", .config = "conf", .section = "camd33", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CAMD33` compilation flag)**\n\nForce passive camd 3.3x client.\n\nCamd3.3x protocol generally has active clients. In certain circumstances the client must be switched to \"passive\" mode only.\n\n**Example:**\n```ini\npassive = 1\n```\n\n**Default:**\n```ini\npassive = 0\n```", .status = 0 },
{ .param = "key", .config = "conf", .section = "camd33", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CAMD33` compilation flag)**\n\n128 bit key for camd 3.3x client encryption.\n\n**Example:**\n```ini\nkey = 01020304050607080910111213141516\n```\n\n**Default:**\n```ini\nkey = # none\n```", .status = 0 },
{ .param = "port", .config = "conf", .section = "cs378x", .text = "**🔴 Required parameter**\n\n**(requires `MODULE_CAMD35_TCP` compilation flag)**\n\nPort(s) TCP for cs378x clients (camd 3.5x in TCP mode). Port(s) must be opened at router!\n\n**Format:**\n```ini\nport = port@CAID[:ident][,ident]...[;port@CAID[:ident][,ident]...]...\n```\n\n**Example:**\n```ini\nport = 15000@0500:030B00;22764@0648\n```", .status = 0 },
{ .param = "serverip", .config = "conf", .section = "cs378x", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CAMD35_TCP` compilation flag)**\n\nBind service to specified IP address.\n\n**Example:**\n```ini\nserverip = 192.168.178.1\n```\n\n**Default:**\n```ini\nserverip = # all (default)\n```", .status = 0 },
{ .param = "suppresscmd08", .config = "conf", .section = "cs378x", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_CAMD35_TCP` compilation flag)**\n\nTell cs3.78x clients not to request again for rejected CAID, service ID and provider ID combination.\n\n```ini\nsuppresscmd08 = 0 # enabled (default)\nsuppresscmd08 = 1 # disabled\n```\n\n**Format:**\n```ini\nsuppresscmd08 = 0|1\n```\n\n**Example:**\n```ini\nsuppresscmd08 = 1\n```\n\n**Default:**\n```ini\nsuppresscmd08 = 0\n```\n\nMore information: [Streamboard-Thread](http://www.streamboard.tv/wbb2/thread.php?threadid=27459)", .status = 0 },
{ .param = "Minimal", .config = "conf", .section = "gbox", .text = "Let's say the gbox runs on host 192.168.1.101 and OSCam is on 192.168.1.123. In file **cwshare.cfg** on gbox side we have, for example, the following lines:\n\n```\nM: { 192.168.1.101 { A123BCDE }}\nD: { 192.168.1.123 { 3820 3819 { 98AF3E25 {3 3}}}}\n```\n\nIf oscam_gbox should connect to the original GBOX above, then you should configure OSCam as follows:\n\n**oscam.conf:**\n```ini\n[gbox]\nhostname = 192.168.1.123\nmy_password = 98AF3E25\nport = 3819\n```\n\n**oscam.server:**\n```ini\n[reader]\nprotocol = gbox\ngroup = 1\ndevice = 192.168.1.101,3820\npassword = A123BCDE\nuser = gbox_client_1\n```\n\n**oscam.user:**\n```ini\n[account]\nuser = gbox_client_1\ngroup = 1\n```", .status = 0 },
{ .param = "Minimal", .config = "conf", .section = "streamrelay", .text = "The following example shows a basic Streamrelay setup where OSCam connects to a local Enigma2 receiver as stream source:\n\n```ini\n[streamrelay]\nstream_relay_enabled = 1\nstream_relay_port = 17999\nstream_relay_user = streamuser\nstream_source_host = 192.168.1.100\nstream_source_port = 8001\n```\n\nIn this setup:\n- OSCam listens on port 17999 for incoming client connections\n- The stream source is an Enigma2 box at 192.168.1.100:8001\n- The user `streamuser` must be defined in oscam.user\n\nClients can then connect to: `http://oscam-ip:17999/caid:srvid`", .status = 0 },
{ .param = "stream_relay_enabled", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nEnable or disable the Streamrelay server.\n\n```ini\nstream_relay_enabled = 0 # disabled (default)\nstream_relay_enabled = 1 # enabled\n```\n\n**Format:**\n```ini\nstream_relay_enabled = 0|1\n```\n\n**Example:**\n```ini\nstream_relay_enabled = 1\n```\n\n**Default:**\n```ini\nstream_relay_enabled = 0\n```", .status = 0 },
{ .param = "stream_relay_port", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nTCP port on which the Streamrelay server listens for incoming client connections.\n\n**Example:**\n```ini\nstream_relay_port = 17999\n```\n\n**Default:**\n```ini\nstream_relay_port = 17999\n```", .status = 0 },
{ .param = "stream_relay_user", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nUsername for the Streamrelay client. This user must be defined in oscam.user with appropriate permissions. If not set, the first valid user account will be used.\n\n**Example:**\n```ini\nstream_relay_user = streamclient\n```\n\n**Default:** none (uses first available user)", .status = 0 },
{ .param = "stream_relay_ctab", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nCAID table to restrict which CAIDs are handled by Streamrelay. Only streams with matching CAIDs will be descrambled.\n\n**Format:**\n```ini\nstream_relay_ctab = CAID1[,CAID2]...\n```\n\n**Example:**\n```ini\nstream_relay_ctab = 0963,098D,09CD\n```\n\n**Default:** none (CAIDs are detected automatically)", .status = 0 },
{ .param = "stream_source_host", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nIP address or hostname of the stream source server (e.g., Enigma2 receiver, SAT>IP server, or Tvheadend). This is where OSCam fetches the encrypted stream from.\n\n**Example:**\n```ini\nstream_source_host = 192.168.1.100\nstream_source_host = my-enigma2-box.local\n```\n\n**Default:**\n```ini\nstream_source_host = 127.0.0.1\n```", .status = 0 },
{ .param = "stream_client_source_host", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nDetermines how the stream source host is resolved for client connections.\n\n```ini\nstream_client_source_host = 0 # always use stream_source_host\nstream_client_source_host = 1 # use source host from client request if available (default)\n```\n\nWhen enabled, OSCam can use the stream source information provided by the connecting client, allowing more flexible multi-source setups.\n\n**Format:**\n```ini\nstream_client_source_host = 0|1\n```\n\n**Example:**\n```ini\nstream_client_source_host = 0\n```\n\n**Default:**\n```ini\nstream_client_source_host = 1\n```", .status = 0 },
{ .param = "stream_source_port", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nTCP port of the stream source server.\n\n**Example:**\n```ini\nstream_source_port = 8001\n```\n\n**Default:**\n```ini\nstream_source_port = 8001 # for Enigma2-based builds\nstream_source_port = 31339 # for Neutrino-based builds\n```\n\n⚠️ **Note:** The default value depends on the platform OSCam was compiled for.", .status = 0 },
{ .param = "stream_source_auth_user", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nUsername for HTTP Basic Authentication when connecting to the stream source. Required if the stream source server requires authentication.\n\n**Example:**\n```ini\nstream_source_auth_user = admin\n```\n\n**Default:** none", .status = 0 },
{ .param = "stream_source_auth_password", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nPassword for HTTP Basic Authentication when connecting to the stream source. Used together with `stream_source_auth_user`.\n\n**Example:**\n```ini\nstream_source_auth_password = secret123\n```\n\n**Default:** none", .status = 0 },
{ .param = "stream_relay_buffer_time", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nBuffer time in milliseconds before starting to relay the stream. A higher value provides more stable playback but increases latency. Useful when experiencing stream interruptions.\n\n**Format:**\n```ini\nstream_relay_buffer_time = milliseconds\n```\n\n**Example:**\n```ini\nstream_relay_buffer_time = 500 # 500ms buffer\n```\n\n**Default:**\n```ini\nstream_relay_buffer_time = 0 # no additional buffering\n```", .status = 0 },
{ .param = "stream_relay_reconnect_count", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nNumber of reconnection attempts to the stream source if the connection is lost. After this limit is reached, the stream is terminated.\n\n**Example:**\n```ini\nstream_relay_reconnect_count = 5 # try 5 reconnects\n```\n\n**Default:**\n```ini\nstream_relay_reconnect_count = 0 # no automatic reconnect\n```", .status = 0 },
{ .param = "stream_display_client", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nDetermines which address is displayed for Streamrelay connections in the status display and WebIF.\n\n```ini\nstream_display_client = 0 # show stream client address (default)\nstream_display_client = 1 # show stream source host address\n```\n\n**Format:**\n```ini\nstream_display_client = 0|1\n```\n\n**Example:**\n```ini\nstream_display_client = 1\n```\n\n**Default:**\n```ini\nstream_display_client = 0\n```", .status = 0 },
{ .param = "stream_reuse_client", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nReuse existing client connections when the same client reconnects. This can reduce overhead for clients that frequently disconnect and reconnect (e.g., during channel changes).\n\n```ini\nstream_reuse_client = 0 # create new client connection each time (default)\nstream_reuse_client = 1 # reuse existing client connection\n```\n\n**Format:**\n```ini\nstream_reuse_client = 0|1\n```\n\n**Example:**\n```ini\nstream_reuse_client = 1\n```\n\n**Default:**\n```ini\nstream_reuse_client = 0\n```", .status = 0 },
{ .param = "stream_hide_client", .config = "conf", .section = "streamrelay", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` and `WEBIF` compilation flags)**\n\nHide Streamrelay clients from the WebIF status display. Useful to reduce clutter in environments with many stream connections.\n\n```ini\nstream_hide_client = 0 # show clients in WebIF (default)\nstream_hide_client = 1 # hide clients from WebIF\n```\n\n**Format:**\n```ini\nstream_hide_client = 0|1\n```\n\n**Example:**\n```ini\nstream_hide_client = 1\n```\n\n**Default:**\n```ini\nstream_hide_client = 0\n```\n\n⚠️ **Note:** This parameter is only available when OSCam is compiled with WebIF support.", .status = 0 },
{ .param = "extended_cw_api", .config = "conf", .section = "dvbapi", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_EXTENDED_CW` compilation flag)**\n\nAPI for extended control words.\n\n**Format:**\n```ini\nextended_cw_api = 0 # none / disabled (default)\nextended_cw_api = 1 # OE2.2+ (OpenEmbedded 2.2, 2.5)\nextended_cw_api = 2 # OE2.0 (OpenEmbedded 2.0)\n```\n\n**Example:**\n```ini\nextended_cw_api = 1\n```\n\n**Default:**\n```ini\nextended_cw_api = 0\n```", .status = 0 },
{ .param = "demuxer_fix", .config = "conf", .section = "dvbapi", .text = "**🟢 Optional parameter**\n\n**(requires `MODULE_STREAMRELAY` compilation flag)**\n\nFix for demuxer issues related to Stream Relay. Enable this if you experience problems with stream relay and demuxing.\n\n**Format:**\n```ini\ndemuxer_fix = 0|1\n```\n\n**Example:**\n```ini\ndemuxer_fix = 1\n```\n\n**Default:**\n```ini\ndemuxer_fix = 0\n```", .status = 0 },
{ .param = "File", .config = "conf", .section = "webif", .text = "⚠️ **Attention:**\n- File has to be in TXT format\n- The EMM-file should contain each PRE-CAM EMM in a new line\n- EMMs should be in HEX representation:\n - Example: `AABBCCDD...`\n- Spaces and tabs between the bytes are allowed:\n - `AA BB CC DD...`\n- The HEX representation of each EMM's byte can be represented by upper or lower case - even mixed is allowed:\n - `AA aa Aa aA...`\n- Other chars and comments are not allowed", .status = 0 },
{ .param = "httpport", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nPort for web interface.\n\n**Format:**\n```ini\nhttpport = 0 # disabled\nhttpport = port # Webinterface listening on http-port\nhttpport = +port # Webinterface listening on https-port (SSL), prefix + enables SSL\n```\n\n**Example:**\n```ini\nhttpport = 8888\nhttpport = +443\n```\n\n**Default:**\n```ini\nhttpport = 8888\n```", .status = 0 },
{ .param = "httpuser", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nUsername for password protection. Blank is default, which is strongly discouraged!\n\n**Example:**\n```ini\nhttpuser = myusername # all characters and figures are allowed\n```", .status = 0 },
{ .param = "httppwd", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nPassword for password protection.\n\n**Example:**\n```ini\nhttppwd = mypassword\n```\n\n⚠️ **Note:** The *user* and *pwd* parameters are queried when connecting to the webinterface in a message box. If they are missing or corrupted, a message \"Forbidden\" appears and the connection is aborted!", .status = 0 },
{ .param = "httpcss", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nPath for external CSS file.\n\nFor webinterface different styles are available. Put custom CSS files (ending with .css extension) in the oscam config directory to manage your custom styles with WebIf.\n\n**Example:**\n```ini\nhttpcss = /etc/oscam/harvest_round_Firefox.css\n```\n\n**Default:**\n```ini\nhttpcss = # embedded style is used (default)\n```\n\nTo see the current CSS style, use the URL: `http://url_to_oscam_webif/site.css`\n\nStyles can be found here: [Streamboard-Thread](http://www.streamboard.tv/wbb2/thread.php?threadid=30083)", .status = 0 },
{ .param = "httpjscript", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nPath for oscam.js javascript.\n\n**Format:**\n```ini\nhttpjscript = path\n```\n\n**Default:** none", .status = 0 },
{ .param = "httpscript", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nPath to an executable script which you wish to start from web interface.\n\n**Example:**\n```ini\nhttpscript = /path/to/script.sh\n```\n\n**Default:**\n```ini\nhttpscript = # no path\n```\n\nYou can run script file from script.html (SCRIPTS item in main menu). If the script file contains \"echo\", it will be displayed in web interface.\n\n**Error messages:**\n- If the file cannot run: `[Error]: Script \"name_of_script.sh\" not executable!`\n- If the file does not exist: `[Error]: Script \"name_of_script.sh\" not found!`", .status = 0 },
{ .param = "httptpl", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nPath for external templates and picons.\n\nMultiple simultaneously templates and picons are possible by creating sub folders (maximum length of 32 alphanumeric characters). Sub folders naming is corresponding to sub folder in URL.\n\n**Example:**\n```ini\nhttptpl = /this/is/my/path\n\n# Folder with multiple templates:\n# /this/is/my/path/template\n# /this/is/my/path/template2\n\n# Valid URLs:\n# http://host:port/template1\n# http://host:port/template2\n```\n\n**Default:**\n```ini\nhttptpl = # No external templates\n```", .status = 0 },
{ .param = "httppiconpath", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nPath to picon (channel logo) files. Picons are small images displayed in the WebIF to identify channels. The picons should be stored in this directory with specific naming conventions.\n\n**Supported picon naming formats:**\n```\nIC_caid_srvid.tpl\nIC_caid_provid_srvid.tpl\nIC_servicename.tpl\n```\n\n**Service name conversion rules:**\n- Convert all upper-case letters to lower case\n- Replace `*` with `star`\n- Replace `&` with `and`\n- Replace `+` with `plus`\n- Remove everything but a-z and 0-9\n- If service name ends with `hd` and picon is not found, fallback to name without `hd`\n\n**Format:**\n```ini\nhttppiconpath = path\n```\n\n**Example:**\n```ini\nhttppiconpath = /usr/share/oscam/picons\nhttppiconpath = /etc/oscam/picons\n```\n\n**Default:**\n```ini\nhttppiconpath =\n```\n\n⚠️ **Note:** To display picons in the user list, enable `httpshowpicons = 1`.", .status = 0 },
{ .param = "httphelplang", .config = "conf", .section = "webif", .text = "**🔴 Required parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nSet right language for wiki entry point.\n\n**Format:**\n```ini\nhttphelplang = de|en|fr # available wiki languages\n```", .status = 0 },
{ .param = "httplocale", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nSet the \"locale environment\".\n\n**Format:**\n```ini\nhttplocale = environment\n```\n\n**Default:** none\n\nSee: [http://en.wikipedia.org/wiki/locale](http://en.wikipedia.org/wiki/locale)", .status = 0 },
{ .param = "http_prepend_embedded_css", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nAdd embedded CSS before custom CSS.\n\n```ini\nhttp_prepend_embedded_css = 0 # Do not add the content of the embedded CSS\n # before the content of the custom CSS (default)\nhttp_prepend_embedded_css = 1 # embedded CSS will be added before external\n # custom CSS (specified by the httpcss parameter)\n```\n\n**Format:**\n```ini\nhttp_prepend_embedded_css = 0|1\n```\n\n**Example:**\n```ini\nhttp_prepend_embedded_css = 1\n```\n\n**Default:**\n```ini\nhttp_prepend_embedded_css = 0\n```\n\nThis parameter can be used to override the embedded CSS with custom styles. To see the current CSS styles use the URL: `http://url_to_oscam_webif/site.css`", .status = 0 },
{ .param = "httprefresh", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nStatus refresh in seconds.\n\n**Example:**\n```ini\nhttprefresh = 7 # status will be refreshed after 7 seconds\n```\n\n**Default:**\n```ini\nhttprefresh = # no refreshing\n```", .status = 0 },
{ .param = "httppollrefresh", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nRefresh time for polling in seconds.\n\n**Example:**\n```ini\nhttppollrefresh = 60 # polling will be refreshed after 60 seconds\n```\n\n**Default:**\n```ini\nhttppollrefresh = 0 # no refreshing poll\n```", .status = 0 },
{ .param = "httphideidleclients", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nEnables hiding clients after idle time set with parameter **hideclient_to** in section [monitor].\n\n```ini\nhttphideidleclients = 0 # hide not (default)\nhttphideidleclients = 1 # hide\n```\n\n**Format:**\n```ini\nhttphideidleclients = 0|1\n```\n\n**Example:**\n```ini\nhttphideidleclients = 1\n```\n\n**Default:**\n```ini\nhttphideidleclients = 0\n```", .status = 0 },
{ .param = "httphidetype", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nHide types in web interface status page.\n\n**Format:**\n```ini\nhttphidetype = type[type]...\n```\n\nWhere type = letter which defines types to hide (see Typ column):\n- s = server\n- h = http\n- m = monitor\n- r = reader\n- p = proxy\n- x = cacheex\n- c = client\n\n**Example:**\n```ini\nhttphidetype = sh # hide server- and http-type columns\n```\n\n**Default:**\n```ini\nhttphidetype = # hide none (default)\n```", .status = 0 },
{ .param = "httpshowpicons", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nShow picons in user list.\n\n```ini\nhttpshowpicons = 0 # default\nhttpshowpicons = 1 # show picons in userlist\n```\n\nIf this parameter is enabled, then a new column is added to the USERS tab which displays the picons of the last watched channels by active users. The folder where the picons must be configured in the httppiconpath.\n\n**Possible formats are:**\n```\nIC_caid_srvid.tpl\nIC_caid_provid_srvid.tpl\nIC_servicename.tpl\n```\n\nAdded support for picons by channel name:\n- Take service-name from oscam.srvid\n- Replace all upper-case letters with lower case\n- Replace * with star\n- Replace & with and\n- Replace + with plus\n- Remove everything but a-z and 0-9\n- If the result is name, the picon file will be `IC_name.tpl`\n\n**Example:**\n- Service-name: \"BBC-ONE +HD\"\n- Picon file: \"IC_bbconeplushd.tpl\"\n\nIf service-name ends with hd, and picon is not found, fallback to name without hd.", .status = 0 },
{ .param = "httppiconsize", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nHeight of picon images in pixels when displayed in WebIF.\n\n**Format:**\n```ini\nhttppiconsize = pixels\n```\n\n**Example:**\n```ini\nhttppiconsize = 40\n```\n\n**Default:**\n```ini\nhttppiconsize = 0\n```", .status = 0 },
{ .param = "httpshowmeminfo", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nDisplay memory usage information in Status screen.\n\n```ini\nhttpshowmeminfo = 0 # do not show (default)\nhttpshowmeminfo = 1 # display memory usage information in Status screen\n```\n\n**Format:**\n```ini\nhttpshowmeminfo = 0|1\n```\n\n**Example:**\n```ini\nhttpshowmeminfo = 1\n```\n\n**Default:**\n```ini\nhttpshowmeminfo = 0\n```", .status = 0 },
{ .param = "httpshowuserinfo", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nDisplay users information in Status screen.\n\n```ini\nhttpshowuserinfo = 0 # do not show (default)\nhttpshowuserinfo = 1 # display users information in Status screen\n```\n\n**Format:**\n```ini\nhttpshowuserinfo = 0|1\n```\n\n**Example:**\n```ini\nhttpshowuserinfo = 1\n```\n\n**Default:**\n```ini\nhttpshowuserinfo = 0\n```", .status = 0 },
{ .param = "httpshowreaderinfo", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nDisplay readers information in Status screen.\n\n```ini\nhttpshowreaderinfo = 0 # do not show (default)\nhttpshowreaderinfo = 1 # display readers information in Status screen\n```\n\n**Format:**\n```ini\nhttpshowreaderinfo = 0|1\n```\n\n**Example:**\n```ini\nhttpshowreaderinfo = 1\n```\n\n**Default:**\n```ini\nhttpshowreaderinfo = 0\n```", .status = 0 },
{ .param = "httpshowcacheexinfo", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nDisplay CacheEX information in Status screen.\n\n```ini\nhttpshowcacheexinfo = 0 # do not show (default)\nhttpshowcacheexinfo = 1 # display CacheEX information in Status screen\n```\n\n**Format:**\n```ini\nhttpshowcacheexinfo = 0|1\n```\n\n**Example:**\n```ini\nhttpshowcacheexinfo = 1\n```\n\n**Default:**\n```ini\nhttpshowcacheexinfo = 0\n```", .status = 0 },
{ .param = "httpshowecminfo", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nDisplay readers and users ECM information in Status screen.\n\n```ini\nhttpshowecminfo = 0 # do not show (default)\nhttpshowecminfo = 1 # display readers and users ECM information in Status screen\n```\n\n**Format:**\n```ini\nhttpshowecminfo = 0|1\n```\n\n**Example:**\n```ini\nhttpshowecminfo = 1\n```\n\n**Default:**\n```ini\nhttpshowecminfo = 0\n```", .status = 0 },
{ .param = "httpshowloadinfo", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nDisplay load average and CPU usage information in Status screen.\n\n```ini\nhttpshowloadinfo = 0 # do not show (default)\nhttpshowloadinfo = 1 # display load average and CPU usage information in Status screen\n```\n\n**Format:**\n```ini\nhttpshowloadinfo = 0|1\n```\n\n**Example:**\n```ini\nhttpshowloadinfo = 1\n```\n\n**Default:**\n```ini\nhttpshowloadinfo = 0\n```", .status = 0 },
{ .param = "httpallowed", .config = "conf", .section = "webif", .text = "**🔴 Required parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nHTTP web interface connections allowed. Blank is allowed (default), but that makes no sense! If the webinterface is to be used, then there must be a way to connect with it. Therefore we declare this parameter as **mandatory**!\n\nWith **::1** OSCam decides to resolve 'localhost' to **IPv6**!\n\n**Format:**\n```ini\nhttpallowed = IP address|IP address range[,IP address|IP address range,[::1]]...\n```\n\n**Example:**\n```ini\nhttpallowed = 127.0.0.1,192.168.0.0-192.168.255.255\n# Host and range 192.168.0 are allowed\n\nhttpallowed = 127.0.0.1,192.168.0.0-192.168.255.255,::1\n# Host and range 192.168.0 are allowed, resolving to IPv6\n```\n\n**Default:**\n```ini\nhttpallowed = 127.0.0.1,192.168.0.0-192.168.255.255,10.0.0.0-10.255.255.255,::1\n```", .status = 0 },
{ .param = "httpreadonly", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nRead only mode for web interface.\n\n```ini\nhttpreadonly = 0 # all is possible (default)\nhttpreadonly = 1 # only read\n```\n\n**Format:**\n```ini\nhttpreadonly = 0|1\n```\n\n**Example:**\n```ini\nhttpreadonly = 1\n```\n\n**Default:**\n```ini\nhttpreadonly = 0\n```", .status = 0 },
{ .param = "httpsavefullcfg", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nWrite config mode.\n\n```ini\nhttpsavefullcfg = 0 # all not empty parameters, all not default parameters,\n # all parameters not containing the same value as the same\n # parameter in global configuration (default)\nhttpsavefullcfg = 1 # all parameters\n```\n\n**Format:**\n```ini\nhttpsavefullcfg = 0|1\n```\n\n**Example:**\n```ini\nhttpsavefullcfg = 1\n```\n\n**Default:**\n```ini\nhttpsavefullcfg = 0\n```", .status = 0 },
{ .param = "httpoverwritebakfile", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nOverwrite backup configuration files (*.bak).\n\n```ini\nhttpoverwritebakfile = 0 # default\nhttpoverwritebakfile = 1 # overwrite backup configurations files\n```\n\n**Format:**\n```ini\nhttpoverwritebakfile = 0|1\n```\n\n**Example:**\n```ini\nhttpoverwritebakfile = 1\n```\n\n**Default:**\n```ini\nhttpoverwritebakfile = 0\n```", .status = 0 },
{ .param = "httpcert", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nFile for HTTP SSL certificate.\n\n**Example:**\n```ini\nhttpcert = oscam.cert\n```\n\n**Default:**\n```ini\nhttpcert = # file oscam.pem (embedded) is used\n```", .status = 0 },
{ .param = "https_force_secure_mode", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nForce secure HTTPS mode. When enabled, HTTP connections are not allowed.\n\n**Format:**\n```ini\nhttps_force_secure_mode = 0|1\n```\n\n**Example:**\n```ini\nhttps_force_secure_mode = 1\n```\n\n**Default:**\n```ini\nhttps_force_secure_mode = 1\n```", .status = 0 },
{ .param = "https_auto_create_cert", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nAutomatically create SSL certificate if no certificate file is available.\n\n**Format:**\n```ini\nhttps_auto_create_cert = 0|1\n```\n\n**Example:**\n```ini\nhttps_auto_create_cert = 1\n```\n\n**Default:**\n```ini\nhttps_auto_create_cert = 1\n```", .status = 0 },
{ .param = "httpdyndns", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nHTTP web interface connections allowed via hostname.\n\n**Format:**\n```ini\nhttpdyndns = hostname[,hostname][,hostname]\n```\n\n**Example:**\n```ini\nhttpdyndns = host1.example.com,host2.example.com\n```", .status = 0 },
{ .param = "aulow", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nTime no EMM occurs so that client is set to low in minutes.\n\n**Example:**\n```ini\naulow = 30 # After 30 minutes without EMM client will be switched\n # from \"active\" to \"on\" (default)\n```", .status = 0 },
{ .param = "hideclient_to", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nTime to hide clients in the monitor if not sending requests. See also parameter **httphideidleclients** in section [webif].\n\n```ini\nhideclient_to = 0 # no hide\nhideclient_to = 1 # hide clients\n```\n\n**Format:**\n```ini\nhideclient_to = seconds\n```\n\n**Example:**\n```ini\nhideclient_to = 120\n```\n\n**Default:**\n```ini\nhideclient_to = 0\n```", .status = 0 },
{ .param = "httposcamlabel", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nSet individual label in web interface header.\n\n**Format:**\n```ini\nhttposcamlabel = text\n```\n\n**Default:**\n```ini\nhttposcamlabel = OSCam\n```", .status = 0 },
{ .param = "httpemmuclean", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nMaximum size of unique EMM log in kB. When exceeded, older entries are cleaned up.\n\n**Format:**\n```ini\nhttpemmuclean = size_in_kb\n```\n\n**Example:**\n```ini\nhttpemmuclean = 512\n```\n\n**Default:**\n```ini\nhttpemmuclean = 256\n```\n\n`0` = no cleanup", .status = 0 },
{ .param = "httpemmsclean", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nMaximum size of shared EMM log in kB. When exceeded, older entries are cleaned up.\n\n**Format:**\n```ini\nhttpemmsclean = size_in_kb\n```\n\n**Example:**\n```ini\nhttpemmsclean = 256\n```\n\n**Default:**\n```ini\nhttpemmsclean = -1\n```\n\n`-1` = do not show log, `0` = no cleanup", .status = 0 },
{ .param = "httpemmgclean", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag)**\n\nMaximum size of global EMM log in kB. When exceeded, older entries are cleaned up.\n\n**Format:**\n```ini\nhttpemmgclean = size_in_kb\n```\n\n**Example:**\n```ini\nhttpemmgclean = 256\n```\n\n**Default:**\n```ini\nhttpemmgclean = -1\n```\n\n`-1` = do not show log, `0` = no cleanup", .status = 0 },
{ .param = "http_status_log", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF_LIVELOG` compilation flag)**\n\nDisplay log in Status screen.\n\n```ini\nhttp_status_log = 0 # do not show (default)\nhttp_status_log = 1 # display log in Status screen\n```\n\n**Format:**\n```ini\nhttp_status_log = 0|1\n```\n\n**Example:**\n```ini\nhttp_status_log = 1\n```\n\n**Default:**\n```ini\nhttp_status_log = 0\n```", .status = 0 },
{ .param = "http_extern_jquery", .config = "conf", .section = "webif", .text = "**🟢 Optional parameter**\n\n**(requires `WEBIF` compilation flag, only when `WEBIF_JQUERY` is not defined)**\n\nExternal URL for jQuery library. Used when jQuery is not embedded in the WebIF build.\n\n**Format:**\n```ini\nhttp_extern_jquery = URL\n```\n\n**Default:**\n```ini\nhttp_extern_jquery = //code.jquery.com/jquery-3.7.1.min.js\n```", .status = 0 },
{ .param = "Format", .config = "cacheex", .section = "", .text = "```ini\nm:[CAID][:][provider ID][:][service ID][:][ECM PID][:][CHID][:][ECM length 1[,ECM length 2]...]=\n [CAID][:][provider ID][:][service ID][:][ECM PID][:][CHID][:][ECM length 1[,ECM length 2]...]]\n```", .status = 0 },
{ .param = "Field", .config = "cacheex", .section = "", .text = "| Field | Description | Format | Required |\n|-------|-------------|--------|----------|\n| **m** | Mapping prefix | Fixed | Yes |\n| **CAID** | Conditional Access ID | 4-digit hexadecimal | Optional |\n| **provider ID** | Provider identifier | Hexadecimal | Optional |\n| **service ID** | Service identifier | Hexadecimal | Optional |\n| **ECM PID** | ECM Process ID | Hexadecimal | Optional |\n| **CHID** | Channel ID | Hexadecimal | Optional |\n| **ECM length** | ECM length in bytes | Decimal, comma-separated | Optional |\n| **=** | Separator between source and target | Fixed | Yes |\n\n**Syntax Rules**:\n- Empty fields are represented by consecutive colons (`::`)\n- Multiple ECM lengths are comma-separated (e.g., `93,95`)\n- Left side of `=` is the incoming request (from cache exchange partner)\n- Right side of `=` is the local cache lookup (what to search for locally)", .status = 0 },
{ .param = "Basic", .config = "cacheex", .section = "", .text = "Map CAID 1702 to CAID 1833 for ECM length 93:\n\n```ini\n# Sky Germany S02 to S02-Tunnel\nm:1702:::::93=1833:::::93\n```", .status = 0 },
{ .param = "Multiple", .config = "cacheex", .section = "", .text = "Match multiple ECM lengths for the same CAID mapping:\n\n```ini\n# ORF ICE mapping with multiple lengths\nm:09C4:::::46,58,90,95=09C7:::::46,58,90,95\n```", .status = 0 },
{ .param = "Provider-Specific", .config = "cacheex", .section = "", .text = "Map specific provider IDs:\n\n```ini\n# HD+ with provider ID\nm:1830:000000::::92=1830:003411::::92\n```", .status = 0 },
{ .param = "Service-Specific", .config = "cacheex", .section = "", .text = "Map specific service IDs:\n\n```ini\n# Map service 1234 to 5678\nm:1702::1234:::93=1833::5678:::93\n```", .status = 0 },
{ .param = "Real-World", .config = "cacheex", .section = "", .text = "```ini\n# Sky Germany mappings\nm:1702:::::93=1833:::::93\nm:1702:::::95=1833:::::95\n\n# HD+ mappings\nm:1830:003411::::92=1830:000000::::92\nm:1830:003411::::134=1830:000000::::134\n\n# ORF mappings\nm:0D95:::::144=0648:::::144\nm:0D98:::::144=0650:::::144\n\n# Viaccess mappings\nm:0500:023800::::188=0500:032830::::188\nm:0500:023800::::164=0500:032830::::164\n```", .status = 0 },
{ .param = "Complex", .config = "cacheex", .section = "", .text = "```ini\n# Complete oscam.cacheex file example\n\n# Sky Germany S02 standard lengths\nm:1702:::::93=1833:::::93\nm:1702:::::95=1833:::::95\nm:1702:::::144=1833:::::144\n\n# HD+ provider mapping\nm:1830:003411::::92=1830:000000::::92\nm:1830:003411::::134=1830:000000::::134\nm:1830:003411::::188=1830:000000::::188\n\n# ORF ICE to Cryptoworks mapping\nm:09C4:::::46,58,90,95=09C7:::::46,58,90,95\nm:0D95:::::144=0648:::::144\nm:0D98:::::144=0650:::::144\n\n# Viaccess TNTSAT to CSAT mapping\nm:0500:030B00::::188=0500:032830::::188\nm:0500:023800::::188=0500:032830::::188\n```", .status = 0 },
{ .param = "When", .config = "cacheex", .section = "", .text = "Use oscam.cacheex mappings when:\n- Partners use different CAIDs for the same content\n- You need to translate between tunnel CAIDs (e.g., 1702 ↔ 1833)\n- Provider IDs differ but ECM structure is identical\n- Service IDs need mapping between systems", .status = 0 },
{ .param = "When", .config = "cacheex", .section = "", .text = "You don't need oscam.cacheex if:\n- All partners use the same CAID structure\n- Using CE2 or CE3 modes without CAID translation\n- Simple cache sharing without mapping requirements", .status = 0 },
{ .param = "File", .config = "cacheex", .section = "", .text = "- **Comment Your Mappings**: Use `#` for comments to document each mapping purpose\n- **Test Incrementally**: Add mappings one at a time and verify functionality\n- **Monitor Cache Hits**: Check WebIF statistics to confirm mappings work\n- **Keep It Simple**: Only add mappings you actually need", .status = 0 },
{ .param = "Performance", .config = "cacheex", .section = "", .text = "- Each mapping adds minimal overhead to cache lookups\n- More specific mappings (with service IDs) are faster than generic ones\n- Use ECM length matching when possible to reduce false matches", .status = 0 },
{ .param = "Mapping", .config = "cacheex", .section = "", .text = "**Check the following**:\n1. Verify ECM lengths match exactly (check logs)\n2. Confirm CAID values are correct (4-digit hex)\n3. Ensure provider IDs match if specified\n4. Check that CE1 mode is enabled on the reader\n5. Review cache exchange statistics in WebIF\n\n**Common Issues**:\n- **Wrong ECM Length**: ECM length must match exactly between source and target\n- **Syntax Errors**: Missing colons or incorrect separator (must use `=`)\n- **Case Sensitivity**: CAID values must be uppercase hexadecimal\n- **File Not Loaded**: Check OSCam startup log for oscam.cacheex parsing errors", .status = 0 },
{ .param = "Verification", .config = "cacheex", .section = "", .text = "**Log Analysis**:\n```\n# Enable debug logging in oscam.conf\n[global]\nlogfile = /var/log/oscam/oscam.log\ndisablelog = 0\n```\n\nLook for cache exchange activity in logs showing CAID translation.\n\n**WebIF Statistics**:\n- Navigate to Status → Cache Exchange\n- Check \"ECM-CW received\" counters\n- Verify mapped CAIDs appear in statistics\n\n**Test Procedure**:\n1. Add mapping to oscam.cacheex\n2. Restart OSCam (or reload config if supported)\n3. Monitor logs during channel change\n4. Verify cache hit for mapped CAID\n5. Check that correct CW is returned", .status = 0 },
{ .param = "Syntax", .config = "cacheex", .section = "", .text = "**Valid Examples**:\n```ini\nm:1702:::::93=1833:::::93 # Valid: Basic CAID mapping\nm:1830:003411::::92=1830:000000::::92 # Valid: Provider mapping\nm:09C4:::::46,58,90=09C7:::::46,58,90 # Valid: Multiple lengths\n```\n\n**Invalid Examples**:\n```ini\nm:1702:::93=1833:::93 # Invalid: Missing colons\n1702:::::93=1833:::::93 # Invalid: Missing 'm:' prefix\nm:1702:::::93-1833:::::93 # Invalid: Wrong separator (use =)\nm:1702:::::93= # Invalid: Missing target\n```", .status = 0 },
{ .param = "Field", .config = "cacheex", .section = "", .text = "The field order is strict and must follow this pattern:\n```\nm:[CAID]:[ProvID]:[SrvID]:[PID]:[CHID]:[Length]=[CAID]:[ProvID]:[SrvID]:[PID]:[CHID]:[Length]\n └─1──┘ └──2──┘ └──3──┘ └─4─┘ └─5──┘ └──6───┘ └─1──┘ └──2──┘ └──3──┘ └─4─┘ └─5──┘ └──6───┘\n```", .status = 0 },
{ .param = "Comments", .config = "cacheex", .section = "", .text = "Comments can be added using `#`:\n```ini\n# This is a comment\nm:1702:::::93=1833:::::93 # Inline comment\n```", .status = 0 },
{ .param = "oscam", .config = "cacheex", .section = "", .text = "- `cacheexwaittime` - Wait time for CE1 response\n- `max_cache_time` - Cache retention time\n- `max_cache_count` - Maximum ECMs in cache\n\nSee the oscam.conf documentation for complete cache exchange settings.", .status = 0 },
{ .param = "oscam", .config = "cacheex", .section = "", .text = "- `cacheex` - Cache exchange mode (1, 2, or 3)\n- `cacheex_maxhop` - Maximum hops for cache forwarding\n- `cacheex_ecm_filter` - Filter which CAIDs are exchanged\n\nSee the oscam.server documentation for reader-specific cache exchange parameters.", .status = 0 },
{ .param = "oscam", .config = "cacheex", .section = "", .text = "- `cacheex` - User cache exchange permission\n- `cacheex_maxhop` - Maximum hops for this user\n\nSee the oscam.user documentation for user cache exchange settings.", .status = 0 },
{ .param = "disabled", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nAccount disabled.\n\n```ini\ndisabled = 0 # account enabled\ndisabled = 1 # account disabled\n```\n\n**Format:**\n```ini\ndisabled = 0|1\n```\n\n**Example:**\n```ini\ndisabled = 1\n```\n\n**Default:**\n```ini\ndisabled = 0\n```", .status = 0 },
{ .param = "user", .config = "user", .section = "account", .text = "**🔴 Required parameter**\n\nAccount name.\n\n**Example:**\n```ini\nuser = user1\n```\n\n**Default:**\n```ini\nuser =\n```", .status = 0 },
{ .param = "pwd", .config = "user", .section = "account", .text = "**🔴 Required parameter**\n\nPassword for account.\n\n⚠️ **Note:** Gbox Protocol: pwd is not required\n\n**Example:**\n```ini\npwd = pwuser1\n```\n\n**Default:**\n```ini\npwd =\n```", .status = 0 },
{ .param = "description", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nDescription of user account (text).\n\n**Format:**\n```ini\ndescription = text\n```\n\n**Example:**\n```ini\ndescription = Living room receiver\n```\n\n**Default:**\n```ini\ndescription =\n```", .status = 0 },
{ .param = "hostname", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nHost from which user connection is allowed.\n\n**Example:**\n```ini\nhostname = client.dyndns.org\n```\n\n**Default:**\n```ini\nhostname =\n```", .status = 0 },
{ .param = "caid", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nDefine and mapping of CAIDs for reader.\n\n**Format:**\n```ini\ncaid = <CAID>[&<mask>][:<target CAID>][,<CAID>[&<mask>][:target <CAID>]]...\n```\n\n**Example:**\n```ini\ncaid = 0100\ncaid = 0200&ffee:0300\ncaid = 0400&ff00:0500,0600\ncaid = 0702,0722\ncaid = 0702&ffdf # shortcut for the example above\n```\n\n**Default:** all CAIDs with mask FFFF", .status = 0 },
{ .param = "uniq", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nUnique connection mode for user.\n\n```ini\nuniq = 0 # disabled, default\nuniq = 1 # only one connection per user is allowed\nuniq = 2 # set user to fake if source ip is different\n # (e.g. for newcamd clients with different CAIDs and ports)\nuniq = 3 # only one connection per user, but only the last login will survive (old mpcs behavior)\nuniq = 4 # set user only to fake if source ip is different, but only the last login will survive\n```\n\n**Format:**\n```ini\nuniq = 0|1|2|3|4\n```\n\n**Example:**\n```ini\nuniq = 1\n```\n\n**Default:**\n```ini\nuniq = 0\n```", .status = 0 },
{ .param = "sleepsend", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nSleep send mode.\n\n```ini\nsleepsend = 0\nsleepsend = 255 # OSCam client only: stopping requests until next zap\n # camd 3.x only: stopping requests until restart of camd3 client\n```\n\n**Format:**\n```ini\nsleepsend = 0-255\n```\n\n**Example:**\n```ini\nsleepsend = 255\n```\n\n**Default:**\n```ini\nsleepsend =\n```", .status = 0 },
{ .param = "failban", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nMask for IP based blocking:\n\n```ini\nfailban = 0 # ignore (default)\nfailban = 2 # block IP address of a disabled account on connecting\nfailban = 4 # block IP address of a sleeping account while sleeping comes up\nfailban = 8 # block duplicate IP address\n```\n\n**Format:**\n```ini\nfailban = 0|2|4|8\n```\n\n**Example:**\n```ini\nfailban = 2\n```\n\n**Default:**\n```ini\nfailban = 0\n```", .status = 0 },
{ .param = "monlevel", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nMonitor level:\n\n```ini\nmonlevel = 0 # no access to monitor\nmonlevel = 1 # only server and own procs\nmonlevel = 2 # all procs, but viewing only (default)\nmonlevel = 3 # all procs, reload of oscam.user possible\nmonlevel = 4 # complete access\n```\n\n**Format:**\n```ini\nmonlevel = 0|1|2|3|4\n```\n\n**Example:**\n```ini\nmonlevel = 4\n```\n\n**Default:**\n```ini\nmonlevel = 2\n```", .status = 0 },
{ .param = "sleep", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nTime waiting for inactive user in minutes.\n\n**Format:**\n```ini\nsleep = minutes\n```\n\n**Example:**\n```ini\nsleep = 5\n```\n\n**Default:**\n```ini\nsleep =\n```", .status = 0 },
{ .param = "suppresscmd08", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nSwitches suppress of CMD08.\n\n```ini\nsuppresscmd08 = 0 # CMD08 for camd3 3.57x/3.78x clients enabled\nsuppresscmd08 = 1 # CMD08 for camd3 3.57x/3.78x clients disabled\n```\n\n**Format:**\n```ini\nsuppresscmd08 = 0|1\n```\n\n**Example:**\n```ini\nsuppresscmd08 = 1\n```\n\n**Default:**\n```ini\nsuppresscmd08 = 0\n```", .status = 0 },
{ .param = "umaxidle", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nValue for user being idle before disconnect (seconds).\n\n```ini\numaxidle = -1 # use clientmaxidle in [global]-section\numaxidle = 0 # idle disconnect disabled (default)\n```\n\n**Format:**\n```ini\numaxidle = -1|0|seconds\n```\n\n**Example:**\n```ini\numaxidle = 300\n```\n\n**Default:**\n```ini\numaxidle = 0\n```", .status = 0 },
{ .param = "keepalive", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nDisable keepalive between newcamd-server and client connection.\n\n```ini\nkeepalive = 0 # disabled\nkeepalive = 1 # enabled (default)\n```\n\n**Format:**\n```ini\nkeepalive = 0|1\n```\n\n**Example:**\n```ini\nkeepalive = 0\n```\n\n**Default:**\n```ini\nkeepalive = 1\n```", .status = 0 },
{ .param = "au", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nAU (Auto Update) settings.\n\n**Format:**\n```ini\nau = <label of reader>[,<label of reader>]... | 1\n```\n\n**AU settings:**\n```ini\nau = [label of reader] # sending EMMs to specified reader\n # (security issue: clients can see SC data!)\nau = 1 # auto AU is sending EMMs to all readers\n # (security issue: clients can see SC data!)\nau = # none (default)\n```\n\n**Note:** Sometimes only global EMM's update same CAID cards:\n- Check if you blocked unique/shared in READER Blockemm\n- Don't use `au = 1`, use `au = [label of reader]`\n- If still troublesome, use in house different users to update each card by `[label of reader]`\n\n**Example:**\n```ini\n# cd_nl and tv_vl have a common provider: m7 group sa and share updates on shared channels\nuser 1: au = cd_nl,sky_uk\nuser 2: au = tv_vl\n```", .status = 0 },
{ .param = "emmreassembly", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nEMM reassembly, should be set for Viaccess and Cryptoworks readers if the client that you are using to send EMMs is reassembling them instead of just sending them to OSCam for processing.\n\n```ini\nemmreassembly = 0 # disabled\nemmreassembly = 1 # enabled for DVB API\nemmreassembly = 2 # enabled (default)\n```\n\n**Format:**\n```ini\nemmreassembly = 0|1|2\n```\n\n**Example:**\n```ini\nemmreassembly = 0\n```\n\n**Default:**\n```ini\nemmreassembly = 2\n```", .status = 0 },
{ .param = "expdate", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nExpiration date for account.\n\n**Format:**\n```\n<year>-<month>-<day> | <year>/<month>/<day>\n```\n\n**Example:**\n```ini\nexpdate = 2001-11-21\nexpdate = 2002/12/22\n```\n\n**Default:**\n```ini\nexpdate = none\n```", .status = 0 },
{ .param = "allowedprotocols", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nAllowed protocols for user.\n\n**Format:**\n```ini\nallowedprotocols = [protocol1][,][protocol2][,][protocol3]...\n```\n\n**Protocols:**\n- camd33\n- camd35\n- cs357x\n- cs378x\n- newcamd\n- cccam\n- gbox\n- radegast\n\n**Example:**\n```ini\nallowedprotocols = cs357x,gbox # only cs357x and gbox protocols are allowed\nallowedprotocols = # all protocols are allowed (default)\n```", .status = 0 },
{ .param = "allowedtimeframe", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nAccount enabled from - to for specified day(s).\n\n**Format:**\n```\nDAY@HH:MM-HH:MM[,HH:MM-HH:MM][,HH:MM-HH:MM][;DAY@HH:MM-HH:MM[,HH:MM-HH:MM]]\n```\n\nWhere `DAY` = `SUN`, `MON`, `TUE`, `WED`, `THU`, `FRI`, `SAT` or `ALL` (for all possible days)\n\n- Use comma (`,`) to separate times\n- Use semicolon (`;`) to separate different days\n- Use `ALL@` if you want the same time frames for everyday\n- Day starts at 00:00 and ends at 24:00, so to cover a full day use: `DAY@00:00-24:00`\n\n**Example:**\n```ini\nallowedtimeframe = ALL@10:00-22:00;MON@00:00-02:00,02:45-04:37;FRI@00:00-10:00,22:00-24:00;SAT@00:00-24:00\n```\n\n**Note:** If you use `XXX@22:00-05:00`, this will be turned into `XXX@00:00-05:00,22:00-24:00`\n\n`ALL@` is always checked and used, so you can watch TV the whole day on FRIday in this example. There is no problem to overlap `ALL@` in a day definition, like for `SAT@` definition.\n\n**Default:**\n```ini\nallowedtimeframe =\n```", .status = 0 },
{ .param = "betatunnel", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nDefine Betacrypt tunneling (max. see CS_MAXTUNTAB in globals.h). The ServiceID can also be used for wildcarded CAIDs.\n\n**Format:**\n```ini\nbetatunnel = <CAID>.<ServiceID>:<target CAID>[,<CAID>.<ServiceID>:<target CAID>]...\n```\n\n**Example:**\n```ini\nbetatunnel = 0100.0001:0200,0300.0004:0500\nbetatunnel = 0600.FFFF:0700\n```\n\n**Default:**\n```ini\nbetatunnel =\n```", .status = 0 },
{ .param = "group", .config = "user", .section = "account", .text = "**🔴 Required parameter**\n\nUser assignment to reader group. Valid 64 groups.\n\n**Format:**\n```ini\ngroup = 1...64[,1...64]...\n```\n\n**Default:** none", .status = 0 },
{ .param = "services", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nWhat services may use the user? This requires an `oscam.services` to be present.\n\nThe logic here is as follows (in this order):\n1. If the field is empty (or invalid), the request is allowed.\n2. When a negative service (i.e., those with `!`) is applicable, the request is rejected.\n3. If a positive service is applicable or there is no positive service, the request is allowed.\n4. If none of the previous points, the request is rejected.\n\nThis means that negative services are only necessary in individual cases.\n\n**Format:**\n```ini\nservices = [!]service[,[!]service]...\n```\n\n**Example:**\n```ini\nservices = service1,!service2 # client may receive service1, but not service2\n```\n\n**Default:**\n```ini\nservices =\n```", .status = 0 },
{ .param = "preferlocalcards", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nPreference for local cards.\n\n```ini\npreferlocalcards = -1 # global value from oscam.conf[global] (default)\npreferlocalcards = 0 # local SCs used like a remote reader\npreferlocalcards = 1 # prefer call exchange based SCs\npreferlocalcards = 2 # prefer local SCs\n```\n\n**Format:**\n```ini\npreferlocalcards = -1|0|1|2\n```\n\n**Example:**\n```ini\npreferlocalcards = 2\n```\n\n**Default:**\n```ini\npreferlocalcards = -1\n```", .status = 0 },
{ .param = "ident", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nUser assignment to SC specific idents.\n\n**Format:**\n```ini\nident = <CAID>:<ident>[,<ident>,...][;<CAID>:<ident>[,<ident>,...]]...\n```\n\n**Default:** none", .status = 0 },
{ .param = "chid", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nUser assignment to SC specific ChID.\n\n**Format:**\n```ini\nchid = <CAID>:<ChID>[,<ChID>,...][;<CAID>:<ChID>[,<ChID>,...]]...\n```\n\n**Default:**\n```ini\nchid =\n```", .status = 0 },
{ .param = "class", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nUser [de]assignment to SC specific classes.\n\n**Format:**\n```ini\nclass = [!]class[,[!]class]...\n```\n\n**Example:**\n```ini\nclass = 01,02,!03,!04\n```\n\n**Default:** none", .status = 0 },
{ .param = "max_connections", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\nMaximum concurrent connections allowed for this user account.\n\n**Format:**\n```ini\nmax_connections = count\n```\n\n**Example:**\n```ini\nmax_connections = 5\n```\n\n**Default:**\n```ini\nmax_connections = 1\n```", .status = 0 },
{ .param = "cacheex", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nCache exchange mode.\n\n```ini\ncacheex = 0 # default for camd 3.5x and CCcam protocol\ncacheex = 1 # enable cache exchange pull mode\ncacheex = 2 # enable cache exchange push mode\ncacheex = 3 # enable cache exchange reversepush mode\n```\n\n**Format:**\n```ini\ncacheex = 0|1|2|3\n```\n\n**Example:**\n```ini\ncacheex = 2\n```\n\n**Default:**\n```ini\ncacheex = 0\n```\n\n**See also on oscam.server!**\n\nIdentical cache exchange modes must be set on local OSCam user account and remote OSCam server!\n\n#### cacheex = 1 - cachepull\n\n**Situation:**\n- OSCam A reader1 has `cacheex = 1`\n- OSCam B account1 has `cacheex = 1`\n\nOSCam A gets an ECM request, reader1 sends this request to OSCam B.\n\nOSCam B checks his cache:\n- Not found in cache: return NOK\n- Found in cache: return OK+CW\n- Not found in cache, but found pending request: wait `cacheexwaittime` in oscam.conf [global] and check again. OSCam B never requests new ECMs.\n\n**CW-flow:** B → A\n\n#### cacheex = 2 - cachepush\n\n**Situation:**\n- OSCam A reader1 has `cacheex = 2`\n- OSCam B account1 has `cacheex = 2`\n\nIf OSCam B gets a CW, it's pushed to OSCam A, reader has normal functionality and can request ECMs.\n\n**Problems:**\n- OSCam can only push CW's if OSCam A is connected\n- Problem or feature?: OSCam A reader can request ECMs from OSCam B\n\n**CW-flow:** B → A\n\n#### cacheex = 3 - reversecachepush\n\n**Situation:**\n- OSCam A reader 1 has `cacheex = 3`\n\nIf OSCam A gets a CW, it's pushed to OSCam B. OSCam A never requests new ECMs.\n\n**CW-flow:** A → B", .status = 0 },
{ .param = "cacheex_maxhop", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nDefine maximum hops for cache exchange.\n\n**Format:**\n```ini\ncacheex_maxhop = hops\n```\n\n**Example:**\n```ini\ncacheex_maxhop = 5\n```\n\n**Default:**\n```ini\ncacheex_maxhop = 10\n```", .status = 0 },
{ .param = "cacheex_maxhop_lg", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nDefine a maxhop for lg-flagged CWs for push/receive, to allow a higher maxhop than for non-flagged CWs.\n\n```ini\ncacheex_maxhop_lg = 0 # default, use value of cacheex_maxhop\ncacheex_maxhop_lg = 1 to 10 # set maxhop (if value is lower than cacheex_maxhop,\n # value of cacheex_maxhop is used)\n```\n\n**Format:**\n```ini\ncacheex_maxhop_lg = 0-10\n```\n\n**Example:**\n```ini\ncacheex_maxhop_lg = 5\n```\n\n**Default:**\n```ini\ncacheex_maxhop_lg = 0\n```", .status = 0 },
{ .param = "cacheex_ecm_filter", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nCacheEx ECM filter for this user. Defines which CAIDs/providers/services are allowed for cache exchange.\n\n**Format:**\n```ini\ncacheex_ecm_filter = [caid][&mask][@provid][$servid],n\n```\n\n**Example:**\n```ini\ncacheex_ecm_filter = 1234@000001,1234@000002\n```\n\n**Default:**\n```ini\ncacheex_ecm_filter =\n```", .status = 0 },
{ .param = "cacheex_drop_csp", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nDrop CWs received via CSP (Cardservproxy protocol) for this user.\n\n**Format:**\n```ini\ncacheex_drop_csp = 0|1\n```\n\n**Example:**\n```ini\ncacheex_drop_csp = 1\n```\n\n**Default:**\n```ini\ncacheex_drop_csp = 0\n```", .status = 0 },
{ .param = "cacheex_allow_request", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nAllow ECM requests from this CacheEx user. When disabled, user can only receive pushed CWs.\n\n**Format:**\n```ini\ncacheex_allow_request = 0|1\n```\n\n**Example:**\n```ini\ncacheex_allow_request = 1\n```\n\n**Default:**\n```ini\ncacheex_allow_request = 0\n```", .status = 0 },
{ .param = "no_wait_time", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nDisable wait time for this user. ECM requests are processed immediately without waiting for cache hits.\n\n**Format:**\n```ini\nno_wait_time = 0|1\n```\n\n**Example:**\n```ini\nno_wait_time = 1\n```\n\n**Default:**\n```ini\nno_wait_time = 0\n```", .status = 0 },
{ .param = "cacheex_allow_filter", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nAllow this user to set CacheEx ECM filters remotely.\n\n**Format:**\n```ini\ncacheex_allow_filter = 0|1\n```\n\n**Example:**\n```ini\ncacheex_allow_filter = 0\n```\n\n**Default:**\n```ini\ncacheex_allow_filter = 1\n```", .status = 0 },
{ .param = "cacheex_allow_maxhop", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nSet maxhop-settings remote, if remote reader/user has `cacheex_allow_maxhop = 1`.\n\n```ini\ncacheex_allow_maxhop = 0 # default (opt-in)\ncacheex_allow_maxhop = 1 # allow remote maxhop settings\n```\n\n**Format:**\n```ini\ncacheex_allow_maxhop = 0|1\n```\n\n**Example:**\n```ini\ncacheex_allow_maxhop = 1\n```\n\n**Default:**\n```ini\ncacheex_allow_maxhop = 0\n```", .status = 0 },
{ .param = "cacheex_block_fakecws", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nBlock fake CWs for this user. Fake CWs are control words that match patterns defined in oscam.fakecws.\n\n**Format:**\n```ini\ncacheex_block_fakecws = 0|1\n```\n\n**Example:**\n```ini\ncacheex_block_fakecws = 1\n```\n\n**Default:**\n```ini\ncacheex_block_fakecws = 0\n```", .status = 0 },
{ .param = "disablecrccacheex", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nDisable CW checksum test for CacheEx CWs for this user.\n\n**Format:**\n```ini\ndisablecrccacheex = 0|1\n```\n\n**Example:**\n```ini\ndisablecrccacheex = 1\n```\n\n**Default:**\n```ini\ndisablecrccacheex = 0\n```", .status = 0 },
{ .param = "disablecrccacheex_only_for", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX` compilation flag)**\n\nDisable CW checksum test for CacheEx CWs only for specific CAIDs/providers.\n\n**Format:**\n```ini\ndisablecrccacheex_only_for = CAID1[:ident1][,CAID2[:ident2]]...\n```\n\n**Example:**\n```ini\ndisablecrccacheex_only_for = 0100:000030,0500\n```\n\n**Default:**\n```ini\ndisablecrccacheex_only_for =\n```", .status = 0 },
{ .param = "cacheex_cw_check_for_push", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nPush only when `cacheex_cw_check` counter reached. Localgenerated-flagged CWs are always pushed out.\n\n```ini\ncacheex_cw_check_for_push = 0 # default (opt-in)\ncacheex_cw_check_for_push = 1 # push only when counter reached\n```\n\n**Format:**\n```ini\ncacheex_cw_check_for_push = 0|1\n```\n\n**Example:**\n```ini\ncacheex_cw_check_for_push = 1\n```\n\n**Default:**\n```ini\ncacheex_cw_check_for_push = 0\n```", .status = 0 },
{ .param = "cacheex_lg_only_remote_settings", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nPossibility to deny cacheex-receiver/client (cx2: user / cx3: reader) to overwrite the following settings @ cacheex-sending-instance:\n- `cacheex_localgenerated_only`\n- `cacheex_lg_only_tab`\n\nIt makes sense if you want to force your local settings. If the user/reader isn't allowed to overwrite your values:\n- It is still possible for the cacheex-receiver to set `cacheex_localgenerated_only=1`, if the user/reader defines `cacheex_localgenerated_only_in=1`; but it is only possible @ cacheex-sending-instance to disable it\n- It is still possible for the cacheex-receiver to add `cacheex_lg_only_tab`, if the user/reader defines `cacheex_lg_only_in_tab=1234,1337`; but it is only merged to the sender-instance `cacheex_lg_only_tab` values\n\nIf `cacheex_lg_only_remote_settings` @oscam.conf is enabled, the user/reader-settings are ignored.\nIf `cacheex_lg_only_remote_settings` @oscam.conf is disabled, the user/reader-settings are used.\n\n```ini\ncacheex_lg_only_remote_settings = 0 # default (opt-out)\ncacheex_lg_only_remote_settings = 1 # deny remote settings\n```\n\n**Format:**\n```ini\ncacheex_lg_only_remote_settings = 0|1\n```\n\n**Example:**\n```ini\ncacheex_lg_only_remote_settings = 1\n```\n\n**Default:**\n```ini\ncacheex_lg_only_remote_settings = 0\n```", .status = 0 },
{ .param = "cacheex_localgenerated_only", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nForward only CWs which are flagged as localgenerated.\n\n```ini\ncacheex_localgenerated_only = 0 # default (opt-in)\ncacheex_localgenerated_only = 1 # forward only localgenerated CWs\n```\n\n**Format:**\n```ini\ncacheex_localgenerated_only = 0|1\n```\n\n**Example:**\n```ini\ncacheex_localgenerated_only = 1\n```\n\n**Default:**\n```ini\ncacheex_localgenerated_only = 0\n```", .status = 0 },
{ .param = "cacheex_localgenerated_only_caid", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nCAID table for localgenerated-only filter. Forward only locally generated CWs for these CAIDs. Deprecated: use `cacheex_lg_only_tab` instead.\n\n**Format:**\n```ini\ncacheex_localgenerated_only_caid = CAID1[,CAID2]...\n```\n\n**Example:**\n```ini\ncacheex_localgenerated_only_caid = 0100,0500,1702\n```\n\n**Default:**\n```ini\ncacheex_localgenerated_only_caid =\n```", .status = 0 },
{ .param = "cacheex_lg_only_tab", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nForward only CWs which are lg-flagged for these list of caid/provid(s).\n\nIf provid `FFFFFE` is set, all provids for this caid are valid!\n\n```ini\ncacheex_lg_only_tab = caid1:provid1[,provid2];caid2:provid1;\n```", .status = 0 },
{ .param = "cacheex_lg_only_in_aio_only", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nUse drop lg-only settings (`cacheex_localgenerated_only_in` & `cacheex_lg_only_in_tab`) only if peer is detected as cx-aio-patched or svn >= 11588.\n\n```ini\ncacheex_lg_only_in_aio_only = 0 # default (opt-in)\ncacheex_lg_only_in_aio_only = 1 # use lg-only settings only for AIO peers\n```\n\n**Format:**\n```ini\ncacheex_lg_only_in_aio_only = 0|1\n```\n\n**Example:**\n```ini\ncacheex_lg_only_in_aio_only = 1\n```\n\n**Default:**\n```ini\ncacheex_lg_only_in_aio_only = 0\n```", .status = 0 },
{ .param = "cacheex_localgenerated_only_in_caid", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nCAID table for incoming localgenerated-only filter. Accept only locally generated CWs for these CAIDs. Deprecated: use `cacheex_lg_only_in_tab` instead.\n\n**Format:**\n```ini\ncacheex_localgenerated_only_in_caid = CAID1[,CAID2]...\n```\n\n**Example:**\n```ini\ncacheex_localgenerated_only_in_caid = 0100,0500,1702\n```\n\n**Default:**\n```ini\ncacheex_localgenerated_only_in_caid =\n```", .status = 0 },
{ .param = "cacheex_lg_only_in_tab", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nAllow incoming CWs only if they are lg-flagged for these list of caid/provid(s).\n\nIf provid `FFFFFE` is set, all provids for this caid are valid!\n\n```ini\ncacheex_lg_only_in_tab = caid1:provid1[,provid2];caid2:provid1;\n```", .status = 0 },
{ .param = "cacheex_nopushafter", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CS_CACHEEX_AIO` compilation flag)**\n\nDon't forward CWs from local/proxy-reader via CacheEx, if the defined time_in_ms for the CAID is reached.\n\n```ini\ncacheex_nopushafter = CAID:time_in_ms[,n]\n```", .status = 0 },
{ .param = "cccmaxhops", .config = "user", .section = "account", .text = "**🔵 Parameter depends on setup/program version**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nOnly if CCcam proxies or CCcam server are used!\n\nMaximum hops limit for CCcam clients.\n\n```ini\ncccmaxhops = -1 # CCcam disabled for this user\ncccmaxhops = 0 # local SCs only\ncccmaxhops = 1 # local SCs + 1 hop\ncccmaxhops = 2 # local SCs + 2 hops\n# and so on\n```\n\n**Format:**\n```ini\ncccmaxhops = -1|0-10\n```\n\n**Example:**\n```ini\ncccmaxhops = 3\n```\n\n**Default:**\n```ini\ncccmaxhops = 10\n```", .status = 0 },
{ .param = "cccreshare", .config = "user", .section = "account", .text = "**🔵 Parameter depends on setup/program version**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nReshare level for CCcam clients.\n\n```ini\ncccreshare = -1 # use reshare level defined in oscam.conf (default)\ncccreshare = 0 # reshare for direct peer only\ncccreshare = 1 # resharing for direct peer and next level\n```\n\n**Format:**\n```ini\ncccreshare = -1|0|1|...\n```\n\n**Example:**\n```ini\ncccreshare = 1\n```\n\n**Default:**\n```ini\ncccreshare = -1\n```\n\nReshare could be defined in 2 ways:\n- reader (`cccreshare`)\n- user-account (`cccreshare`)\n\nA card's reshare value is set to the smallest value of the 2 parameters!", .status = 0 },
{ .param = "cccignorereshare", .config = "user", .section = "account", .text = "**🔵 Parameter depends on setup/program version**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nOnly if CCcam proxies or CCcam server are used!\n\nCCcam ignore reshare settings.\n\n```ini\ncccignorereshare = -1 # use ignore reshare level of oscam.conf [ccc] (default)\ncccignorereshare = 0 # use ignore reshare level of server\ncccignorereshare = 1 # use ignore reshare level of reader or user\n```\n\n**Format:**\n```ini\ncccignorereshare = -1|0|1\n```\n\n**Example:**\n```ini\ncccignorereshare = 1\n```\n\n**Default:**\n```ini\ncccignorereshare = -1\n```", .status = 0 },
{ .param = "cccstealth", .config = "user", .section = "account", .text = "**🔵 Parameter depends on setup/program version**\n\n**(requires `MODULE_CCCAM` compilation flag)**\n\nCCcam stealth mode.\n\n```ini\ncccstealth = -1 # use CCcam stealth of oscam.conf [ccc] (default)\ncccstealth = 0 # use extended OSCam-CCcam-protocol\ncccstealth = 1 # behavior like the original CCcam-protocol,\n # no activate partner detection and extended OSCam-CCcam-protocol,\n # prevent other OSCam to detect the server as OSCam-server\n```\n\n**Format:**\n```ini\ncccstealth = -1|0|1\n```\n\n**Example:**\n```ini\ncccstealth = 1\n```\n\n**Default:**\n```ini\ncccstealth = -1\n```", .status = 0 },
{ .param = "lb_nbest_readers", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nSet count of best readers for load balancing.\n\n```ini\nlb_nbest_readers = -1 # use global lb_nbest_readers in oscam.conf\nlb_nbest_readers = 1 # default\n```\n\n**Format:**\n```ini\nlb_nbest_readers = -1|count\n```\n\n**Example:**\n```ini\nlb_nbest_readers = 2\n```\n\n**Default:**\n```ini\nlb_nbest_readers = 1\n```", .status = 0 },
{ .param = "lb_nfb_readers", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nSet count of fallback readers for load balancing for this user.\n\n**Format:**\n```ini\nlb_nfb_readers = -1|count\n```\n\n**Example:**\n```ini\nlb_nfb_readers = 2\n```\n\n**Default:**\n```ini\nlb_nfb_readers = -1\n```\n\n`-1` = use global lb_nfb_readers in oscam.conf", .status = 0 },
{ .param = "lb_nbest_percaid", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `WITH_LB` compilation flag)**\n\nSet count of best readers per CAIDs for load balancing, wildcards CAIDs with two-digit CAIDs possible.\n\n**Example:**\n```ini\nlb_nbest_percaid = 0100:4,0200:3,03:2,04:1 # wildcards CAIDs 03xx and 04xx\n```\n\n**Default:** none", .status = 0 },
{ .param = "cwc_disable", .config = "user", .section = "account", .text = "**🟢 Optional parameter**\n\n**(requires `CW_CYCLE_CHECK` compilation flag)**\n\nDisable CW cycle check for this user.\n\n```ini\ncwc_disable = 0 # default\ncwc_disable = 1 # disable cw cycle check\n```\n\n**Format:**\n```ini\ncwc_disable = 0|1\n```\n\n**Example:**\n```ini\ncwc_disable = 1\n```\n\n**Default:**\n```ini\ncwc_disable = 0\n```", .status = 0 },
};
int32_t wiki_count(void)
{
return sizeof(wiki_entries) / sizeof(struct wiki_entry);
}
const struct wiki_entry *wiki_get_entries(void)
{
return wiki_entries;
}
void webif_wiki_prepare(void)
{
cs_log("wiki: %d help entries loaded", wiki_count());
}
void webif_wiki_free(void)
{
/* nothing to free in uncompressed mode */
}
const char *wiki_get_help(const char *config, const char *section, const char *param)
{
int32_t i;
int32_t count = wiki_count();
const char *fallback = NULL;
for(i = 0; i < count; i++)
{
if(strcmp(wiki_entries[i].config, config) == 0 &&
strcmp(wiki_entries[i].param, param) == 0)
{
if(section && section[0] && strcmp(wiki_entries[i].section, section) == 0)
return wiki_entries[i].text;
if(!fallback)
fallback = wiki_entries[i].text;
}
}
return fallback;
}
int8_t wiki_get_status(const char *config, const char *section, const char *param)
{
int32_t i;
int32_t count = wiki_count();
int8_t fallback = -1;
for(i = 0; i < count; i++)
{
if(strcmp(wiki_entries[i].config, config) == 0 &&
strcmp(wiki_entries[i].param, param) == 0)
{
if(section && section[0] && strcmp(wiki_entries[i].section, section) == 0)
return wiki_entries[i].status;
if(fallback < 0)
fallback = wiki_entries[i].status;
}
}
return fallback;
}
#endif /* WEBIF && WEBIF_WIKI */