Lines Matching refs:fl6

510 static int rawv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,  in rawv6_push_pending_frames()  argument
579 csum = csum_ipv6_magic(&fl6->saddr, &fl6->daddr, in rawv6_push_pending_frames()
580 total_len, fl6->flowi6_proto, tmp_csum); in rawv6_push_pending_frames()
582 if (csum == 0 && fl6->flowi6_proto == IPPROTO_UDP) in rawv6_push_pending_frames()
594 struct flowi6 *fl6, struct dst_entry **dstp, in rawv6_send_hdrinc() argument
606 ipv6_local_error(sk, EMSGSIZE, fl6, rt->dst.dev->mtu); in rawv6_send_hdrinc()
688 static int rawv6_probe_proto_opt(struct raw6_frag_vec *rfv, struct flowi6 *fl6) in rawv6_probe_proto_opt() argument
691 switch (fl6->flowi6_proto) { in rawv6_probe_proto_opt()
696 fl6->fl6_icmp_type = rfv->c[0]; in rawv6_probe_proto_opt()
697 fl6->fl6_icmp_code = rfv->c[1]; in rawv6_probe_proto_opt()
704 fl6->fl6_mh_type = rfv->c[2]; in rawv6_probe_proto_opt()
753 struct flowi6 fl6; in rawv6_sendmsg() local
775 memset(&fl6, 0, sizeof(fl6)); in rawv6_sendmsg()
777 fl6.flowi6_mark = READ_ONCE(sk->sk_mark); in rawv6_sendmsg()
778 fl6.flowi6_uid = sk->sk_uid; in rawv6_sendmsg()
782 ipc6.sockc.mark = fl6.flowi6_mark; in rawv6_sendmsg()
805 fl6.flowlabel = sin6->sin6_flowinfo&IPV6_FLOWINFO_MASK; in rawv6_sendmsg()
806 if (fl6.flowlabel&IPV6_FLOWLABEL_MASK) { in rawv6_sendmsg()
807 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel); in rawv6_sendmsg()
824 fl6.flowi6_oif = sin6->sin6_scope_id; in rawv6_sendmsg()
831 fl6.flowlabel = np->flow_label; in rawv6_sendmsg()
834 if (fl6.flowi6_oif == 0) in rawv6_sendmsg()
835 fl6.flowi6_oif = sk->sk_bound_dev_if; in rawv6_sendmsg()
843 err = ip6_datagram_send_ctl(sock_net(sk), sk, msg, &fl6, &ipc6); in rawv6_sendmsg()
848 if ((fl6.flowlabel&IPV6_FLOWLABEL_MASK) && !flowlabel) { in rawv6_sendmsg()
849 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel); in rawv6_sendmsg()
864 fl6.flowi6_proto = proto; in rawv6_sendmsg()
865 fl6.flowi6_mark = ipc6.sockc.mark; in rawv6_sendmsg()
870 err = rawv6_probe_proto_opt(&rfv, &fl6); in rawv6_sendmsg()
876 fl6.daddr = *daddr; in rawv6_sendmsg()
878 fl6.daddr.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */ in rawv6_sendmsg()
879 if (ipv6_addr_any(&fl6.saddr) && !ipv6_addr_any(&np->saddr)) in rawv6_sendmsg()
880 fl6.saddr = np->saddr; in rawv6_sendmsg()
882 final_p = fl6_update_dst(&fl6, opt, &final); in rawv6_sendmsg()
884 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr)) in rawv6_sendmsg()
885 fl6.flowi6_oif = READ_ONCE(np->mcast_oif); in rawv6_sendmsg()
886 else if (!fl6.flowi6_oif) in rawv6_sendmsg()
887 fl6.flowi6_oif = READ_ONCE(np->ucast_oif); in rawv6_sendmsg()
888 security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6)); in rawv6_sendmsg()
891 fl6.flowi6_flags |= FLOWI_FLAG_KNOWN_NH; in rawv6_sendmsg()
896 fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel); in rawv6_sendmsg()
898 dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); in rawv6_sendmsg()
904 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst); in rawv6_sendmsg()
914 err = rawv6_send_hdrinc(sk, msg, len, &fl6, &dst, in rawv6_sendmsg()
920 len, 0, &ipc6, &fl6, dst_rt6_info(dst), in rawv6_sendmsg()
926 err = rawv6_push_pending_frames(sk, &fl6, rp); in rawv6_sendmsg()
937 dst_confirm_neigh(dst, &fl6.daddr); in rawv6_sendmsg()