Lines Matching refs:mp_opt
23 struct mptcp_options_received *mp_opt) in mptcp_parse_option() argument
77 mp_opt->mp_capable = 1; in mptcp_parse_option()
79 mp_opt->sndr_key = get_unaligned_be64(ptr); in mptcp_parse_option()
83 mp_opt->rcvr_key = get_unaligned_be64(ptr); in mptcp_parse_option()
92 mp_opt->dss = 1; in mptcp_parse_option()
93 mp_opt->use_map = 1; in mptcp_parse_option()
94 mp_opt->mpc_map = 1; in mptcp_parse_option()
95 mp_opt->data_len = get_unaligned_be16(ptr); in mptcp_parse_option()
99 version, flags, opsize, mp_opt->sndr_key, in mptcp_parse_option()
100 mp_opt->rcvr_key, mp_opt->data_len); in mptcp_parse_option()
104 mp_opt->mp_join = 1; in mptcp_parse_option()
106 mp_opt->backup = *ptr++ & MPTCPOPT_BACKUP; in mptcp_parse_option()
107 mp_opt->join_id = *ptr++; in mptcp_parse_option()
108 mp_opt->token = get_unaligned_be32(ptr); in mptcp_parse_option()
110 mp_opt->nonce = get_unaligned_be32(ptr); in mptcp_parse_option()
113 mp_opt->backup, mp_opt->join_id, in mptcp_parse_option()
114 mp_opt->token, mp_opt->nonce); in mptcp_parse_option()
116 mp_opt->backup = *ptr++ & MPTCPOPT_BACKUP; in mptcp_parse_option()
117 mp_opt->join_id = *ptr++; in mptcp_parse_option()
118 mp_opt->thmac = get_unaligned_be64(ptr); in mptcp_parse_option()
120 mp_opt->nonce = get_unaligned_be32(ptr); in mptcp_parse_option()
123 mp_opt->backup, mp_opt->join_id, in mptcp_parse_option()
124 mp_opt->thmac, mp_opt->nonce); in mptcp_parse_option()
127 memcpy(mp_opt->hmac, ptr, MPTCPOPT_HMAC_LEN); in mptcp_parse_option()
131 mp_opt->mp_join = 0; in mptcp_parse_option()
143 mp_opt->mpc_map = 0; in mptcp_parse_option()
145 mp_opt->data_fin = (flags & MPTCP_DSS_DATA_FIN) != 0; in mptcp_parse_option()
146 mp_opt->dsn64 = (flags & MPTCP_DSS_DSN64) != 0; in mptcp_parse_option()
147 mp_opt->use_map = (flags & MPTCP_DSS_HAS_MAP) != 0; in mptcp_parse_option()
148 mp_opt->ack64 = (flags & MPTCP_DSS_ACK64) != 0; in mptcp_parse_option()
149 mp_opt->use_ack = (flags & MPTCP_DSS_HAS_ACK); in mptcp_parse_option()
152 mp_opt->data_fin, mp_opt->dsn64, in mptcp_parse_option()
153 mp_opt->use_map, mp_opt->ack64, in mptcp_parse_option()
154 mp_opt->use_ack); in mptcp_parse_option()
158 if (mp_opt->use_ack) { in mptcp_parse_option()
159 if (mp_opt->ack64) in mptcp_parse_option()
165 if (mp_opt->use_map) { in mptcp_parse_option()
166 if (mp_opt->dsn64) in mptcp_parse_option()
181 mp_opt->dss = 1; in mptcp_parse_option()
183 if (mp_opt->use_ack) { in mptcp_parse_option()
184 if (mp_opt->ack64) { in mptcp_parse_option()
185 mp_opt->data_ack = get_unaligned_be64(ptr); in mptcp_parse_option()
188 mp_opt->data_ack = get_unaligned_be32(ptr); in mptcp_parse_option()
192 pr_debug("data_ack=%llu", mp_opt->data_ack); in mptcp_parse_option()
195 if (mp_opt->use_map) { in mptcp_parse_option()
196 if (mp_opt->dsn64) { in mptcp_parse_option()
197 mp_opt->data_seq = get_unaligned_be64(ptr); in mptcp_parse_option()
200 mp_opt->data_seq = get_unaligned_be32(ptr); in mptcp_parse_option()
204 mp_opt->subflow_seq = get_unaligned_be32(ptr); in mptcp_parse_option()
207 mp_opt->data_len = get_unaligned_be16(ptr); in mptcp_parse_option()
211 mp_opt->data_seq, mp_opt->subflow_seq, in mptcp_parse_option()
212 mp_opt->data_len); in mptcp_parse_option()
218 mp_opt->echo = (*ptr++) & MPTCP_ADDR_ECHO; in mptcp_parse_option()
219 if (!mp_opt->echo) { in mptcp_parse_option()
222 mp_opt->family = MPTCP_ADDR_IPVERSION_4; in mptcp_parse_option()
226 mp_opt->family = MPTCP_ADDR_IPVERSION_6; in mptcp_parse_option()
233 mp_opt->family = MPTCP_ADDR_IPVERSION_4; in mptcp_parse_option()
237 mp_opt->family = MPTCP_ADDR_IPVERSION_6; in mptcp_parse_option()
243 mp_opt->add_addr = 1; in mptcp_parse_option()
244 mp_opt->addr_id = *ptr++; in mptcp_parse_option()
245 pr_debug("ADD_ADDR: id=%d, echo=%d", mp_opt->addr_id, mp_opt->echo); in mptcp_parse_option()
246 if (mp_opt->family == MPTCP_ADDR_IPVERSION_4) { in mptcp_parse_option()
247 memcpy((u8 *)&mp_opt->addr.s_addr, (u8 *)ptr, 4); in mptcp_parse_option()
251 mp_opt->port = get_unaligned_be16(ptr); in mptcp_parse_option()
257 memcpy(mp_opt->addr6.s6_addr, (u8 *)ptr, 16); in mptcp_parse_option()
261 mp_opt->port = get_unaligned_be16(ptr); in mptcp_parse_option()
266 if (!mp_opt->echo) { in mptcp_parse_option()
267 mp_opt->ahmac = get_unaligned_be64(ptr); in mptcp_parse_option()
278 mp_opt->rm_addr = 1; in mptcp_parse_option()
279 mp_opt->rm_id = *ptr++; in mptcp_parse_option()
280 pr_debug("RM_ADDR: id=%d", mp_opt->rm_id); in mptcp_parse_option()
289 struct mptcp_options_received *mp_opt) in mptcp_get_options() argument
296 mp_opt->mp_capable = 0; in mptcp_get_options()
297 mp_opt->mp_join = 0; in mptcp_get_options()
298 mp_opt->add_addr = 0; in mptcp_get_options()
299 mp_opt->ahmac = 0; in mptcp_get_options()
300 mp_opt->port = 0; in mptcp_get_options()
301 mp_opt->rm_addr = 0; in mptcp_get_options()
302 mp_opt->dss = 0; in mptcp_get_options()
324 mptcp_parse_option(skb, ptr, opsize, mp_opt); in mptcp_get_options()
724 struct mptcp_options_received *mp_opt) in check_fully_established() argument
736 subflow->mp_join && mp_opt->mp_join && in check_fully_established()
753 if (mp_opt->dss && mp_opt->use_ack) { in check_fully_established()
766 if (!mp_opt->mp_capable) { in check_fully_established()
777 mptcp_subflow_fully_established(subflow, mp_opt); in check_fully_established()
813 struct mptcp_options_received *mp_opt) in update_una() argument
822 new_snd_una = expand_ack(old_snd_una, mp_opt->data_ack, mp_opt->ack64); in update_una()
857 struct mptcp_options_received *mp_opt) in add_addr_hmac_valid() argument
861 if (mp_opt->echo) in add_addr_hmac_valid()
864 if (mp_opt->family == MPTCP_ADDR_IPVERSION_4) in add_addr_hmac_valid()
867 mp_opt->addr_id, &mp_opt->addr); in add_addr_hmac_valid()
872 mp_opt->addr_id, &mp_opt->addr6); in add_addr_hmac_valid()
877 (unsigned long long)mp_opt->ahmac); in add_addr_hmac_valid()
879 return hmac == mp_opt->ahmac; in add_addr_hmac_valid()
886 struct mptcp_options_received mp_opt; in mptcp_incoming_options() local
892 mptcp_get_options(skb, &mp_opt); in mptcp_incoming_options()
893 if (!check_fully_established(msk, sk, subflow, skb, &mp_opt)) in mptcp_incoming_options()
896 if (mp_opt.add_addr && add_addr_hmac_valid(msk, &mp_opt)) { in mptcp_incoming_options()
899 addr.port = htons(mp_opt.port); in mptcp_incoming_options()
900 addr.id = mp_opt.addr_id; in mptcp_incoming_options()
901 if (mp_opt.family == MPTCP_ADDR_IPVERSION_4) { in mptcp_incoming_options()
903 addr.addr = mp_opt.addr; in mptcp_incoming_options()
906 else if (mp_opt.family == MPTCP_ADDR_IPVERSION_6) { in mptcp_incoming_options()
908 addr.addr6 = mp_opt.addr6; in mptcp_incoming_options()
911 if (!mp_opt.echo) { in mptcp_incoming_options()
918 mp_opt.add_addr = 0; in mptcp_incoming_options()
921 if (mp_opt.rm_addr) { in mptcp_incoming_options()
922 mptcp_pm_rm_addr_received(msk, mp_opt.rm_id); in mptcp_incoming_options()
923 mp_opt.rm_addr = 0; in mptcp_incoming_options()
926 if (!mp_opt.dss) in mptcp_incoming_options()
932 if (mp_opt.use_ack) in mptcp_incoming_options()
933 update_una(msk, &mp_opt); in mptcp_incoming_options()
941 if (mp_opt.data_fin && mp_opt.data_len == 1 && in mptcp_incoming_options()
942 mptcp_update_rcv_data_fin(msk, mp_opt.data_seq, mp_opt.dsn64) && in mptcp_incoming_options()
955 if (mp_opt.use_map) { in mptcp_incoming_options()
956 if (mp_opt.mpc_map) { in mptcp_incoming_options()
968 mpext->data_seq = mp_opt.data_seq; in mptcp_incoming_options()
969 mpext->subflow_seq = mp_opt.subflow_seq; in mptcp_incoming_options()
970 mpext->dsn64 = mp_opt.dsn64; in mptcp_incoming_options()
971 mpext->data_fin = mp_opt.data_fin; in mptcp_incoming_options()
973 mpext->data_len = mp_opt.data_len; in mptcp_incoming_options()