Lines Matching refs:datagram

28  *	Contains base code for netbios datagram service.
42 * - MAX_DATAGRAM_LENGTH: the maximum length of an IP datagram. The
45 * datagram. Implementations are expected to be capable of
137 * datagram assembly queue.
148 struct datagram *entry;
149 struct datagram *next;
154 entry != (struct datagram *)((uintptr_t)&smb_datagram_queue);
169 struct datagram *entry;
173 (struct datagram *)((uintptr_t)&smb_datagram_queue)) {
207 * * build datagram service UDP packet;
234 * * fragment NetBIOS datagram into 2 UDP packets
298 * M 7 MORE flag, If set then more NetBIOS datagram
303 * datagram
337 syslog(LOG_ERR, "nbt datagram: send: %m");
417 syslog(LOG_ERR, "nbt datagram: send_to_net: %m");
475 smb_datagram_decode(struct datagram *datagram, int bytes)
482 if (datagram->rawbuf[0] == DATAGRAM_TYPE_ERROR_DATAGRAM)
483 smb_netbios_datagram_error(datagram->rawbuf);
489 ha_src = &datagram->rawbuf[DATAGRAM_HEADER_LENGTH];
493 bzero(&datagram->src, sizeof (struct name_entry));
494 bzero(&datagram->dest, sizeof (struct name_entry));
496 datagram->rawbytes = bytes;
497 datagram->packet_type = datagram->rawbuf[0];
498 datagram->flags = datagram->rawbuf[1];
499 datagram->datagram_id = BE_IN16(&datagram->rawbuf[2]);
501 datagram->src.addr_list.sinlen = sizeof (struct sockaddr_in);
502 (void) memcpy(&datagram->src.addr_list.sin.sin_addr.s_addr,
503 &datagram->rawbuf[4], sizeof (uint32_t));
504 (void) memcpy(&datagram->src.addr_list.sin.sin_port,
505 &datagram->rawbuf[8], sizeof (uint16_t));
506 datagram->src.addr_list.forw = datagram->src.addr_list.back =
507 &datagram->src.addr_list;
509 datagram->data = data;
510 datagram->data_length = BE_IN16(&datagram->rawbuf[10]);
511 datagram->offset = BE_IN16(&datagram->rawbuf[12]);
513 if (smb_first_level_name_decode(ha_src, &datagram->src) < 0) {
515 inet_ntoa(datagram->src.addr_list.sin.sin_addr));
520 datagram->dest.addr_list.forw = datagram->dest.addr_list.back =
521 &datagram->dest.addr_list;
523 if (smb_first_level_name_decode(ha_dest, &datagram->dest) < 0) {
525 inet_ntoa(datagram->src.addr_list.sin.sin_addr));
533 /* ignore other malformed datagram packets */
587 * * processing initiated by datagram packet reception
640 * datagram requests;
664 * * Replicate received NetBIOS datagram for
668 * datagram operation
681 * END (* datagram service *)
703 * END (* datagram error *)
709 static struct datagram *
710 smb_netbios_datagram_getq(struct datagram *datagram)
712 struct datagram *prev = 0;
716 prev != (struct datagram *)((uintptr_t)&smb_datagram_queue);
719 datagram->src.addr_list.sin.sin_addr.s_addr) {
723 bcopy(datagram->data, &prev->data[prev->data_length],
724 datagram->data_length);
725 prev->data_length += datagram->data_length;
726 free(datagram);
736 smb_netbios_BPM_datagram(struct datagram *datagram)
739 struct datagram *qpacket = 0;
742 switch (datagram->packet_type) {
755 if ((datagram->flags & DATAGRAM_FLAGS_FIRST) != 0) {
756 if (datagram->flags & DATAGRAM_FLAGS_MORE) {
758 datagram->discard_timer = FRAGMENT_TIMEOUT;
760 QUEUE_INSERT_TAIL(&smb_datagram_queue, datagram)
764 /* process datagram */
766 qpacket = smb_netbios_datagram_getq(datagram);
768 datagram = qpacket;
776 if ((strcmp((char *)datagram->dest.name, "*") == 0) ||
778 smb_netbios_cache_lookup(&datagram->dest)) != 0)) {
786 (void *)datagram);
792 datagram->rawbuf[0] = DATAGRAM_TYPE_ERROR_DATAGRAM;
793 datagram->rawbuf[1] &= DATAGRAM_FLAGS_SRC_TYPE;
795 (void) memcpy(&datagram->rawbuf[4],
796 &datagram->src.addr_list.sin.sin_addr.s_addr,
798 BE_OUT16(&datagram->rawbuf[8], IPPORT_NETBIOS_DGM);
800 (void) sendto(datagram_sock, datagram->rawbuf,
801 datagram->rawbytes, 0,
802 (struct sockaddr *)&datagram->src.addr_list.sin,
803 datagram->src.addr_list.sinlen);
810 free(datagram);
821 struct datagram *datagram;
828 (struct datagram *)((uintptr_t)&smb_datagram_queue);
832 syslog(LOG_ERR, "nbt datagram: socket failed: %m");
845 syslog(LOG_ERR, "nbt datagram: bind(%d) failed: %m",
859 if ((datagram = calloc(1, sizeof (struct datagram))) == NULL) {
865 ignore: bzero(&datagram->inaddr, sizeof (addr_entry_t));
866 datagram->inaddr.sinlen = sizeof (datagram->inaddr.sin);
867 datagram->inaddr.forw = datagram->inaddr.back =
868 &datagram->inaddr;
870 if ((bytes = recvfrom(datagram_sock, datagram->rawbuf,
872 (struct sockaddr *)&datagram->inaddr.sin,
873 &datagram->inaddr.sinlen)) < 0) {
874 syslog(LOG_ERR, "nbt datagram: recvfrom failed: %m");
880 ipaddr.a_ipv4 = datagram->inaddr.sin.sin_addr.s_addr;
886 if (smb_datagram_decode(datagram, bytes) < 0)
896 * if ((datagram->flags & DATAGRAM_FLAGS_SRC_TYPE) ==
898 * smb_netbios_NBDD_datagram(datagram);
900 * smb_netbios_BPM_datagram(datagram);
903 smb_netbios_BPM_datagram(datagram);