| 3063 | } |
| 3064 | |
| 3065 | static int |
| 3066 | sysctl_drop(SYSCTL_HANDLER_ARGS) |
| 3067 | { |
| 3068 | /* addrs[0] is a foreign socket, addrs[1] is a local one. */ |
| 3069 | struct sockaddr_storage addrs[2]; |
| 3070 | struct inpcb *inp; |
| 3071 | struct tcpcb *tp; |
| 3072 | struct tcptw *tw; |
| 3073 | struct sockaddr_in *fin, *lin; |
| 3074 | struct epoch_tracker et; |
| 3075 | #ifdef INET6 |
| 3076 | struct sockaddr_in6 *fin6, *lin6; |
| 3077 | #endif |
| 3078 | int error; |
| 3079 | |
| 3080 | inp = NULL; |
| 3081 | fin = lin = NULL; |
| 3082 | #ifdef INET6 |
| 3083 | fin6 = lin6 = NULL; |
| 3084 | #endif |
| 3085 | error = 0; |
| 3086 | |
| 3087 | if (req->oldptr != NULL || req->oldlen != 0) |
| 3088 | return (EINVAL); |
| 3089 | if (req->newptr == NULL) |
| 3090 | return (EPERM); |
| 3091 | if (req->newlen < sizeof(addrs)) |
| 3092 | return (ENOMEM); |
| 3093 | error = SYSCTL_IN(req, &addrs, sizeof(addrs)); |
| 3094 | if (error) |
| 3095 | return (error); |
| 3096 | |
| 3097 | switch (addrs[0].ss_family) { |
| 3098 | #ifdef INET6 |
| 3099 | case AF_INET6: |
| 3100 | fin6 = (struct sockaddr_in6 *)&addrs[0]; |
| 3101 | lin6 = (struct sockaddr_in6 *)&addrs[1]; |
| 3102 | if (fin6->sin6_len != sizeof(struct sockaddr_in6) || |
| 3103 | lin6->sin6_len != sizeof(struct sockaddr_in6)) |
| 3104 | return (EINVAL); |
| 3105 | if (IN6_IS_ADDR_V4MAPPED(&fin6->sin6_addr)) { |
| 3106 | if (!IN6_IS_ADDR_V4MAPPED(&lin6->sin6_addr)) |
| 3107 | return (EINVAL); |
| 3108 | in6_sin6_2_sin_in_sock((struct sockaddr *)&addrs[0]); |
| 3109 | in6_sin6_2_sin_in_sock((struct sockaddr *)&addrs[1]); |
| 3110 | fin = (struct sockaddr_in *)&addrs[0]; |
| 3111 | lin = (struct sockaddr_in *)&addrs[1]; |
| 3112 | break; |
| 3113 | } |
| 3114 | error = sa6_embedscope(fin6, V_ip6_use_defzone); |
| 3115 | if (error) |
| 3116 | return (error); |
| 3117 | error = sa6_embedscope(lin6, V_ip6_use_defzone); |
| 3118 | if (error) |
| 3119 | return (error); |
| 3120 | break; |
| 3121 | #endif |
| 3122 | #ifdef INET |
nothing calls this directly
no test coverage detected