Changeset 4744 for trunk/module-cccam.c
- Timestamp:
- 02/23/11 19:23:08 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-cccam.c
r4712 r4744 1 1 #include <string.h> 2 2 #include <stdlib.h> 3 3 #include "globals.h" … … 17 17 18 18 static uint8 cc_node_id[8]; 19 static uint32 cc_share_id = 0x64; 19 20 20 21 #define getprefix() ((struct cc_data *)(cl->cc))->prefix … … 1704 1705 } 1705 1706 1706 void cc_card_removed(struct s_client *cl, uint32 shareid) {1707 struct cc_data *cc = cl->cc;1708 struct cc_card *card;1709 LL_ITER *it = ll_iter_create(cc->cards);1710 1711 while ((card = ll_iter_next(it))) {1712 if (card->id == shareid) {// && card->sub_id == b2i (3, buf + 9)) {1713 //cs_debug_mask(D_CLIENT, "cccam: card %08x removed, caid %04X, count %d",1714 // card->id, card->caid, ll_count(cc->cards));1715 ll_iter_remove(it);1716 if (cc->last_emm_card == card) {1717 cc->last_emm_card = NULL;1718 cs_debug_mask(D_READER, "%s current card %08x removed!",1719 getprefix(), card->id);1720 }1721 free_extended_ecm_idx_by_card(cl, card);1722 cc_free_card(card);1723 cc->cards_modified++;1724 //break;1725 }1726 }1727 ll_iter_release(it);1728 }1729 1730 void move_card_to_end(struct s_client * cl, struct cc_card *card_to_move) {1731 1732 struct cc_data *cc = cl->cc;1733 1734 LL_ITER *it = ll_iter_create(cc->cards);1735 struct cc_card *card;1736 while ((card = ll_iter_next(it))) {1737 if (card == card_to_move) {1738 ll_iter_remove(it);1739 break;1740 }1741 }1742 ll_iter_release(it);1743 if (card) {1744 cs_debug_mask(D_READER, "%s CMD05: Moving card %08X to the end...", getprefix(), card_to_move->id);1745 free_extended_ecm_idx_by_card(cl, card);1746 ll_append(cc->cards, card_to_move);1747 }1748 }1749 1750 1751 1707 /** 1752 1708 * if idents defined on an cccam reader, the cards caid+provider are checked. … … 1791 1747 return res; 1792 1748 } 1749 1750 1751 int card_valid_for_client(struct s_client *cl, struct cc_card *card) { 1752 1753 struct s_reader *rdr = card->origin_reader; 1754 //Check group: 1755 if (!(rdr->grp & cl->grp)) 1756 return 0; 1757 1758 if (!chk_ident(&cl->ftab, card) || (rdr && !chk_ident(&rdr->ftab, card))) 1759 return 0; 1760 1761 //Check caids: 1762 if (!chk_ctab(card->caid, &cl->ctab) || (rdr && !chk_ctab(card->caid, &rdr->ctab))) 1763 return 0; 1764 1765 //Check reshare/maxdown: 1766 if ((cfg.cc_ignore_reshare || cl->account->cccignorereshare || card->maxdown > 0)) { 1767 int ignore = 0; 1768 1769 //Check Services: 1770 LL_ITER *it2 = ll_iter_create(card->providers); 1771 struct cc_provider *prov; 1772 while ((prov = ll_iter_next(it2))) { 1773 ulong prid = prov->prov; 1774 if (!chk_srvid_by_caid_prov(cl, card->caid, prid) || 1775 !chk_srvid_by_caid_prov(rdr->client, card->caid, prid)) { 1776 ignore = 1; 1777 break; 1778 } 1779 } 1780 ll_iter_release(it2); 1781 return !ignore; 1782 } 1783 1784 return 0; 1785 } 1786 1787 int send_card_to_clients(struct cc_card *card, struct s_client *one_client) { 1788 int count = 0; 1789 if (!one_client) 1790 cs_debug_mask(D_TRACE, "forwarding new card: %08X caid %04X", card->id, card->caid); 1791 1792 if (cfg.cc_minimize_cards == MINIMIZE_TRANSPARENT) { //TRANSPARENT MODE 1793 uint8 buf[CC_MAXMSGSIZE]; 1794 1795 struct s_client *cl; 1796 for (cl = one_client?one_client:first_client; cl; cl=one_client?NULL:cl->next) { 1797 struct cc_data *cc = cl->cc; 1798 if (ph[cl->ctyp].num == R_CCCAM && cc) { //CCCam-Client! 1799 if (card_valid_for_client(cl, card)) { 1800 1801 int usr_reshare = cl->account->cccreshare; 1802 int usr_ignorereshare = cl->account->cccignorereshare; 1803 1804 int reader_reshare = card->origin_reader->cc_reshare; 1805 int reshare = (reader_reshare < usr_reshare) ? reader_reshare : usr_reshare; 1806 if (reshare < 0) 1807 continue; 1808 1809 int new_reshare = 1810 ( cfg.cc_ignore_reshare || usr_ignorereshare ) ? reshare 1811 : (card->maxdown - 1); 1812 if (new_reshare > reshare) 1813 new_reshare = reshare; 1814 1815 int len = write_card(cc, buf, card, 1, cc->cccam220, ll_count(cl->aureader_list)); 1816 if (!card->internal_id) 1817 card->internal_id = cc_share_id++; 1818 1819 buf[0] = card->internal_id >> 24; 1820 buf[1] = card->internal_id >> 16; 1821 buf[2] = card->internal_id >> 8; 1822 buf[3] = card->internal_id & 0xFF; 1823 //buf[10] = card->hop-1; 1824 buf[11] = new_reshare; 1825 1826 cc_cmd_send(cl, buf, len, cc->cccam220?MSG_NEW_CARD_SIDINFO:MSG_NEW_CARD); 1827 count++; 1828 } 1829 } 1830 } 1831 } 1832 return count; 1833 } 1834 1835 void send_remove_card_to_clients(struct cc_card *card) { 1836 if (cfg.cc_minimize_cards == MINIMIZE_TRANSPARENT) { //TRANSPARENT MODE 1837 uint8 buf[4]; 1838 buf[0] = card->internal_id >> 24; 1839 buf[1] = card->internal_id >> 16; 1840 buf[2] = card->internal_id >> 8; 1841 buf[3] = card->internal_id & 0xFF; 1842 1843 struct s_client *cl; 1844 for (cl = first_client; cl; cl=cl->next) { 1845 if (cl->ctyp == R_CCCAM && cl->cc) { //CCCam-Client! 1846 if (card_valid_for_client(cl, card)) { 1847 cc_cmd_send(cl, buf, 4, MSG_CARD_REMOVED); 1848 } 1849 } 1850 } 1851 } 1852 } 1853 1854 1855 void cc_card_removed(struct s_client *cl, uint32 shareid) { 1856 struct cc_data *cc = cl->cc; 1857 struct cc_card *card; 1858 LL_ITER *it = ll_iter_create(cc->cards); 1859 1860 while ((card = ll_iter_next(it))) { 1861 if (card->id == shareid) {// && card->sub_id == b2i (3, buf + 9)) { 1862 //cs_debug_mask(D_CLIENT, "cccam: card %08x removed, caid %04X, count %d", 1863 // card->id, card->caid, ll_count(cc->cards)); 1864 ll_iter_remove(it); 1865 if (cc->last_emm_card == card) { 1866 cc->last_emm_card = NULL; 1867 cs_debug_mask(D_READER, "%s current card %08x removed!", 1868 getprefix(), card->id); 1869 } 1870 free_extended_ecm_idx_by_card(cl, card); 1871 send_remove_card_to_clients(card); 1872 cc_free_card(card); 1873 cc->cards_modified++; 1874 //break; 1875 } 1876 } 1877 ll_iter_release(it); 1878 } 1879 1880 void move_card_to_end(struct s_client * cl, struct cc_card *card_to_move) { 1881 1882 struct cc_data *cc = cl->cc; 1883 1884 LL_ITER *it = ll_iter_create(cc->cards); 1885 struct cc_card *card; 1886 while ((card = ll_iter_next(it))) { 1887 if (card == card_to_move) { 1888 ll_iter_remove(it); 1889 break; 1890 } 1891 } 1892 ll_iter_release(it); 1893 if (card) { 1894 cs_debug_mask(D_READER, "%s CMD05: Moving card %08X to the end...", getprefix(), card_to_move->id); 1895 free_extended_ecm_idx_by_card(cl, card); 1896 ll_append(cc->cards, card_to_move); 1897 } 1898 } 1899 1793 1900 1794 1901 … … 1945 2052 struct cc_card *card = read_card(data, buf[1]==MSG_NEW_CARD_SIDINFO); 1946 2053 card->origin_reader = rdr; 2054 card->origin_id = card->id; 1947 2055 1948 2056 //Check if this card is from us: … … 1983 2091 card->time = time((time_t) 0); 1984 2092 if (!old_card) { 2093 card->internal_id = cc_share_id++; 1985 2094 card->hop++; //inkrementing hop 1986 2095 ll_append(cc->cards, card); 1987 2096 set_au_data(cl, rdr, card, NULL); 1988 2097 cc->cards_modified++; 2098 send_card_to_clients(card, NULL); 1989 2099 } 1990 2100 } … … 2812 2922 int add_card_to_serverlist(struct s_reader *rdr, struct s_client *cl, LLIST *cardlist, struct cc_card *card, int reshare, int au_allowed) { 2813 2923 2924 if (cfg.cc_minimize_cards == MINIMIZE_TRANSPARENT) { 2925 return send_card_to_clients(card, cl); 2926 } 2927 2814 2928 if (!chk_ident(&cl->ftab, card)) 2815 2929 return 0; … … 2894 3008 2895 3009 } 2896 2897 3010 //like cccam: 2898 3011 else { //just remove duplicate cards (same ids) … … 3062 3175 3063 3176 //User-Services: 3064 if (cfg.cc_reshare_services==3 && cfg. sidtab && cl->sidtabok) {3177 if (cfg.cc_reshare_services==3 && cfg.cc_minimize_cards != MINIMIZE_TRANSPARENT && cfg.sidtab && cl->sidtabok) { 3065 3178 struct s_sidtab *ptr; 3066 3179 for (j=0,ptr=cfg.sidtab; ptr; ptr=ptr->next,j++) { … … 3309 3422 3310 3423 int ok = TRUE; 3311 //report reshare cards: 3312 //cs_debug_mask(D_TRACE, "%s reporting %d cards", getprefix(), ll_count(server_cards)); 3313 LL_ITER *it = ll_iter_create(server_cards); 3314 struct cc_card *card; 3315 while (ok && (card = ll_iter_next(it))) { 3316 //cs_debug_mask(D_TRACE, "%s card %d caid %04X hop %d", getprefix(), card->id, card->caid, card->hop); 3424 if (cfg.cc_minimize_cards == MINIMIZE_TRANSPARENT) { //add_to_server_list alread reported the cards! 3425 //so just clean up: 3426 cc_free_cardlist(server_cards, TRUE); 3427 cc_free_cardlist(new_reported_carddatas, TRUE); 3428 } 3429 else { 3430 //report reshare cards: 3431 //cs_debug_mask(D_TRACE, "%s reporting %d cards", getprefix(), ll_count(server_cards)); 3432 LL_ITER *it = ll_iter_create(server_cards); 3433 struct cc_card *card; 3434 while (ok && (card = ll_iter_next(it))) { 3435 //cs_debug_mask(D_TRACE, "%s card %d caid %04X hop %d", getprefix(), card->id, card->caid, card->hop); 3317 3436 3318 ok = report_card(cl, card, new_reported_carddatas, isau) >= 0; 3319 ll_iter_remove(it); 3320 } 3321 ll_iter_release(it); 3322 cc_free_cardlist(server_cards, TRUE); 3323 3324 //remove unsed, remaining cards: 3325 cc->card_removed_count += cc_free_reported_carddata(cl, cc->reported_carddatas, new_reported_carddatas, ok); 3326 cc->reported_carddatas = new_reported_carddatas; 3327 3328 cs_debug_mask(D_CLIENT, "%s reported/updated +%d/-%d/dup %d of %d cards to client (ext=%d)", getprefix(), 3329 cc->card_added_count, cc->card_removed_count, cc->card_dup_count, ll_count(cc->reported_carddatas), cc->cccam220); 3437 ok = report_card(cl, card, new_reported_carddatas, isau) >= 0; 3438 ll_iter_remove(it); 3439 } 3440 ll_iter_release(it); 3441 cc_free_cardlist(server_cards, TRUE); 3442 3443 //remove unsed, remaining cards: 3444 cc->card_removed_count += cc_free_reported_carddata(cl, cc->reported_carddatas, new_reported_carddatas, ok); 3445 cc->reported_carddatas = new_reported_carddatas; 3446 3447 cs_debug_mask(D_CLIENT, "%s reported/updated +%d/-%d/dup %d of %d cards to client (ext=%d)", getprefix(), 3448 cc->card_added_count, cc->card_removed_count, cc->card_dup_count, ll_count(cc->reported_carddatas), cc->cccam220); 3449 } 3330 3450 return ok; 3331 3451 }
Note:
See TracChangeset
for help on using the changeset viewer.