static void send_bpdu(struct ofpbuf *pkt, int port_no, void *b_) { struct bridge *b = b_; struct lan *lan; assert(port_no < b->n_ports); lan = b->ports[port_no]; if (lan) { const void *data = ofpbuf_l3(pkt); size_t size = (char *) ofpbuf_tail(pkt) - (char *) data; int i; for (i = 0; i < lan->n_conns; i++) { struct lan_conn *conn = &lan->conns[i]; if (conn->bridge != b || conn->port_no != port_no) { struct bridge *dst = conn->bridge; struct bpdu *bpdu = &dst->rxq[dst->rxq_head++ % RXQ_SIZE]; assert(dst->rxq_head - dst->rxq_tail <= RXQ_SIZE); bpdu->data = xmemdup(data, size); bpdu->size = size; bpdu->port_no = conn->port_no; } } } ofpbuf_delete(pkt); }
static void set_arp(struct ofpbuf *packet, const struct ovs_key_arp *arp_key) { struct arp_eth_header *arp = ofpbuf_l3(packet); arp->ar_op = arp_key->arp_op; memcpy(arp->ar_sha, arp_key->arp_sha, ETH_ADDR_LEN); put_16aligned_be32(&arp->ar_spa, arp_key->arp_sip); memcpy(arp->ar_tha, arp_key->arp_tha, ETH_ADDR_LEN); put_16aligned_be32(&arp->ar_tpa, arp_key->arp_tip); }