alias_dns.c revision ce228314445e73573b71dc62adb4954f8225059a
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/* see RFC 1035(4.1.1) */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint8_t rdata[1]; /*depends on value at rdata_len */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/* see RFC 1035(4.1) */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic int dns_alias_handler(PNATState pData, int type);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncfingerprint(struct libalias *la, struct ip *pip, struct alias_data *ah)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (ah->dport == NULL || ah->sport == NULL || ah->lnk == NULL)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return (-1);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync fprintf(stderr, "NAT:%s: ah(dport: %hd, sport: %hd) oaddr:%R[IP4] aaddr:%R[IP4]\n",
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync __FUNCTION__, ntohs(*ah->dport), ntohs(*ah->sport),
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync && (ah->oaddr->s_addr == htonl(ntohl(la->special_addr.s_addr)|CTL_DNS)))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return (0);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return (-1);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncstatic void doanswer(struct libalias *la, union dnsmsg_header *hdr,char *qname, struct ip *pip, struct hostent *h)
a2544ef163bb615c50680a75e0958e2eb801727avboxsync /*!!! We need to be sure that */
a2544ef163bb615c50680a75e0958e2eb801727avboxsync /*here is no compressed names+answers + new query*/
a2544ef163bb615c50680a75e0958e2eb801727avboxsync m_inc(m, h->h_length * sizeof(struct dnsmsg_answer) + strlen(qname) + 2 * sizeof(uint16_t));
a2544ef163bb615c50680a75e0958e2eb801727avboxsync packet_len = (pip->ip_hl << 2) + sizeof(struct udphdr) + sizeof(union dnsmsg_header)
a2544ef163bb615c50680a75e0958e2eb801727avboxsync + strlen(qname) + 2 * sizeof(uint16_t); /* ip + udp + header + query */
a2544ef163bb615c50680a75e0958e2eb801727avboxsync fprintf(stderr,"got %d addresses for target:%s (m_len: %d)\n", h->h_length, h->h_name, m->m_len);
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync /*add aliases */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync answers = (char *)&ans[1] + len - 2; /* note: 1 symbol already counted */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync packet_len += sizeof(struct dnsmsg_answer) + len - 2;
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync /*add addresses */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync for(i = 0; i < h->h_length && h->h_addr_list[i] != NULL; ++i)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct dnsmsg_answer *ans = (struct dnsmsg_answer *)answers;
a2544ef163bb615c50680a75e0958e2eb801727avboxsync *(uint32_t *)ans->rdata = *(uint32_t *)h->h_addr_list[i];
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync /*don't forget update m_len*/
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsyncprotohandler(struct libalias *la, struct ip *pip, struct alias_data *ah)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync /*Parse dns request */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return 0; /* this is respose*/
a2544ef163bb615c50680a75e0958e2eb801727avboxsync qw_qtype = (uint16_t *)(qw_qname + strlen(qw_qname) + 1);
a2544ef163bb615c50680a75e0958e2eb801727avboxsync /*we've chenged size and conten of udp, to avoid double csum calcualtion
a2544ef163bb615c50680a75e0958e2eb801727avboxsync *will assign to zero
a2544ef163bb615c50680a75e0958e2eb801727avboxsync udp->uh_ulen = ntohs(htons(pip->ip_len) - (pip->ip_hl << 2));
a2544ef163bb615c50680a75e0958e2eb801727avboxsync pip->ip_sum = LibAliasInternetChecksum(la, (char *)pip, pip->ip_hl << 2);
a2544ef163bb615c50680a75e0958e2eb801727avboxsync return (0);
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * qstr is z-string with -dot- replaced with \count to next -dot-
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * e.g. ya.ru is \02ya\02ru
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * Note: it's assumed that caller allocates buffer for cstr
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync while(*q != 0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else if (c != &cname[0])
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync char *c, *pc, *q;
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync while(*c != 0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync /* a the begining or at -dot- position */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync if (c != cstr) c++;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync (*q) = (*c); /*direct copy*/
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync handlers = RTMemAllocZ(2 * sizeof(struct proto_handler));