• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /macosx-10.10/xnu-2782.1.97/bsd/netinet/

Lines Matching defs:fd_cb

198 	struct flow_divert_pcb	*fd_cb		= NULL;
203 fd_cb = RB_FIND(fd_pcb_tree, &group->pcb_tree, &key_item);
204 FDRETAIN(fd_cb);
207 return fd_cb;
211 flow_divert_pcb_insert(struct flow_divert_pcb *fd_cb, uint32_t ctl_unit)
225 socket_unlock(fd_cb->so, 0);
241 socket_lock(fd_cb->so, 0);
254 fd_cb->hash = net_flowhash(key, sizeof(key), g_hash_seed);
260 exist = RB_FIND(fd_pcb_tree, &curr_group->pcb_tree, fd_cb);
270 exist = RB_INSERT(fd_pcb_tree, &group->pcb_tree, fd_cb);
276 fd_cb->group = group;
277 FDRETAIN(fd_cb); /* The group now has a reference */
279 fd_cb->hash = 0;
283 socket_unlock(fd_cb->so, 0);
287 socket_lock(fd_cb->so, 0);
315 flow_divert_pcb_destroy(struct flow_divert_pcb *fd_cb)
317 FDLOG(LOG_INFO, fd_cb, "Destroying, app tx %u, app rx %u, tunnel tx %u, tunnel rx %u",
318 fd_cb->bytes_written_by_app, fd_cb->bytes_read_by_app, fd_cb->bytes_sent, fd_cb->bytes_received);
320 if (fd_cb->local_address != NULL) {
321 FREE(fd_cb->local_address, M_SONAME);
323 if (fd_cb->remote_address != NULL) {
324 FREE(fd_cb->remote_address, M_SONAME);
326 if (fd_cb->connect_token != NULL) {
327 mbuf_freem(fd_cb->connect_token);
329 FREE_ZONE(fd_cb, sizeof(*fd_cb), M_FLOW_DIVERT_PCB);
333 flow_divert_pcb_remove(struct flow_divert_pcb *fd_cb)
335 if (fd_cb->group != NULL) {
336 struct flow_divert_group *group = fd_cb->group;
338 FDLOG(LOG_INFO, fd_cb, "Removing from group %d, ref count = %d", group->ctl_unit, fd_cb->ref_count);
339 RB_REMOVE(fd_pcb_tree, &group->pcb_tree, fd_cb);
340 fd_cb->group = NULL;
341 FDRELEASE(fd_cb); /* Release the group's reference */
347 flow_divert_packet_init(struct flow_divert_pcb *fd_cb, uint8_t packet_type, mbuf_t *packet)
354 FDLOG(LOG_ERR, fd_cb, "failed to allocate the header mbuf: %d", error);
359 hdr.conn_id = htonl(fd_cb->hash);
364 FDLOG(LOG_ERR, fd_cb, "mbuf_copyback(hdr) failed: %d", error);
557 flow_divert_add_data_statistics(struct flow_divert_pcb *fd_cb, int data_len, Boolean send)
565 inp = sotoinpcb(fd_cb->so);
587 flow_divert_check_no_cellular(struct flow_divert_pcb *fd_cb)
591 inp = sotoinpcb(fd_cb->so);
600 flow_divert_check_no_expensive(struct flow_divert_pcb *fd_cb)
604 inp = sotoinpcb(fd_cb->so);
613 flow_divert_update_closed_state(struct flow_divert_pcb *fd_cb, int how, Boolean tunnel)
616 fd_cb->flags |= FLOW_DIVERT_WRITE_CLOSED;
617 if (tunnel || !(fd_cb->flags & FLOW_DIVERT_CONNECT_STARTED)) {
618 fd_cb->flags |= FLOW_DIVERT_TUNNEL_WR_CLOSED;
620 sbflush(&fd_cb->so->so_snd);
624 fd_cb->flags |= FLOW_DIVERT_READ_CLOSED;
625 if (tunnel || !(fd_cb->flags & FLOW_DIVERT_CONNECT_STARTED)) {
626 fd_cb->flags |= FLOW_DIVERT_TUNNEL_RD_CLOSED;
838 flow_divert_send_packet(struct flow_divert_pcb *fd_cb, mbuf_t packet, Boolean enqueue)
842 if (fd_cb->group == NULL) {
843 fd_cb->so->so_error = ECONNABORTED;
844 soisdisconnected(fd_cb->so);
848 lck_rw_lock_shared(&fd_cb->group->lck);
850 if (MBUFQ_EMPTY(&fd_cb->group->send_queue)) {
851 error = ctl_enqueuembuf(g_flow_divert_kctl_ref, fd_cb->group->ctl_unit, packet, CTL_DATA_EOR);
858 if (!lck_rw_lock_shared_to_exclusive(&fd_cb->group->lck)) {
859 lck_rw_lock_exclusive(&fd_cb->group->lck);
861 MBUFQ_ENQUEUE(&fd_cb->group->send_queue, packet);
864 OSTestAndSet(GROUP_BIT_CTL_ENQUEUE_BLOCKED, &fd_cb->group->atomic_bits);
867 lck_rw_done(&fd_cb->group->lck);
873 flow_divert_send_connect(struct flow_divert_pcb *fd_cb, struct sockaddr *to, mbuf_t connect_packet)
879 sizeof(fd_cb->so->so_traffic_class),
880 &fd_cb->so->so_traffic_class);
885 if (fd_cb->so->so_flags & SOF_DELEGATED) {
888 sizeof(fd_cb->so->e_pid),
889 &fd_cb->so->e_pid);
896 sizeof(fd_cb->so->e_uuid),
897 &fd_cb->so->e_uuid);
904 sizeof(fd_cb->so->e_pid),
905 &fd_cb->so->last_pid);
912 sizeof(fd_cb->so->e_uuid),
913 &fd_cb->so->last_uuid);
919 if (fd_cb->connect_token != NULL) {
920 unsigned int token_len = m_length(fd_cb->connect_token);
921 mbuf_concatenate(connect_packet, fd_cb->connect_token);
923 fd_cb->connect_token = NULL;
925 uint32_t ctl_unit = htonl(fd_cb->control_group_unit);
953 error = flow_divert_send_packet(fd_cb, connect_packet, TRUE);
963 flow_divert_send_connect_result(struct flow_divert_pcb *fd_cb)
969 error = flow_divert_packet_init(fd_cb, FLOW_DIVERT_PKT_CONNECT_RESULT, &packet);
971 FDLOG(LOG_ERR, fd_cb, "failed to create a connect result packet: %d", error);
975 rbuff_space = sbspace(&fd_cb->so->so_rcv);
988 error = flow_divert_send_packet(fd_cb, packet, TRUE);
1002 flow_divert_send_close(struct flow_divert_pcb *fd_cb, int how)
1008 error = flow_divert_packet_init(fd_cb, FLOW_DIVERT_PKT_CLOSE, &packet);
1010 FDLOG(LOG_ERR, fd_cb, "failed to create a close packet: %d", error);
1016 FDLOG(LOG_ERR, fd_cb, "failed to add the error code TLV: %d", error);
1023 FDLOG(LOG_ERR, fd_cb, "failed to add the how flag: %d", error);
1027 error = flow_divert_send_packet(fd_cb, packet, TRUE);
1041 flow_divert_tunnel_how_closed(struct flow_divert_pcb *fd_cb)
1043 if ((fd_cb->flags & (FLOW_DIVERT_TUNNEL_RD_CLOSED|FLOW_DIVERT_TUNNEL_WR_CLOSED)) ==
1047 } else if (fd_cb->flags & FLOW_DIVERT_TUNNEL_RD_CLOSED) {
1049 } else if (fd_cb->flags & FLOW_DIVERT_TUNNEL_WR_CLOSED) {
1061 flow_divert_send_close_if_needed(struct flow_divert_pcb *fd_cb)
1066 if (fd_cb->so->so_snd.sb_cc == 0) {
1067 if ((fd_cb->flags & (FLOW_DIVERT_READ_CLOSED|FLOW_DIVERT_TUNNEL_RD_CLOSED)) == FLOW_DIVERT_READ_CLOSED) {
1071 if ((fd_cb->flags & (FLOW_DIVERT_WRITE_CLOSED|FLOW_DIVERT_TUNNEL_WR_CLOSED)) == FLOW_DIVERT_WRITE_CLOSED) {
1082 FDLOG(LOG_INFO, fd_cb, "sending close, how = %d", how);
1083 if (flow_divert_send_close(fd_cb, how) != ENOBUFS) {
1086 fd_cb->flags |= FLOW_DIVERT_TUNNEL_WR_CLOSED;
1089 fd_cb->flags |= FLOW_DIVERT_TUNNEL_RD_CLOSED;
1094 if (flow_divert_tunnel_how_closed(fd_cb) == SHUT_RDWR) {
1095 soisdisconnected(fd_cb->so);
1100 flow_divert_send_data_packet(struct flow_divert_pcb *fd_cb, mbuf_t data, size_t data_len, Boolean force)
1106 error = flow_divert_packet_init(fd_cb, FLOW_DIVERT_PKT_DATA, &packet);
1108 FDLOG(LOG_ERR, fd_cb, "flow_divert_packet_init failed: %d", error);
1116 error = flow_divert_send_packet(fd_cb, packet, force);
1122 fd_cb->bytes_sent += data_len;
1123 flow_divert_add_data_statistics(fd_cb, data_len, TRUE);
1130 flow_divert_send_buffered_data(struct flow_divert_pcb *fd_cb, Boolean force)
1137 to_send = fd_cb->so->so_snd.sb_cc;
1138 buffer = fd_cb->so->so_snd.sb_mb;
1141 FDLOG(LOG_ERR, fd_cb, "Send buffer is NULL, but size is supposed to be %lu", to_send);
1146 if (!force && (to_send > fd_cb->send_window)) {
1147 to_send = fd_cb->send_window;
1161 FDLOG(LOG_ERR, fd_cb, "mbuf_copym failed: %d", error);
1165 error = flow_divert_send_data_packet(fd_cb, data, data_len, force);
1175 FDLOG(LOG_DEBUG, fd_cb, "sent %lu bytes of buffered data", sent);
1176 if (fd_cb->send_window >= sent) {
1177 fd_cb->send_window -= sent;
1179 fd_cb->send_window = 0;
1181 sbdrop(&fd_cb->so->so_snd, sent);
1182 sowwakeup(fd_cb->so);
1187 flow_divert_send_app_data(struct flow_divert_pcb *fd_cb, mbuf_t data)
1195 if (to_send > fd_cb->send_window) {
1196 to_send = fd_cb->send_window;
1199 if (fd_cb->so->so_snd.sb_cc > 0) {
1212 FDLOG(LOG_ERR, fd_cb, "mbuf_split failed: %d", error);
1221 error = flow_divert_send_data_packet(fd_cb, pkt_data, pkt_data_len, FALSE);
1231 fd_cb->send_window -= sent;
1236 if (sbspace(&fd_cb->so->so_snd) > 0) {
1237 if (!sbappendstream(&fd_cb->so->so_snd, pkt_data)) {
1238 FDLOG(LOG_ERR, fd_cb, "sbappendstream failed with pkt_data, send buffer size = %u, send_window = %u\n",
1239 fd_cb->so->so_snd.sb_cc, fd_cb->send_window);
1247 if (sbspace(&fd_cb->so->so_snd) > 0) {
1248 if (!sbappendstream(&fd_cb->so->so_snd, remaining_data)) {
1249 FDLOG(LOG_ERR, fd_cb, "sbappendstream failed with remaining_data, send buffer size = %u, send_window = %u\n",
1250 fd_cb->so->so_snd.sb_cc, fd_cb->send_window);
1261 flow_divert_send_read_notification(struct flow_divert_pcb *fd_cb, uint32_t read_count)
1267 error = flow_divert_packet_init(fd_cb, FLOW_DIVERT_PKT_READ_NOTIFY, &packet);
1269 FDLOG(LOG_ERR, fd_cb, "failed to create a read notification packet: %d", error);
1275 FDLOG(LOG_ERR, fd_cb, "failed to add the read count: %d", error);
1279 error = flow_divert_send_packet(fd_cb, packet, TRUE);
1293 flow_divert_send_traffic_class_update(struct flow_divert_pcb *fd_cb, int traffic_class)
1298 error = flow_divert_packet_init(fd_cb, FLOW_DIVERT_PKT_PROPERTIES_UPDATE, &packet);
1300 FDLOG(LOG_ERR, fd_cb, "failed to create a properties update packet: %d", error);
1306 FDLOG(LOG_ERR, fd_cb, "failed to add the traffic class: %d", error);
1310 error = flow_divert_send_packet(fd_cb, packet, TRUE);
1324 flow_divert_handle_connect_result(struct flow_divert_pcb *fd_cb, mbuf_t packet, int offset)
1340 FDLOG(LOG_ERR, fd_cb, "failed to get the connect result: %d", error);
1344 FDLOG(LOG_INFO, fd_cb, "received connect result %u", connect_error);
1348 FDLOG(LOG_ERR, fd_cb, "failed to get the send window: %d", error);
1354 FDLOG(LOG_ERR, fd_cb, "failed to get the control unit: %d", error);
1360 FDLOG0(LOG_NOTICE, fd_cb, "No local address provided");
1365 FDLOG0(LOG_NOTICE, fd_cb, "No remote address provided");
1370 FDLOG0(LOG_NOTICE, fd_cb, "No output if index provided");
1380 FDLOG(LOG_ERR, fd_cb, "Connect result contains an invalid control unit: %u", ctl_unit);
1383 FDLOG0(LOG_ERR, fd_cb, "No active groups, dropping connection");
1393 FDLOCK(fd_cb);
1394 if (fd_cb->so != NULL) {
1399 socket_lock(fd_cb->so, 0);
1401 if (!(fd_cb->so->so_state & SS_ISCONNECTING)) {
1405 inp = sotoinpcb(fd_cb->so);
1415 fd_cb->local_address = dup_sockaddr((struct sockaddr *)&local_address, 1);
1425 fd_cb->remote_address = dup_sockaddr((struct sockaddr *)&remote_address, 1);
1447 if (fd_cb->group == NULL) {
1452 old_group = fd_cb->group;
1457 RB_REMOVE(fd_pcb_tree, &old_group->pcb_tree, fd_cb);
1458 if (RB_INSERT(fd_pcb_tree, &grp->pcb_tree, fd_cb) != NULL) {
1459 panic("group with unit %u already contains a connection with hash %u", grp->ctl_unit, fd_cb->hash);
1462 fd_cb->group = grp;
1467 fd_cb->send_window = ntohl(send_window);
1468 flow_divert_send_buffered_data(fd_cb, FALSE);
1472 FDLOG0(LOG_INFO, fd_cb, "sending connect result");
1473 error = flow_divert_send_connect_result(fd_cb);
1478 flow_divert_update_closed_state(fd_cb, SHUT_RDWR, FALSE);
1479 fd_cb->so->so_error = error;
1480 flow_divert_send_close_if_needed(fd_cb);
1482 flow_divert_update_closed_state(fd_cb, SHUT_RDWR, TRUE);
1483 fd_cb->so->so_error = connect_error;
1485 soisdisconnected(fd_cb->so);
1487 soisconnected(fd_cb->so);
1491 socket_unlock(fd_cb->so, 0);
1493 FDUNLOCK(fd_cb);
1499 flow_divert_handle_close(struct flow_divert_pcb *fd_cb, mbuf_t packet, int offset)
1507 FDLOG(LOG_ERR, fd_cb, "failed to get the close error: %d", error);
1513 FDLOG(LOG_ERR, fd_cb, "failed to get the close how flag: %d", error);
1519 FDLOG(LOG_INFO, fd_cb, "close received, how = %d", how);
1521 FDLOCK(fd_cb);
1522 if (fd_cb->so != NULL) {
1523 socket_lock(fd_cb->so, 0);
1525 fd_cb->so->so_error = ntohl(close_error);
1527 flow_divert_update_closed_state(fd_cb, how, TRUE);
1529 how = flow_divert_tunnel_how_closed(fd_cb);
1531 soisdisconnected(fd_cb->so);
1533 socantrcvmore(fd_cb->so);
1535 socantsendmore(fd_cb->so);
1538 socket_unlock(fd_cb->so, 0);
1540 FDUNLOCK(fd_cb);
1544 flow_divert_handle_data(struct flow_divert_pcb *fd_cb, mbuf_t packet, size_t offset)
1552 FDLOG(LOG_DEBUG, fd_cb, "received %lu bytes of data", data_size);
1556 FDLOG(LOG_ERR, fd_cb, "mbuf_split failed: %d", error);
1560 FDLOCK(fd_cb);
1561 if (fd_cb->so != NULL) {
1562 socket_lock(fd_cb->so, 0);
1563 if (flow_divert_check_no_cellular(fd_cb) ||
1564 flow_divert_check_no_expensive(fd_cb)) {
1565 flow_divert_update_closed_state(fd_cb, SHUT_RDWR, TRUE);
1566 flow_divert_send_close(fd_cb, SHUT_RDWR);
1567 soisdisconnected(fd_cb->so);
1568 } else if (!(fd_cb->so->so_state & SS_CANTRCVMORE)) {
1569 if (sbappendstream(&fd_cb->so->so_rcv, data)) {
1570 fd_cb->bytes_received += data_size;
1571 flow_divert_add_data_statistics(fd_cb, data_size, FALSE);
1572 fd_cb->sb_size = fd_cb->so->so_rcv.sb_cc;
1573 sorwakeup(fd_cb->so);
1576 FDLOG0(LOG_ERR, fd_cb, "received data, but appendstream failed");
1579 socket_unlock(fd_cb->so, 0);
1581 FDUNLOCK(fd_cb);
1589 flow_divert_handle_read_notification(struct flow_divert_pcb *fd_cb, mbuf_t packet, int offset)
1596 FDLOG(LOG_ERR, fd_cb, "failed to get the read count: %d", error);
1600 FDLOG(LOG_DEBUG, fd_cb, "received a read notification for %u bytes", read_count);
1602 FDLOCK(fd_cb);
1603 if (fd_cb->so != NULL) {
1604 socket_lock(fd_cb->so, 0);
1605 fd_cb->send_window += ntohl(read_count);
1606 flow_divert_send_buffered_data(fd_cb, FALSE);
1607 socket_unlock(fd_cb->so, 0);
1609 FDUNLOCK(fd_cb);
1653 flow_divert_handle_properties_update(struct flow_divert_pcb *fd_cb, mbuf_t packet, int offset)
1660 FDLOG0(LOG_INFO, fd_cb, "received a properties update");
1667 FDLOG0(LOG_INFO, fd_cb, "No local address provided");
1672 FDLOG0(LOG_INFO, fd_cb, "No remote address provided");
1677 FDLOG0(LOG_INFO, fd_cb, "No output if index provided");
1680 FDLOCK(fd_cb);
1681 if (fd_cb->so != NULL) {
1685 socket_lock(fd_cb->so, 0);
1687 inp = sotoinpcb(fd_cb->so);
1693 fd_cb->local_address = dup_sockaddr((struct sockaddr *)&local_address, 1);
1700 fd_cb->remote_address = dup_sockaddr((struct sockaddr *)&remote_address, 1);
1713 socket_unlock(fd_cb->so, 0);
1715 FDUNLOCK(fd_cb);
1899 struct flow_divert_pcb *fd_cb;
1934 fd_cb = flow_divert_pcb_lookup(hdr.conn_id, group); /* This retains the PCB */
1935 if (fd_cb == NULL) {
1944 flow_divert_handle_connect_result(fd_cb, packet, sizeof(hdr));
1947 flow_divert_handle_close(fd_cb, packet, sizeof(hdr));
1950 flow_divert_handle_data(fd_cb, packet, sizeof(hdr));
1953 flow_divert_handle_read_notification(fd_cb, packet, sizeof(hdr));
1956 flow_divert_handle_properties_update(fd_cb, packet, sizeof(hdr));
1959 FDLOG(LOG_WARNING, fd_cb, "got an unknown message type: %d", hdr.packet_type);
1963 FDRELEASE(fd_cb);
1973 struct flow_divert_pcb *fd_cb;
1982 RB_FOREACH(fd_cb, fd_pcb_tree, &group->pcb_tree) {
1983 FDRETAIN(fd_cb);
1984 SLIST_INSERT_HEAD(&tmp_list, fd_cb, tmp_list_entry);
1990 fd_cb = SLIST_FIRST(&tmp_list);
1991 FDLOCK(fd_cb);
1993 if (fd_cb->so != NULL) {
1994 socket_lock(fd_cb->so, 0);
1995 flow_divert_pcb_remove(fd_cb);
1996 flow_divert_update_closed_state(fd_cb, SHUT_RDWR, TRUE);
1997 fd_cb->so->so_error = ECONNABORTED;
1998 socket_unlock(fd_cb->so, 0);
2000 FDUNLOCK(fd_cb);
2001 FDRELEASE(fd_cb);
2008 struct flow_divert_pcb *fd_cb = so->so_fd_pcb;
2015 FDLOG(LOG_INFO, fd_cb, "Detaching, ref count = %d", fd_cb->ref_count);
2017 if (fd_cb->group != NULL) {
2019 flow_divert_send_buffered_data(fd_cb, TRUE);
2022 flow_divert_pcb_remove(fd_cb);
2026 FDLOCK(fd_cb);
2027 fd_cb->so = NULL;
2028 FDUNLOCK(fd_cb);
2031 FDRELEASE(fd_cb); /* Release the socket's reference */
2037 struct flow_divert_pcb *fd_cb = so->so_fd_pcb;
2041 FDLOG0(LOG_INFO, fd_cb, "Closing");
2046 flow_divert_send_buffered_data(fd_cb, TRUE);
2047 flow_divert_update_closed_state(fd_cb, SHUT_RDWR, FALSE);
2048 flow_divert_send_close_if_needed(fd_cb);
2051 flow_divert_pcb_remove(fd_cb);
2069 struct flow_divert_pcb *fd_cb = so->so_fd_pcb;
2073 FDLOG0(LOG_INFO, fd_cb, "Can't send more");
2077 flow_divert_update_closed_state(fd_cb, SHUT_WR, FALSE);
2078 flow_divert_send_close_if_needed(fd_cb);
2086 struct flow_divert_pcb *fd_cb = so->so_fd_pcb;
2092 latest_sb_size = fd_cb->so->so_rcv.sb_cc;
2094 if (fd_cb->sb_size < latest_sb_size) {
2096 fd_cb->hash, fd_cb->sb_size, latest_sb_size);
2099 read_count = fd_cb->sb_size - latest_sb_size;
2101 FDLOG(LOG_DEBUG, fd_cb, "app read %u bytes", read_count);
2103 if (read_count > 0 && flow_divert_send_read_notification(fd_cb, read_count) == 0) {
2104 fd_cb->bytes_read_by_app += read_count;
2105 fd_cb->sb_size = latest_sb_size;
2151 struct flow_divert_pcb *fd_cb = so->so_fd_pcb;
2156 fd_cb->remote_address,
2163 struct flow_divert_pcb *fd_cb = so->so_fd_pcb;
2168 fd_cb->local_address,
2175 struct flow_divert_pcb *fd_cb = so->so_fd_pcb;
2180 if (sopt->sopt_dir == SOPT_SET && fd_cb->flags & FLOW_DIVERT_CONNECT_STARTED) {
2181 flow_divert_send_traffic_class_update(fd_cb, so->so_traffic_class);
2199 struct flow_divert_pcb *fd_cb = so->so_fd_pcb;
2209 if (fd_cb->group == NULL) {
2233 if ((fd_cb->flags & FLOW_DIVERT_CONNECT_STARTED) && !(fd_cb->flags & FLOW_DIVERT_TRANSFERRED)) {
2238 if (fd_cb->flags & FLOW_DIVERT_TRANSFERRED) {
2239 FDLOG0(LOG_INFO, fd_cb, "fully transferred");
2240 fd_cb->flags &= ~FLOW_DIVERT_TRANSFERRED;
2241 if (fd_cb->remote_address != NULL) {
2242 soisconnected(fd_cb->so);
2247 error = flow_divert_packet_init(fd_cb, FLOW_DIVERT_PKT_CONNECT, &connect_packet);
2254 if (fd_cb->connect_token != NULL) {
2256 int find_error = flow_divert_packet_get_tlv(fd_cb->connect_token, 0, FLOW_DIVERT_TLV_SIGNING_ID, 0, NULL, &sid_size);
2260 flow_divert_packet_get_tlv(fd_cb->connect_token, 0, FLOW_DIVERT_TLV_SIGNING_ID, sid_size, signing_id, NULL);
2261 FDLOG(LOG_INFO, fd_cb, "Got %s from token", signing_id);
2279 FDLOG0(LOG_WARNING, fd_cb, "Signature is invalid");
2282 FDLOG0(LOG_WARNING, fd_cb, "Failed to determine the current proc");
2295 FDLOG(LOG_INFO, fd_cb, "%s matched", signing_id);
2305 FDLOG(LOG_ERR, fd_cb, "failed to append the cdhash: %d", error);
2308 FDLOG(LOG_ERR, fd_cb, "failed to get the cdhash: %d", error);
2312 FDLOG(LOG_ERR, fd_cb, "failed to append the signing ID: %d", error);
2315 FDLOG(LOG_WARNING, fd_cb, "%s did not match", signing_id);
2318 FDLOG0(LOG_WARNING, fd_cb, "Failed to get the code signing identity");
2328 FDLOG0(LOG_WARNING, fd_cb, "The signing ID trie is empty");
2340 FDLOG0(LOG_INFO, fd_cb, "Connecting");
2342 error = flow_divert_send_connect(fd_cb, to, connect_packet);
2347 fd_cb->flags |= FLOW_DIVERT_CONNECT_STARTED;
2424 struct flow_divert_pcb *fd_cb = so->so_fd_pcb;
2449 if (fd_cb->local_address == NULL) {
2462 *src_len = fd_cb->local_address->sa_len;
2464 error = copyout(fd_cb->local_address, src, fd_cb->local_address->sa_len);
2471 if (fd_cb->remote_address == NULL) {
2484 *dst_len = fd_cb->remote_address->sa_len;
2486 error = copyout(fd_cb->remote_address, dst, fd_cb->remote_address->sa_len);
2568 struct flow_divert_pcb *fd_cb = so->so_fd_pcb;
2590 error = flow_divert_check_no_cellular(fd_cb) ||
2591 flow_divert_check_no_expensive(fd_cb);
2597 if (!(fd_cb->flags & FLOW_DIVERT_CONNECT_STARTED)) {
2598 FDLOG0(LOG_INFO, fd_cb, "implicit connect");
2605 FDLOG(LOG_DEBUG, fd_cb, "app wrote %lu bytes", mbuf_pkthdr_len(data));
2607 fd_cb->bytes_written_by_app += mbuf_pkthdr_len(data);
2608 error = flow_divert_send_app_data(fd_cb, data);
2647 struct flow_divert_pcb *fd_cb = NULL;
2662 fd_cb = flow_divert_pcb_lookup(flow_id, group);
2667 if (fd_cb == NULL) {
2672 FDLOCK(fd_cb);
2675 old_so = fd_cb->so;
2686 fd_cb->so = NULL;
2697 so->so_fd_pcb = fd_cb;
2708 fd_cb->so = so;
2709 fd_cb->flags |= FLOW_DIVERT_TRANSFERRED;
2711 FDUNLOCK(fd_cb);
2716 if (fd_cb != NULL) {
2717 FDRELEASE(fd_cb); /* Release the reference obtained via flow_divert_pcb_lookup */
2727 struct flow_divert_pcb *fd_cb;
2733 fd_cb = flow_divert_pcb_create(so);
2734 if (fd_cb != NULL) {
2735 error = flow_divert_pcb_insert(fd_cb, ctl_unit);
2737 FDLOG(LOG_ERR, fd_cb, "pcb insert failed: %d", error);
2738 FDRELEASE(fd_cb);
2740 fd_cb->log_level = LOG_NOTICE;
2741 fd_cb->control_group_unit = ctl_unit;
2742 so->so_fd_pcb = fd_cb;
2746 FDLOG0(LOG_INFO, fd_cb, "Created");
2845 struct flow_divert_pcb *fd_cb = so->so_fd_pcb;
2851 fd_cb->log_level = log_level;
2855 fd_cb->connect_token = token;
2876 struct flow_divert_pcb *fd_cb = so->so_fd_pcb;
2887 if (fd_cb->group == NULL) {
2894 FDLOG(LOG_ERR, fd_cb, "failed to allocate the header mbuf: %d", error);
2898 ctl_unit = htonl(fd_cb->group->ctl_unit);
2905 error = flow_divert_packet_append_tlv(token, FLOW_DIVERT_TLV_FLOW_ID, sizeof(fd_cb->hash), &fd_cb->hash);
2914 fd_cb->control_group_unit > 0 && fd_cb->control_group_unit < GROUP_COUNT_MAX)
2916 control_group = g_flow_divert_groups[fd_cb->control_group_unit];
3083 struct flow_divert_pcb *fd_cb;
3106 RB_FOREACH(fd_cb, fd_pcb_tree, &group->pcb_tree) {
3107 FDRETAIN(fd_cb);
3108 SLIST_INSERT_HEAD(&tmp_list, fd_cb, tmp_list_entry);
3113 SLIST_FOREACH(fd_cb, &tmp_list, tmp_list_entry) {
3114 FDLOCK(fd_cb);
3115 if (fd_cb->so != NULL) {
3116 socket_lock(fd_cb->so, 0);
3117 if (fd_cb->group != NULL) {
3118 flow_divert_send_buffered_data(fd_cb, FALSE);
3120 socket_unlock(fd_cb->so, 0);
3122 FDUNLOCK(fd_cb);
3123 FDRELEASE(fd_cb);