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); | 		pr_debug("RM_ADDR: id=%d", mp_opt->rm_id); | ||||||
| 		break; | 		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: | 	case MPTCPOPT_MP_FASTCLOSE: | ||||||
| 		if (opsize != TCPOLEN_MPTCP_FASTCLOSE) | 		if (opsize != TCPOLEN_MPTCP_FASTCLOSE) | ||||||
| 			break; | 			break; | ||||||
|  | @ -313,6 +322,7 @@ void mptcp_get_options(const struct sk_buff *skb, | ||||||
| 	mp_opt->port = 0; | 	mp_opt->port = 0; | ||||||
| 	mp_opt->rm_addr = 0; | 	mp_opt->rm_addr = 0; | ||||||
| 	mp_opt->dss = 0; | 	mp_opt->dss = 0; | ||||||
|  | 	mp_opt->mp_prio = 0; | ||||||
| 
 | 
 | ||||||
| 	length = (th->doff * 4) - sizeof(struct tcphdr); | 	length = (th->doff * 4) - sizeof(struct tcphdr); | ||||||
| 	ptr = (const unsigned char *)(th + 1); | 	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; | 		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) | 	if (!mp_opt.dss) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -207,6 +207,14 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id) | ||||||
| 	spin_unlock_bh(&pm->lock); | 	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 */ | /* path manager helpers */ | ||||||
| 
 | 
 | ||||||
| bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining, | 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_4	4 | ||||||
| #define MPTCP_ADDR_IPVERSION_6	6 | #define MPTCP_ADDR_IPVERSION_6	6 | ||||||
| 
 | 
 | ||||||
|  | /* MPTCP MP_PRIO flags */ | ||||||
|  | #define MPTCP_PRIO_BKUP		BIT(0) | ||||||
|  | 
 | ||||||
| /* MPTCP socket flags */ | /* MPTCP socket flags */ | ||||||
| #define MPTCP_DATA_READY	0 | #define MPTCP_DATA_READY	0 | ||||||
| #define MPTCP_NOSPACE		1 | #define MPTCP_NOSPACE		1 | ||||||
|  | @ -118,6 +121,7 @@ struct mptcp_options_received { | ||||||
| 		dss : 1, | 		dss : 1, | ||||||
| 		add_addr : 1, | 		add_addr : 1, | ||||||
| 		rm_addr : 1, | 		rm_addr : 1, | ||||||
|  | 		mp_prio : 1, | ||||||
| 		family : 4, | 		family : 4, | ||||||
| 		echo : 1, | 		echo : 1, | ||||||
| 		backup : 1; | 		backup : 1; | ||||||
|  | @ -553,6 +557,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk, | ||||||
| 				const struct mptcp_addr_info *addr); | 				const struct mptcp_addr_info *addr); | ||||||
| void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk); | 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_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, | int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk, | ||||||
| 				 struct mptcp_addr_info *addr, | 				 struct mptcp_addr_info *addr, | ||||||
| 				 u8 bkup); | 				 u8 bkup); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Geliang Tang
						Geliang Tang