Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3df80d93 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by David S. Miller
Browse files

[DCCP]: Introduce DCCPv6



Still needs mucho polishing, specially in the checksum code, but works
just fine, inet_diag/iproute2 and all 8)

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@mandriva.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 399c07de
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
obj-$(CONFIG_IPV6) += dccp_ipv6.o

dccp_ipv6-y := ipv6.o

obj-$(CONFIG_IP_DCCP) += dccp.o
obj-$(CONFIG_IP_DCCP) += dccp.o


dccp-y := ccid.o input.o ipv4.o minisocks.o options.o output.o proto.o \
dccp-y := ccid.o input.o ipv4.o minisocks.o options.o output.o proto.o \

net/dccp/ipv6.c

0 → 100644
+1438 −0

File added.

Preview size limit exceeded, changes collapsed.

net/dccp/ipv6.h

0 → 100644
+37 −0
Original line number Original line Diff line number Diff line
#ifndef _DCCP_IPV6_H
#define _DCCP_IPV6_H
/*
 *  net/dccp/ipv6.h
 *
 *  An implementation of the DCCP protocol
 *  Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
 *
 *	This program is free software; you can redistribute it and/or modify it
 *	under the terms of the GNU General Public License version 2 as
 *	published by the Free Software Foundation.
 */

#include <linux/config.h>
#include <linux/dccp.h>
#include <linux/ipv6.h>

struct dccp6_sock {
	struct dccp_sock  dccp;
	/*
	 * ipv6_pinfo has to be the last member of dccp6_sock,
	 * see inet6_sk_generic.
	 */
	struct ipv6_pinfo inet6;
};

struct dccp6_request_sock {
	struct dccp_request_sock  dccp;
	struct inet6_request_sock inet6;
};

struct dccp6_timewait_sock {
	struct inet_timewait_sock   inet;
	struct inet6_timewait_sock  tw6;
};

#endif /* _DCCP_IPV6_H */
+12 −1
Original line number Original line Diff line number Diff line
@@ -52,7 +52,18 @@ void dccp_time_wait(struct sock *sk, int state, int timeo)
	if (tw != NULL) {
	if (tw != NULL) {
		const struct inet_connection_sock *icsk = inet_csk(sk);
		const struct inet_connection_sock *icsk = inet_csk(sk);
		const int rto = (icsk->icsk_rto << 2) - (icsk->icsk_rto >> 1);
		const int rto = (icsk->icsk_rto << 2) - (icsk->icsk_rto >> 1);

#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
		if (tw->tw_family == PF_INET6) {
			const struct ipv6_pinfo *np = inet6_sk(sk);
			struct inet6_timewait_sock *tw6;

			tw->tw_ipv6_offset = inet6_tw_offset(sk->sk_prot);
			tw6 = inet6_twsk((struct sock *)tw);
			ipv6_addr_copy(&tw6->tw_v6_daddr, &np->daddr);
			ipv6_addr_copy(&tw6->tw_v6_rcv_saddr, &np->rcv_saddr);
			tw->tw_ipv6only = np->ipv6only;
		}
#endif
		/* Linkage updates. */
		/* Linkage updates. */
		__inet_twsk_hashdance(tw, sk, &dccp_hashinfo);
		__inet_twsk_hashdance(tw, sk, &dccp_hashinfo);