forked from mirrors/linux
		
	mptcp: add the incoming MP_PRIO support
This patch added the incoming MP_PRIO logic: Added a flag named mp_prio in struct mptcp_options_received, to mark the MP_PRIO is received, and save the priority value to struct mptcp_options_received's backup member. Then invoke mptcp_pm_mp_prio_received with the receiving subsocket and the backup value. In mptcp_pm_mp_prio_received, get the subflow context according the input subsocket, and change the subflow's backup as the incoming priority value. Signed-off-by: Geliang Tang <geliangtang@gmail.com> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									067065422f
								
							
						
					
					
						commit
						40453a5c61
					
				
					 3 changed files with 28 additions and 0 deletions
				
			
		|  | @ -282,6 +282,15 @@ static void mptcp_parse_option(const struct sk_buff *skb, | |||
| 		pr_debug("RM_ADDR: id=%d", mp_opt->rm_id); | ||||
| 		break; | ||||
| 
 | ||||
| 	case MPTCPOPT_MP_PRIO: | ||||
| 		if (opsize != TCPOLEN_MPTCP_PRIO) | ||||
| 			break; | ||||
| 
 | ||||
| 		mp_opt->mp_prio = 1; | ||||
| 		mp_opt->backup = *ptr++ & MPTCP_PRIO_BKUP; | ||||
| 		pr_debug("MP_PRIO: prio=%d", mp_opt->backup); | ||||
| 		break; | ||||
| 
 | ||||
| 	case MPTCPOPT_MP_FASTCLOSE: | ||||
| 		if (opsize != TCPOLEN_MPTCP_FASTCLOSE) | ||||
| 			break; | ||||
|  | @ -313,6 +322,7 @@ void mptcp_get_options(const struct sk_buff *skb, | |||
| 	mp_opt->port = 0; | ||||
| 	mp_opt->rm_addr = 0; | ||||
| 	mp_opt->dss = 0; | ||||
| 	mp_opt->mp_prio = 0; | ||||
| 
 | ||||
| 	length = (th->doff * 4) - sizeof(struct tcphdr); | ||||
| 	ptr = (const unsigned char *)(th + 1); | ||||
|  | @ -1022,6 +1032,11 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb) | |||
| 		mp_opt.rm_addr = 0; | ||||
| 	} | ||||
| 
 | ||||
| 	if (mp_opt.mp_prio) { | ||||
| 		mptcp_pm_mp_prio_received(sk, mp_opt.backup); | ||||
| 		mp_opt.mp_prio = 0; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!mp_opt.dss) | ||||
| 		return; | ||||
| 
 | ||||
|  |  | |||
|  | @ -207,6 +207,14 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id) | |||
| 	spin_unlock_bh(&pm->lock); | ||||
| } | ||||
| 
 | ||||
| void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup) | ||||
| { | ||||
| 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); | ||||
| 
 | ||||
| 	pr_debug("subflow->backup=%d, bkup=%d\n", subflow->backup, bkup); | ||||
| 	subflow->backup = bkup; | ||||
| } | ||||
| 
 | ||||
| /* path manager helpers */ | ||||
| 
 | ||||
| bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining, | ||||
|  |  | |||
|  | @ -88,6 +88,9 @@ | |||
| #define MPTCP_ADDR_IPVERSION_4	4 | ||||
| #define MPTCP_ADDR_IPVERSION_6	6 | ||||
| 
 | ||||
| /* MPTCP MP_PRIO flags */ | ||||
| #define MPTCP_PRIO_BKUP		BIT(0) | ||||
| 
 | ||||
| /* MPTCP socket flags */ | ||||
| #define MPTCP_DATA_READY	0 | ||||
| #define MPTCP_NOSPACE		1 | ||||
|  | @ -118,6 +121,7 @@ struct mptcp_options_received { | |||
| 		dss : 1, | ||||
| 		add_addr : 1, | ||||
| 		rm_addr : 1, | ||||
| 		mp_prio : 1, | ||||
| 		family : 4, | ||||
| 		echo : 1, | ||||
| 		backup : 1; | ||||
|  | @ -553,6 +557,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk, | |||
| 				const struct mptcp_addr_info *addr); | ||||
| void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk); | ||||
| void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id); | ||||
| void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup); | ||||
| int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk, | ||||
| 				 struct mptcp_addr_info *addr, | ||||
| 				 u8 bkup); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Geliang Tang
						Geliang Tang