Пример #1
0
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);
}
Пример #2
0
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);
}