static void msg_nmbd_send_packet(struct messaging_context *msg, void *private_data, uint32_t msg_type, struct server_id src, DATA_BLOB *data) { struct packet_struct *p = (struct packet_struct *)data->data; struct subnet_record *subrec; struct sockaddr_storage ss; const struct sockaddr_storage *pss; const struct in_addr *local_ip; DEBUG(10, ("Received send_packet from %u\n", (unsigned int)procid_to_pid(&src))); if (data->length != sizeof(struct packet_struct)) { DEBUG(2, ("Discarding invalid packet length from %u\n", (unsigned int)procid_to_pid(&src))); return; } if ((p->packet_type != NMB_PACKET) && (p->packet_type != DGRAM_PACKET)) { DEBUG(2, ("Discarding invalid packet type from %u: %d\n", (unsigned int)procid_to_pid(&src), p->packet_type)); return; } in_addr_to_sockaddr_storage(&ss, p->ip); pss = iface_ip((struct sockaddr *)(void *)&ss); if (pss == NULL) { DEBUG(2, ("Could not find ip for packet from %u\n", (unsigned int)procid_to_pid(&src))); return; } local_ip = &((const struct sockaddr_in *)pss)->sin_addr; subrec = FIRST_SUBNET; p->recv_fd = -1; p->send_fd = (p->packet_type == NMB_PACKET) ? subrec->nmb_sock : subrec->dgram_sock; for (subrec = FIRST_SUBNET; subrec != NULL; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) { if (ip_equal_v4(*local_ip, subrec->myip)) { p->send_fd = (p->packet_type == NMB_PACKET) ? subrec->nmb_sock : subrec->dgram_sock; break; } } if (p->packet_type == DGRAM_PACKET) { p->port = 138; p->packet.dgram.header.source_ip.s_addr = local_ip->s_addr; p->packet.dgram.header.source_port = 138; } send_packet(p); }
static void msg_nmbd_send_packet(int msg_type, struct process_id src, void *buf, size_t len, void *private_data) { struct packet_struct *p = (struct packet_struct *)buf; struct subnet_record *subrec; struct in_addr *local_ip; DEBUG(10, ("Received send_packet from %d\n", procid_to_pid(&src))); if (len != sizeof(struct packet_struct)) { DEBUG(2, ("Discarding invalid packet length from %d\n", procid_to_pid(&src))); return; } if ((p->packet_type != NMB_PACKET) && (p->packet_type != DGRAM_PACKET)) { DEBUG(2, ("Discarding invalid packet type from %d: %d\n", procid_to_pid(&src), p->packet_type)); return; } local_ip = iface_ip(p->ip); if (local_ip == NULL) { DEBUG(2, ("Could not find ip for packet from %d\n", procid_to_pid(&src))); return; } subrec = FIRST_SUBNET; p->fd = (p->packet_type == NMB_PACKET) ? subrec->nmb_sock : subrec->dgram_sock; for (subrec = FIRST_SUBNET; subrec != NULL; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) { if (ip_equal(*local_ip, subrec->myip)) { p->fd = (p->packet_type == NMB_PACKET) ? subrec->nmb_sock : subrec->dgram_sock; break; } } if (p->packet_type == DGRAM_PACKET) { p->port = 138; p->packet.dgram.header.source_ip.s_addr = local_ip->s_addr; p->packet.dgram.header.source_port = 138; } send_packet(p); }