forked from mirrors/linux
		
	[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
					
				
					 4 changed files with 1490 additions and 0 deletions
				
			
		| 
						 | 
					@ -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 a new issue