Changeset 5667 for trunk/module-newcamd.c
- Timestamp:
- 07/17/11 20:23:19 (13 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
Property svn:mergeinfo
set to
/branches/dynamic-threads merged eligible /trunk merged eligible
-
Property svn:mergeinfo
set to
-
trunk/module-newcamd.c
r5571 r5667 127 127 if (!len) { 128 128 cs_debug_mask(D_CLIENT, "nmr: 1 return 0"); 129 network_tcp_connection_close(cl , handle);129 network_tcp_connection_close(cl->reader); 130 130 return 0; 131 131 } 132 132 if (len != 2) { 133 133 cs_debug_mask(D_CLIENT, "nmr: len!=2"); 134 network_tcp_connection_close(cl , handle);134 network_tcp_connection_close(cl->reader); 135 135 return -1; 136 136 } … … 243 243 void newcamd_reply_ka() 244 244 { 245 struct s_client *cl = cur_client(); 246 247 if(!cl->udp_fd) 248 { 249 cs_debug_mask(D_CLIENT, "invalid client fd=%d", cl->udp_fd); 250 return; 251 } 252 253 cs_debug_mask(D_CLIENT, "send keepalive to client fd=%d", cl->udp_fd); 254 255 network_cmd_no_data_send(cl->udp_fd, &cl->ncd_msgid, 256 MSG_KEEPALIVE, cl->ncd_skey,COMMTYPE_SERVER); 245 struct s_client *cl = cur_client(); 246 247 if (!cl) return; 248 249 if(!cl->udp_fd) { 250 cs_debug_mask(D_CLIENT, "invalid client fd=%d", cl->udp_fd); 251 return; 252 } 253 254 cs_debug_mask(D_CLIENT, "send keepalive to client fd=%d", cl->udp_fd); 255 256 if (cl->reader) 257 cl->reader->last_s = time((time_t *)0); 258 259 network_cmd_no_data_send(cl->udp_fd, &cl->ncd_msgid, MSG_KEEPALIVE, cl->ncd_skey,COMMTYPE_SERVER); 257 260 } 258 261 … … 276 279 277 280 // 1. Connect 278 handle = network_tcp_connection_open( );281 handle = network_tcp_connection_open(cl->reader); 279 282 if(handle < 0) return -1; 280 283 … … 283 286 if( read(handle, keymod, sizeof(keymod)) != sizeof(keymod)) { 284 287 cs_log("server does not return 14 bytes"); 285 network_tcp_connection_close(cl , handle);288 network_tcp_connection_close(cl->reader); 286 289 return -2; 287 290 } … … 307 310 { 308 311 cs_log("login failed for user '%s'", cl->reader->r_usr); 309 network_tcp_connection_close(cl , handle);312 network_tcp_connection_close(cl->reader); 310 313 return -3; 311 314 } … … 314 317 cs_log("expected MSG_CLIENT_2_SERVER_LOGIN_ACK (%02X), received %02X", 315 318 MSG_CLIENT_2_SERVER_LOGIN_ACK, login_answer); 316 network_tcp_connection_close(cl , handle);319 network_tcp_connection_close(cl->reader); 317 320 return -3; 318 321 } … … 332 335 cs_log("expected MSG_CARD_DATA (%02X), received %02X", 333 336 MSG_CARD_DATA, buf[2]); 334 network_tcp_connection_close(cl , handle);337 network_tcp_connection_close(cl->reader); 335 338 return -4; 336 339 } … … 574 577 } 575 578 576 static voidnewcamd_auth_client(in_addr_t ip, uint8_t *deskey)579 static int8_t newcamd_auth_client(in_addr_t ip, uint8_t *deskey) 577 580 { 578 581 int32_t i, ok, rc; … … 592 595 { 593 596 cs_auth_client(cl, (struct s_auth *)0, NULL); 594 cs_exit(0);597 return -1; 595 598 } 596 599 … … 611 614 cs_debug_mask(D_CLIENT, "expected MSG_CLIENT_2_SERVER_LOGIN (%02X), received %02X", 612 615 MSG_CLIENT_2_SERVER_LOGIN, mbuf[2]); 613 NULLFREE(cl->req); 614 cs_exit(0); 616 return -1; 615 617 } 616 618 usr=mbuf+5; … … 620 622 { 621 623 cs_debug_mask(D_CLIENT, "bad client login request"); 622 NULLFREE(cl->req); 623 cs_exit(0); 624 return -1; 624 625 } 625 626 … … 717 718 cs_debug_mask(D_CLIENT, "expected MSG_CARD_DATA_REQ (%02X), received %02X", 718 719 MSG_CARD_DATA_REQ, mbuf[2]); 719 NULLFREE(cl->req); 720 cs_exit(0); 720 return -1; 721 721 } 722 722 … … 845 845 mbuf, len, key, COMMTYPE_SERVER, 0, &cd) <0 ) 846 846 { 847 NULLFREE(cl->req); 848 cs_exit(0); 847 return -1; 849 848 } 850 849 } … … 853 852 { 854 853 cs_auth_client(cl, 0, usr ? "login failure" : "no such user"); 855 NULLFREE(cl->req);856 cs_exit(0);857 }854 return -1; 855 } 856 return 0; 858 857 } 859 858 … … 964 963 } 965 964 966 static void * newcamd_server(void *cli) 967 { 968 int32_t rc; 969 struct s_client * client = (struct s_client *) cli; 970 client->thread=pthread_self(); 971 pthread_setspecific(getclient, cli); 972 uchar mbuf[1024]; 973 974 cs_malloc(&client->req,CS_MAXPENDING*REQ_SIZE, 1); 965 966 static void newcamd_server_init(struct s_client *client) { 967 int8_t res = 0; 968 cs_malloc(&client->req,CS_MAXPENDING*REQ_SIZE, 1); 975 969 976 client->ncd_server = 1; 977 cs_log("client connected to %d port", cfg.ncd_ptab.ports[client->port_idx].s_port); 978 979 if (cfg.ncd_ptab.ports[client->port_idx].ncd_key_is_set) { 980 //port has a des key specified 981 newcamd_auth_client(client->ip, cfg.ncd_ptab.ports[client->port_idx].ncd_key); 982 } else { 983 //default global des key 984 newcamd_auth_client(client->ip, cfg.ncd_key); 985 } 986 987 // report all cards if using extended mg proto 988 if (cfg.ncd_mgclient) { 989 cs_debug_mask(D_CLIENT, "newcamd: extended: report all available cards"); 990 int32_t j, k; 991 uint8_t buf[512]; 992 custom_data_t *cd = malloc(sizeof(struct custom_data)); 993 memset(cd, 0, sizeof(struct custom_data)); 994 memset(buf, 0, sizeof(buf)); 995 996 buf[0] = MSG_SERVER_2_CLIENT_ADDCARD; 997 998 struct s_reader *rdr; 999 for (rdr=first_active_reader; rdr ; rdr=rdr->next) { 1000 int32_t flt = 0; 1001 if (!(rdr->grp & client->grp)) continue; //test - skip unaccesible readers 1002 if (rdr->ftab.filts) { 1003 for (j=0; j<CS_MAXFILTERS; j++) { 1004 if (rdr->ftab.filts[j].caid) { 1005 cd->caid = rdr->ftab.filts[j].caid; 1006 for (k=0; k<rdr->ftab.filts[j].nprids; k++) { 1007 cd->provid = rdr->ftab.filts[j].prids[k]; 1008 cs_debug_mask(D_CLIENT, "newcamd: extended: report card"); 1009 1010 network_message_send(client->udp_fd, 1011 &client->ncd_msgid, buf, 3, 1012 client->ncd_skey, COMMTYPE_SERVER, 0, cd); 1013 1014 flt = 1; 1015 } 1016 } 1017 } 1018 } 1019 1020 if (rdr->caid && !flt) { 1021 if ((rdr->tcp_connected || rdr->card_status == CARD_INSERTED)) { 1022 cd->caid = rdr->caid; 1023 for (j=0; j<rdr->nprov; j++) { 1024 cd->provid = (rdr->prid[j][1]) << 16 | (rdr->prid[j][2] << 8) | rdr->prid[j][3]; 1025 cs_debug_mask(D_CLIENT, "newcamd: extended: report card"); 1026 network_message_send(client->udp_fd, 1027 &client->ncd_msgid, buf, 3, 1028 client->ncd_skey, COMMTYPE_SERVER, 0, cd); 1029 } 1030 } 1031 } 1032 } 1033 free(cd); 1034 } 1035 1036 // check for clienttimeout, if timeout occurs try to send keepalive / wait for answer 1037 // befor client was disconnected. If keepalive was disabled, exit after clienttimeout 1038 rc=-9; 1039 while(rc==-9) 1040 { 1041 if (!client->pfd) break; 1042 1043 // process_input returns -9 on clienttimeout 1044 while ((rc=process_input(mbuf, sizeof(mbuf), cfg.cmaxidle))>0) 1045 { 1046 switch(mbuf[2]) 1047 { 1048 case 0x80: 1049 case 0x81: 1050 newcamd_process_ecm(mbuf); 1051 break; 1052 1053 case MSG_KEEPALIVE: 1054 newcamd_reply_ka(); 1055 break; 1056 1057 default: 1058 if(mbuf[2]>0x81 && mbuf[2]<0x90) 1059 newcamd_process_emm(mbuf+2); 1060 else 1061 { 1062 cs_debug_mask(D_CLIENT, "unknown newcamd command! (%d)", mbuf[2]); 1063 } 1064 } 1065 } 1066 1067 if(rc==-9) 1068 { 1069 if (client->ncd_keepalive) 1070 newcamd_reply_ka(); 1071 else 1072 rc=0; 1073 } 1074 } 1075 1076 NULLFREE(client->req); 1077 cs_disconnect_client(client); 1078 return NULL; 970 client->ncd_server = 1; 971 cs_log("client connected to %d port", cfg.ncd_ptab.ports[client->port_idx].s_port); 972 973 if (cfg.ncd_ptab.ports[client->port_idx].ncd_key_is_set) { 974 //port has a des key specified 975 res = newcamd_auth_client(client->ip, cfg.ncd_ptab.ports[client->port_idx].ncd_key); 976 } else { 977 //default global des key 978 res = newcamd_auth_client(client->ip, cfg.ncd_key); 979 } 980 981 if (res == -1) { 982 cs_disconnect_client(client); 983 return; 984 } 985 986 // report all cards if using extended mg proto 987 if (cfg.ncd_mgclient) { 988 cs_debug_mask(D_CLIENT, "newcamd: extended: report all available cards"); 989 int32_t j, k; 990 uint8_t buf[512]; 991 custom_data_t *cd = malloc(sizeof(struct custom_data)); 992 memset(cd, 0, sizeof(struct custom_data)); 993 memset(buf, 0, sizeof(buf)); 994 995 buf[0] = MSG_SERVER_2_CLIENT_ADDCARD; 996 struct s_reader *rdr; 997 for (rdr=first_active_reader; rdr ; rdr=rdr->next) { 998 int32_t flt = 0; 999 if (!(rdr->grp & client->grp)) continue; //test - skip unaccesible readers 1000 if (rdr->ftab.filts) { 1001 for (j=0; j<CS_MAXFILTERS; j++) { 1002 if (rdr->ftab.filts[j].caid) { 1003 cd->caid = rdr->ftab.filts[j].caid; 1004 for (k=0; k<rdr->ftab.filts[j].nprids; k++) { 1005 cd->provid = rdr->ftab.filts[j].prids[k]; 1006 cs_debug_mask(D_CLIENT, "newcamd: extended: report card"); 1007 network_message_send(client->udp_fd, &client->ncd_msgid, buf, 3, client->ncd_skey, COMMTYPE_SERVER, 0, cd); 1008 flt = 1; 1009 } 1010 } 1011 } 1012 } 1013 1014 if (rdr->caid && !flt) { 1015 if ((rdr->tcp_connected || rdr->card_status == CARD_INSERTED)) { 1016 cd->caid = rdr->caid; 1017 for (j=0; j<rdr->nprov; j++) { 1018 cd->provid = (rdr->prid[j][1]) << 16 | (rdr->prid[j][2] << 8) | rdr->prid[j][3]; 1019 cs_debug_mask(D_CLIENT, "newcamd: extended: report card"); 1020 network_message_send(client->udp_fd, &client->ncd_msgid, buf, 3, client->ncd_skey, COMMTYPE_SERVER, 0, cd); 1021 } 1022 } 1023 } 1024 } 1025 free(cd); 1026 } 1027 1028 } 1029 1030 static void * newcamd_server(struct s_client *client, uchar *mbuf, int len) 1031 { 1032 client = client; 1033 // check for clienttimeout, if timeout occurs try to send keepalive / wait for answer 1034 // befor client was disconnected. If keepalive was disabled, exit after clienttimeout 1035 1036 if (len<3) 1037 return NULL; 1038 1039 switch(mbuf[2]) { 1040 case 0x80: 1041 case 0x81: 1042 newcamd_process_ecm(mbuf); 1043 break; 1044 1045 case MSG_KEEPALIVE: 1046 newcamd_reply_ka(); 1047 break; 1048 1049 default: 1050 if(mbuf[2]>0x81 && mbuf[2]<0x90) 1051 newcamd_process_emm(mbuf+2); 1052 else { 1053 cs_debug_mask(D_CLIENT, "unknown newcamd command! (%d)", mbuf[2]); 1054 } 1055 } 1056 1057 return NULL; 1058 } 1059 1060 void newcamd_idle() { 1061 struct s_client *client = cur_client(); 1062 struct s_reader *rdr = client->reader; 1063 1064 if (!rdr) return; 1065 1066 time_t now; 1067 int32_t time_diff; 1068 time(&now); 1069 time_diff = abs(now - rdr->last_s); 1070 if (time_diff>(rdr->tcp_ito*60)) { 1071 if (client->ncd_keepalive) 1072 newcamd_reply_ka(); 1073 else 1074 network_tcp_connection_close(client->reader); 1075 } 1079 1076 } 1080 1077 … … 1085 1082 int32_t newcamd_client_init(struct s_client *client) 1086 1083 { 1087 struct sockaddr_in loc_sa; 1088 char ptxt[16]; 1089 1090 client->pfd=0; 1091 if (client->reader->r_port<=0) 1092 { 1093 cs_log("invalid port %d for server %s", client->reader->r_port, client->reader->device); 1094 return(1); 1095 } 1096 1097 client->ip=0; 1098 memset((char *)&loc_sa,0,sizeof(loc_sa)); 1099 loc_sa.sin_family = AF_INET; 1100 #ifdef LALL 1101 if (cfg.serverip[0]) 1102 loc_sa.sin_addr.s_addr = inet_addr(cfg.serverip); 1103 else 1104 #endif 1105 loc_sa.sin_addr.s_addr = INADDR_ANY; 1106 loc_sa.sin_port = htons(client->reader->l_port); 1107 1108 if ((client->udp_fd=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))<0) 1109 { 1110 cs_log("Socket creation failed (errno=%d %s)", errno, strerror(errno)); 1111 cs_exit(1); 1112 } 1113 1114 #ifdef SO_PRIORITY 1115 if (cfg.netprio) 1116 setsockopt(client->udp_fd, SOL_SOCKET, SO_PRIORITY, 1117 (void *)&cfg.netprio, sizeof(uintptr_t)); 1118 #endif 1119 if (!client->reader->tcp_ito) { 1120 uint32_t keep_alive = client->reader->tcp_ito?1:0; 1121 setsockopt(client->udp_fd, SOL_SOCKET, SO_KEEPALIVE, 1122 (void *)&keep_alive, sizeof(uintptr_t)); 1123 } 1124 1125 if (client->reader->l_port>0) 1126 { 1127 if (bind(client->udp_fd, (struct sockaddr *)&loc_sa, sizeof (loc_sa))<0) 1128 { 1129 cs_log("bind failed (errno=%d %s)", errno, strerror(errno)); 1130 close(client->udp_fd); 1131 return(1); 1132 } 1133 snprintf(ptxt, sizeof(ptxt), ", port=%d", client->reader->l_port); 1134 } 1135 else 1136 ptxt[0]='\0'; 1137 1138 memset((char *)&client->udp_sa,0,sizeof(client->udp_sa)); 1139 client->udp_sa.sin_family = AF_INET; 1140 client->udp_sa.sin_port = htons((uint16_t)client->reader->r_port); 1084 1085 char ptxt[1] = { "\0" }; 1141 1086 1142 1087 client->ncd_proto=client->reader->ncd_proto; … … 1223 1168 ph->s_ip=cfg.ncd_srvip; 1224 1169 ph->s_handler=newcamd_server; 1170 ph->s_init=newcamd_server_init; 1225 1171 ph->recv=newcamd_recv; 1226 1172 ph->send_dcw=newcamd_send_dcw; … … 1233 1179 ph->c_send_ecm=newcamd_send_ecm; 1234 1180 ph->c_send_emm=newcamd_send_emm; 1181 ph->c_idle = newcamd_idle; 1235 1182 ph->num=R_NEWCAMD; 1236 1183 }
Note:
See TracChangeset
for help on using the changeset viewer.