[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: Arnaldo Carvalho de Melo <acme@mandriva.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
399c07def6
commit
3df80d9320
@ -1,3 +1,7 @@
|
|||||||
|
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 \
|
||||||
|
1438
net/dccp/ipv6.c
Normal file
1438
net/dccp/ipv6.c
Normal file
File diff suppressed because it is too large
Load Diff
37
net/dccp/ipv6.h
Normal file
37
net/dccp/ipv6.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#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 */
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user