Lines Matching refs:datagram

29  *	Contains base code for netbios datagram service.
43 * - MAX_DATAGRAM_LENGTH: the maximum length of an IP datagram. The
46 * datagram. Implementations are expected to be capable of
138 * datagram assembly queue.
149 struct datagram *entry;
150 struct datagram *next;
155 entry != (struct datagram *)((uintptr_t)&smb_datagram_queue);
170 struct datagram *entry;
174 (struct datagram *)((uintptr_t)&smb_datagram_queue)) {
208 * * build datagram service UDP packet;
235 * * fragment NetBIOS datagram into 2 UDP packets
299 * M 7 MORE flag, If set then more NetBIOS datagram
304 * datagram
338 syslog(LOG_ERR, "nbt datagram: send: %m");
418 syslog(LOG_ERR, "nbt datagram: send_to_net: %m");
476 smb_datagram_decode(struct datagram *datagram, int bytes)
483 if (datagram->rawbuf[0] == DATAGRAM_TYPE_ERROR_DATAGRAM)
484 smb_netbios_datagram_error(datagram->rawbuf);
490 ha_src = &datagram->rawbuf[DATAGRAM_HEADER_LENGTH];
494 bzero(&datagram->src, sizeof (struct name_entry));
495 bzero(&datagram->dest, sizeof (struct name_entry));
497 datagram->rawbytes = bytes;
498 datagram->packet_type = datagram->rawbuf[0];
499 datagram->flags = datagram->rawbuf[1];
500 datagram->datagram_id = BE_IN16(&datagram->rawbuf[2]);
502 datagram->src.addr_list.sinlen = sizeof (struct sockaddr_in);
503 (void) memcpy(&datagram->src.addr_list.sin.sin_addr.s_addr,
504 &datagram->rawbuf[4], sizeof (uint32_t));
505 (void) memcpy(&datagram->src.addr_list.sin.sin_port,
506 &datagram->rawbuf[8], sizeof (uint16_t));
507 datagram->src.addr_list.forw = datagram->src.addr_list.back =
508 &datagram->src.addr_list;
510 datagram->data = data;
511 datagram->data_length = BE_IN16(&datagram->rawbuf[10]);
512 datagram->offset = BE_IN16(&datagram->rawbuf[12]);
514 if (smb_first_level_name_decode(ha_src, &datagram->src) < 0) {
516 inet_ntoa(datagram->src.addr_list.sin.sin_addr));
521 datagram->dest.addr_list.forw = datagram->dest.addr_list.back =
522 &datagram->dest.addr_list;
524 if (smb_first_level_name_decode(ha_dest, &datagram->dest) < 0) {
526 inet_ntoa(datagram->src.addr_list.sin.sin_addr));
534 /* ignore other malformed datagram packets */
588 * * processing initiated by datagram packet reception
641 * datagram requests;
665 * * Replicate received NetBIOS datagram for
669 * datagram operation
682 * END (* datagram service *)
704 * END (* datagram error *)
710 static struct datagram *
711 smb_netbios_datagram_getq(struct datagram *datagram)
713 struct datagram *prev = 0;
717 prev != (struct datagram *)((uintptr_t)&smb_datagram_queue);
720 datagram->src.addr_list.sin.sin_addr.s_addr) {
724 bcopy(datagram->data, &prev->data[prev->data_length],
725 datagram->data_length);
726 prev->data_length += datagram->data_length;
727 free(datagram);
737 smb_netbios_BPM_datagram(struct datagram *datagram)
740 struct datagram *qpacket = 0;
743 switch (datagram->packet_type) {
756 if ((datagram->flags & DATAGRAM_FLAGS_FIRST) != 0) {
757 if (datagram->flags & DATAGRAM_FLAGS_MORE) {
759 datagram->discard_timer = FRAGMENT_TIMEOUT;
761 QUEUE_INSERT_TAIL(&smb_datagram_queue, datagram)
765 /* process datagram */
767 qpacket = smb_netbios_datagram_getq(datagram);
769 datagram = qpacket;
777 if ((strcmp((char *)datagram->dest.name, "*") == 0) ||
779 smb_netbios_cache_lookup(&datagram->dest)) != 0)) {
787 (void *)datagram);
793 datagram->rawbuf[0] = DATAGRAM_TYPE_ERROR_DATAGRAM;
794 datagram->rawbuf[1] &= DATAGRAM_FLAGS_SRC_TYPE;
796 (void) memcpy(&datagram->rawbuf[4],
797 &datagram->src.addr_list.sin.sin_addr.s_addr,
799 BE_OUT16(&datagram->rawbuf[8], IPPORT_NETBIOS_DGM);
801 (void) sendto(datagram_sock, datagram->rawbuf,
802 datagram->rawbytes, 0,
803 (struct sockaddr *)&datagram->src.addr_list.sin,
804 datagram->src.addr_list.sinlen);
811 free(datagram);
822 struct datagram *datagram;
829 (struct datagram *)((uintptr_t)&smb_datagram_queue);
833 syslog(LOG_ERR, "nbt datagram: socket failed: %m");
846 syslog(LOG_ERR, "nbt datagram: bind(%d) failed: %m",
860 if ((datagram = malloc(sizeof (struct datagram))) == NULL) {
866 ignore: bzero(&datagram->inaddr, sizeof (addr_entry_t));
867 datagram->inaddr.sinlen = sizeof (datagram->inaddr.sin);
868 datagram->inaddr.forw = datagram->inaddr.back =
869 &datagram->inaddr;
871 if ((bytes = recvfrom(datagram_sock, datagram->rawbuf,
873 (struct sockaddr *)&datagram->inaddr.sin,
874 &datagram->inaddr.sinlen)) < 0) {
875 syslog(LOG_ERR, "nbt datagram: recvfrom failed: %m");
881 ipaddr.a_ipv4 = datagram->inaddr.sin.sin_addr.s_addr;
887 if (smb_datagram_decode(datagram, bytes) < 0)
897 * if ((datagram->flags & DATAGRAM_FLAGS_SRC_TYPE) ==
899 * smb_netbios_NBDD_datagram(datagram);
901 * smb_netbios_BPM_datagram(datagram);
904 smb_netbios_BPM_datagram(datagram);