/* ProcessSSDPRequest() * process SSDP M-SEARCH requests and responds to them */ void ProcessSSDPRequest(int s, unsigned short port) { int n; char bufr[1500]; socklen_t len_r; #ifdef ENABLE_IPV6 struct sockaddr_storage sendername; len_r = sizeof(struct sockaddr_storage); #else struct sockaddr_in sendername; len_r = sizeof(struct sockaddr_in); #endif n = recvfrom(s, bufr, sizeof(bufr), 0, (struct sockaddr *)&sendername, &len_r); if(n < 0) { /* EAGAIN, EWOULDBLOCK, EINTR : silently ignore (try again next time) * other errors : log to LOG_ERR */ if(errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR) { syslog(LOG_ERR, "recvfrom(udp): %m"); } return; } ProcessSSDPData(s, bufr, n, (struct sockaddr *)&sendername, port); }
/* ProcessSSDPRequest() * process SSDP M-SEARCH requests and responds to them */ void ProcessSSDPRequest(int s, unsigned short port) { int n; char bufr[1500]; socklen_t len_r; /* BEGIN 2082304944 zhoujianchun 00203875 2012.8.29 added */ int i = 0; char *ptr = NULL; /* END 2082304944 zhoujianchun 00203875 2012.8.29 added */ #ifdef ENABLE_IPV6 struct sockaddr_storage sendername; len_r = sizeof(struct sockaddr_storage); #else struct sockaddr_in sendername; len_r = sizeof(struct sockaddr_in); #endif n = recvfrom(s, bufr, sizeof(bufr), 0, (struct sockaddr *)&sendername, &len_r); if(n < 0) { NP_UPNP_ERROR("recvfrom(udp): %s\n", strerror(errno)); return; } /* BEGIN 2082304944 zhoujianchun 00203875 2012.8.29 added */ for(i = 0; i < n; i++) { /* BEGIN 2092807655 zhoujianchun 00203875 2012.9.28 modified */ if((0 == strncasecmp(bufr + i, "MAN:", strlen("MAN:"))) &&(('\n' == (char)(*(bufr + i - 1))) || ('\r' == (char)(*(bufr + i - 1))))) /* END 2092807655 zhoujianchun 00203875 2012.9.28 modified */ { ptr = bufr + i + strlen("MAN:"); while(isspace(*ptr)) { ptr++; } if(0 != strncasecmp(ptr, "\"ssdp:discover\"", strlen("\"ssdp:discover\""))) { NP_UPNP_ERROR("M-SEARCH WITH WRONG MAN HEADER.\n"); return; } } } /* END 2082304944 zhoujianchun 00203875 2012.8.29 added */ ProcessSSDPData(s, bufr, n, (struct sockaddr *)&sendername, port); }
/* ProcessSSDPRequest() * process SSDP M-SEARCH requests and responds to them */ void ProcessSSDPRequest(int s, unsigned short port) { int n; char bufr[1500]; socklen_t len_r; struct sockaddr_in sendername; len_r = sizeof(struct sockaddr_in); n = recvfrom(s, bufr, sizeof(bufr), 0, (struct sockaddr *)&sendername, &len_r); if(n < 0) { syslog(LOG_ERR, "recvfrom(udp): %m"); return; } ProcessSSDPData(s, bufr, sendername, n, port); }
static int nfqueue_cb( struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, struct nfq_data *nfa, void *data) { char *pkt; struct nfqnl_msg_packet_hdr *ph; ph = nfq_get_msg_packet_hdr(nfa); if ( ph ) { int id = 0, size = 0; id = ntohl(ph->packet_id); size = nfq_get_payload(nfa, &pkt); struct ip *iph = (struct ip *) pkt; int id_protocol = identify_ip_protocol(pkt); int dport = get_udp_dst_port(pkt); int x = sizeof (struct ip) + sizeof (struct udphdr); /* packets we are interested in are UDP multicast to 239.255.255.250:1900 * and start with a data string M-SEARCH */ if ( (dport == 1900) && (id_protocol == IPPROTO_UDP) && (ssdp.sin_addr.s_addr == iph->ip_dst.s_addr) ) { /* get the index that the packet came in on */ u_int32_t idx = nfq_get_indev(nfa); int i = 0; for ( ;i < n_nfqix ; i++) { if ( nfqix[i] == idx ) { struct udphdr *udp = (struct udphdr *) (pkt + sizeof(struct ip)); char *dd = pkt + x; struct sockaddr_in sendername; sendername.sin_family = AF_INET; sendername.sin_port = udp->source; sendername.sin_addr.s_addr = iph->ip_src.s_addr; /* printf("pkt found %s\n",dd);*/ ProcessSSDPData (sudp, dd, size - x, &sendername, (unsigned short) 5555); } } } nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL); } else { syslog(LOG_ERR,"nfq_get_msg_packet_hdr failed"); return 1; /* from nfqueue source: 0 = ok, >0 = soft error, <0 hard error */ } return 0; }