Hello,
On Tue, 8 Sep 2015, Simon Horman wrote:
> I have squashed my change into Alex's patch and pushed the result.
> For reference it is as follows:
>
> From: Alex Gartrell <agartrell@xxxxxx>
> Subject: [PATCH] ipvs: support scheduling inverse and icmp SCTP packets
>
> In the event of an icmp packet, take only the ports instead of trying to
> grab the full header.
>
> In the event of an inverse packet, use the source address and port.
>
> Signed-off-by: Alex Gartrell <agartrell@xxxxxx>
> Acked-by: Julian Anastasov <ja@xxxxxx>
> [horms: initialise 'ipvs' before it is used]
> Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>
> ---
> net/netfilter/ipvs/ip_vs_proto_sctp.c | 46
> +++++++++++++++++++----------------
> 1 file changed, 25 insertions(+), 21 deletions(-)
>
> diff --git a/net/netfilter/ipvs/ip_vs_proto_sctp.c
> b/net/netfilter/ipvs/ip_vs_proto_sctp.c
> index cd2984f3dad7..e000e6e76d71 100644
> --- a/net/netfilter/ipvs/ip_vs_proto_sctp.c
> +++ b/net/netfilter/ipvs/ip_vs_proto_sctp.c
> @@ -13,37 +13,41 @@ sctp_conn_schedule(int af, struct sk_buff *skb, struct
> ip_vs_proto_data *pd,
> int *verdict, struct ip_vs_conn **cpp,
> struct ip_vs_iphdr *iph)
> {
> - struct net *net;
> + struct net *net = skb_net(skb);
> + struct netns_ipvs *ipvs = net_ipvs(net);
Looks good, thanks!
> struct ip_vs_service *svc;
> - struct netns_ipvs *ipvs;
> sctp_chunkhdr_t _schunkh, *sch;
> sctp_sctphdr_t *sh, _sctph;
> -
> - if (ip_vs_iph_icmp(iph)) {
> - /* TEMPORARY - do not schedule icmp yet */
> - *verdict = NF_ACCEPT;
> - return 0;
> - }
> -
> - sh = skb_header_pointer(skb, iph->len, sizeof(_sctph), &_sctph);
> - if (sh == NULL) {
> - *verdict = NF_DROP;
> - return 0;
> + __be16 _ports[2], *ports = NULL;
> +
> + if (likely(!ip_vs_iph_icmp(iph))) {
> + sh = skb_header_pointer(skb, iph->len, sizeof(_sctph), &_sctph);
> + if (sh) {
> + sch = skb_header_pointer(
> + skb, iph->len + sizeof(sctp_sctphdr_t),
> + sizeof(_schunkh), &_schunkh);
> + if (sch && (sch->type == SCTP_CID_INIT ||
> + sysctl_sloppy_sctp(ipvs)))
> + ports = &sh->source;
> + }
> + } else {
> + ports = skb_header_pointer(
> + skb, iph->len, sizeof(_ports), &_ports);
> }
>
> - sch = skb_header_pointer(skb, iph->len + sizeof(sctp_sctphdr_t),
> - sizeof(_schunkh), &_schunkh);
> - if (sch == NULL) {
> + if (!ports) {
> *verdict = NF_DROP;
> return 0;
> }
>
> - net = skb_net(skb);
> - ipvs = net_ipvs(net);
> rcu_read_lock();
> - if ((sch->type == SCTP_CID_INIT || sysctl_sloppy_sctp(ipvs)) &&
> - (svc = ip_vs_service_find(net, af, skb->mark, iph->protocol,
> - &iph->daddr, sh->dest))) {
> + if (likely(!ip_vs_iph_inverse(iph)))
> + svc = ip_vs_service_find(net, af, skb->mark, iph->protocol,
> + &iph->daddr, ports[1]);
> + else
> + svc = ip_vs_service_find(net, af, skb->mark, iph->protocol,
> + &iph->saddr, ports[0]);
> + if (svc) {
> int ignored;
>
> if (ip_vs_todrop(ipvs)) {
Regards
--
Julian Anastasov <ja@xxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe lvs-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
|