X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fvport-capwap.c;h=5f31732e81dd4f8b2b075e74aed96cd1ae13e228;hb=c3f2538933e2a7663283158a8bf806bf66ac1a23;hp=4061c7b11d6a27b70cbc8643d9826b88d41703cb;hpb=2315e6b5bc8da2aa690cd977fdd89543bb435488;p=openvswitch diff --git a/datapath/vport-capwap.c b/datapath/vport-capwap.c index 4061c7b1..5f31732e 100644 --- a/datapath/vport-capwap.c +++ b/datapath/vport-capwap.c @@ -155,28 +155,6 @@ static struct inet_frags frag_state = { .secret_interval = CAPWAP_FRAG_SECRET_INTERVAL, }; -static void get_capwap_param(const struct tnl_mutable_config *mutable, - const struct ovs_key_ipv4_tunnel *tun_key, - u32 *flags, __be64 *out_key) -{ - if (tun_key->ipv4_dst) { - *flags = 0; - - if (tun_key->tun_flags & OVS_FLOW_TNL_F_KEY) - *flags = TNL_F_OUT_KEY_ACTION; - if (tun_key->tun_flags & OVS_FLOW_TNL_F_CSUM) - *flags |= TNL_F_CSUM; - *out_key = tun_key->tun_id; - } else { - *flags = mutable->flags; - if (mutable->flags & TNL_F_OUT_KEY_ACTION) - *out_key = tun_key->tun_id; - else - *out_key = mutable->out_key; - - } -} - static int capwap_hdr_len(const struct tnl_mutable_config *mutable, const struct ovs_key_ipv4_tunnel *tun_key) { @@ -184,7 +162,7 @@ static int capwap_hdr_len(const struct tnl_mutable_config *mutable, u32 flags; __be64 out_key; - get_capwap_param(mutable, tun_key, &flags, &out_key); + tnl_get_param(mutable, tun_key, &flags, &out_key); /* CAPWAP has no checksums. */ if (flags & TNL_F_CSUM) @@ -199,17 +177,19 @@ static int capwap_hdr_len(const struct tnl_mutable_config *mutable, return size; } -static void capwap_build_header(const struct vport *vport, - const struct tnl_mutable_config *mutable, - const struct ovs_key_ipv4_tunnel *tun_key, - void *header) +static struct sk_buff *capwap_build_header(const struct vport *vport, + const struct tnl_mutable_config *mutable, + struct dst_entry *dst, + struct sk_buff *skb, + int tunnel_hlen) { - struct udphdr *udph = header; + struct ovs_key_ipv4_tunnel *tun_key = OVS_CB(skb)->tun_key; + struct udphdr *udph = udp_hdr(skb); struct capwaphdr *cwh = (struct capwaphdr *)(udph + 1); u32 flags; __be64 out_key; - get_capwap_param(mutable, tun_key, &flags, &out_key); + tnl_get_param(mutable, tun_key, &flags, &out_key); udph->source = htons(CAPWAP_SRC_PORT); udph->dest = htons(CAPWAP_DST_PORT); @@ -218,7 +198,8 @@ static void capwap_build_header(const struct vport *vport, cwh->frag_id = 0; cwh->frag_off = 0; - if (out_key || (flags & TNL_F_OUT_KEY_ACTION)) { + if (out_key || flags & TNL_F_OUT_KEY_ACTION) { + /* first field in WSI is key */ struct capwaphdr_wsi *wsi = (struct capwaphdr_wsi *)(cwh + 1); cwh->begin = CAPWAP_KEYED; @@ -237,30 +218,6 @@ static void capwap_build_header(const struct vport *vport, /* make packet readable by old capwap code */ cwh->begin = CAPWAP_NO_WSI; } -} - -static struct sk_buff *capwap_update_header(const struct vport *vport, - const struct tnl_mutable_config *mutable, - struct dst_entry *dst, - struct sk_buff *skb, - int tunnel_hlen) -{ - const struct ovs_key_ipv4_tunnel *tun_key = OVS_CB(skb)->tun_key; - struct udphdr *udph = udp_hdr(skb); - u32 flags; - __be64 out_key; - - get_capwap_param(mutable, tun_key, &flags, &out_key); - - if (flags & TNL_F_OUT_KEY_ACTION) { - /* first field in WSI is key */ - struct capwaphdr *cwh = (struct capwaphdr *)(udph + 1); - struct capwaphdr_wsi *wsi = (struct capwaphdr_wsi *)(cwh + 1); - struct capwaphdr_wsi_key *opt = (struct capwaphdr_wsi_key *)(wsi + 1); - - opt->key = out_key; - } - udph->len = htons(skb->len - skb_transport_offset(skb)); if (unlikely(skb->len - skb_network_offset(skb) > dst_mtu(dst))) { @@ -377,10 +334,12 @@ static int capwap_rcv(struct sock *sk, struct sk_buff *skb) } if (key_present && mutable->key.daddr && - !(mutable->flags & TNL_F_IN_KEY_MATCH)) + !(mutable->flags & TNL_F_IN_KEY_MATCH)) { key_present = false; + key = 0; + } - tnl_tun_key_init(&tun_key, iph, key, key_present ? OVS_FLOW_TNL_F_KEY : 0); + tnl_tun_key_init(&tun_key, iph, key, key_present ? OVS_TNL_F_KEY : 0); OVS_CB(skb)->tun_key = &tun_key; ovs_tnl_rcv(vport, skb); @@ -397,7 +356,6 @@ static const struct tnl_ops capwap_tnl_ops = { .ipproto = IPPROTO_UDP, .hdr_len = capwap_hdr_len, .build_header = capwap_build_header, - .update_header = capwap_update_header, }; static inline struct capwap_net *ovs_get_capwap_net(struct net *net)