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 | ||||
| 	}; | ||||
| 	u8 addr_id; | ||||
| 	u16 port; | ||||
| 	u64 ahmac; | ||||
| 	u8 rm_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; | ||||
| #endif | ||||
| 
 | ||||
| 		if (opts->port) | ||||
| 			len += TCPOLEN_MPTCP_PORT_LEN; | ||||
| 
 | ||||
| 		if (opts->ahmac) { | ||||
| 			len += sizeof(opts->ahmac); | ||||
| 			echo = 0; | ||||
|  | @ -1100,9 +1103,30 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp, | |||
| 			ptr += 4; | ||||
| 		} | ||||
| #endif | ||||
| 		if (opts->ahmac) { | ||||
| 			put_unaligned_be64(opts->ahmac, ptr); | ||||
| 			ptr += 2; | ||||
| 
 | ||||
| 		if (!opts->port) { | ||||
| 			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_CHECKSUM	2 | ||||
| #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_PORT	10 | ||||
| #define TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT	12 | ||||
| #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_PORT	22 | ||||
| #define TCPOLEN_MPTCP_PORT_LEN		2 | ||||
| #define TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT	24 | ||||
| #define TCPOLEN_MPTCP_PORT_LEN		4 | ||||
| #define TCPOLEN_MPTCP_RM_ADDR_BASE	4 | ||||
| 
 | ||||
| /* MPTCP MP_JOIN flags */ | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Geliang Tang
						Geliang Tang