/* * 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 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 }, { .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 }, { .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 =
,,\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 }, { .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 = "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: :|||\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 = "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 = "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 = "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 = "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 = "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 = "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 = [&][:][,[&][:target ]]...\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 =