forked from mirrors/linux
		
	mptcp: add port support for ADD_ADDR suboption writing
In rfc8684, the length of ADD_ADDR suboption with IPv4 address and port is 18 octets, but mptcp_write_options is 32-bit aligned, so we need to pad it to 20 octets. All the other port related option lengths need to be added up 2 octets similarly. This patch added a new field 'port' in mptcp_out_options. When this field is set with a port number, we need to add up 4 octets for the ADD_ADDR suboption, and put the port number into the suboption. Signed-off-by: Geliang Tang <geliangtang@gmail.com> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									e1ef683222
								
							
						
					
					
						commit
						22fb85ffae
					
				
					 3 changed files with 33 additions and 8 deletions
				
			
		|  | @ -46,6 +46,7 @@ struct mptcp_out_options { | ||||||
| #endif | #endif | ||||||
| 	}; | 	}; | ||||||
| 	u8 addr_id; | 	u8 addr_id; | ||||||
|  | 	u16 port; | ||||||
| 	u64 ahmac; | 	u64 ahmac; | ||||||
| 	u8 rm_id; | 	u8 rm_id; | ||||||
| 	u8 join_id; | 	u8 join_id; | ||||||
|  |  | ||||||
|  | @ -1083,6 +1083,9 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp, | ||||||
| 			len = TCPOLEN_MPTCP_ADD_ADDR6_BASE; | 			len = TCPOLEN_MPTCP_ADD_ADDR6_BASE; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | 		if (opts->port) | ||||||
|  | 			len += TCPOLEN_MPTCP_PORT_LEN; | ||||||
|  | 
 | ||||||
| 		if (opts->ahmac) { | 		if (opts->ahmac) { | ||||||
| 			len += sizeof(opts->ahmac); | 			len += sizeof(opts->ahmac); | ||||||
| 			echo = 0; | 			echo = 0; | ||||||
|  | @ -1100,9 +1103,30 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp, | ||||||
| 			ptr += 4; | 			ptr += 4; | ||||||
| 		} | 		} | ||||||
| #endif | #endif | ||||||
| 		if (opts->ahmac) { | 
 | ||||||
| 			put_unaligned_be64(opts->ahmac, ptr); | 		if (!opts->port) { | ||||||
| 			ptr += 2; | 			if (opts->ahmac) { | ||||||
|  | 				put_unaligned_be64(opts->ahmac, ptr); | ||||||
|  | 				ptr += 2; | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			if (opts->ahmac) { | ||||||
|  | 				u8 *bptr = (u8 *)ptr; | ||||||
|  | 
 | ||||||
|  | 				put_unaligned_be16(opts->port, bptr); | ||||||
|  | 				bptr += 2; | ||||||
|  | 				put_unaligned_be64(opts->ahmac, bptr); | ||||||
|  | 				bptr += 8; | ||||||
|  | 				put_unaligned_be16(TCPOPT_NOP << 8 | | ||||||
|  | 						   TCPOPT_NOP, bptr); | ||||||
|  | 
 | ||||||
|  | 				ptr += 3; | ||||||
|  | 			} else { | ||||||
|  | 				put_unaligned_be32(opts->port << 16 | | ||||||
|  | 						   TCPOPT_NOP << 8 | | ||||||
|  | 						   TCPOPT_NOP, ptr); | ||||||
|  | 				ptr += 1; | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -49,14 +49,14 @@ | ||||||
| #define TCPOLEN_MPTCP_DSS_MAP64		14 | #define TCPOLEN_MPTCP_DSS_MAP64		14 | ||||||
| #define TCPOLEN_MPTCP_DSS_CHECKSUM	2 | #define TCPOLEN_MPTCP_DSS_CHECKSUM	2 | ||||||
| #define TCPOLEN_MPTCP_ADD_ADDR		16 | #define TCPOLEN_MPTCP_ADD_ADDR		16 | ||||||
| #define TCPOLEN_MPTCP_ADD_ADDR_PORT	18 | #define TCPOLEN_MPTCP_ADD_ADDR_PORT	20 | ||||||
| #define TCPOLEN_MPTCP_ADD_ADDR_BASE	8 | #define TCPOLEN_MPTCP_ADD_ADDR_BASE	8 | ||||||
| #define TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT	10 | #define TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT	12 | ||||||
| #define TCPOLEN_MPTCP_ADD_ADDR6		28 | #define TCPOLEN_MPTCP_ADD_ADDR6		28 | ||||||
| #define TCPOLEN_MPTCP_ADD_ADDR6_PORT	30 | #define TCPOLEN_MPTCP_ADD_ADDR6_PORT	32 | ||||||
| #define TCPOLEN_MPTCP_ADD_ADDR6_BASE	20 | #define TCPOLEN_MPTCP_ADD_ADDR6_BASE	20 | ||||||
| #define TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT	22 | #define TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT	24 | ||||||
| #define TCPOLEN_MPTCP_PORT_LEN		2 | #define TCPOLEN_MPTCP_PORT_LEN		4 | ||||||
| #define TCPOLEN_MPTCP_RM_ADDR_BASE	4 | #define TCPOLEN_MPTCP_RM_ADDR_BASE	4 | ||||||
| 
 | 
 | ||||||
| /* MPTCP MP_JOIN flags */ | /* MPTCP MP_JOIN flags */ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Geliang Tang
						Geliang Tang