/* Loop over the interfaces, and write an info block for each. */
rtnl_net_lock(net);
for_each_netdev(net, dev) { if (!pos)
done = inet_gifconf(dev, NULL, 0, size); else
done = inet_gifconf(dev, pos + total,
len - total, size); if (done < 0) {
rtnl_net_unlock(net); return -EFAULT;
}
total += done;
}
rtnl_net_unlock(net);
switch (tx_type) { case HWTSTAMP_TX_OFF: case HWTSTAMP_TX_ON: case HWTSTAMP_TX_ONESTEP_SYNC: case HWTSTAMP_TX_ONESTEP_P2P:
tx_type_valid = 1; break; case __HWTSTAMP_TX_CNT: /* not a real value */ break;
}
switch (rx_filter) { case HWTSTAMP_FILTER_NONE: case HWTSTAMP_FILTER_ALL: case HWTSTAMP_FILTER_SOME: case HWTSTAMP_FILTER_PTP_V1_L4_EVENT: case HWTSTAMP_FILTER_PTP_V1_L4_SYNC: case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: case HWTSTAMP_FILTER_PTP_V2_L4_SYNC: case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ: case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ: case HWTSTAMP_FILTER_PTP_V2_EVENT: case HWTSTAMP_FILTER_PTP_V2_SYNC: case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: case HWTSTAMP_FILTER_NTP_ALL:
rx_filter_valid = 1; break; case __HWTSTAMP_FILTER_CNT: /* not a real value */ break;
}
if (!tx_type_valid || !rx_filter_valid) return -ERANGE;
/* If the request was resolved through an unconverted driver, omit *thecopy_to_user(),sincetheimplementationhasalreadydonethat
*/ if (!kernel_cfg.copied_to_user) {
hwtstamp_config_from_kernel(&cfg, &kernel_cfg);
if (copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg))) return -EFAULT;
}
/* The driver may have modified the configuration, so copy the *updatedversionofitbacktouserspace
*/ if (!kernel_cfg.copied_to_user) {
hwtstamp_config_from_kernel(&cfg, &kernel_cfg);
if (copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg))) return -EFAULT;
}
return0;
}
staticint generic_hwtstamp_ioctl_lower(struct net_device *dev, int cmd, struct kernel_hwtstamp_config *kernel_cfg)
{ struct ifreq ifrr; int err;
case SIOCSHWTSTAMP: return dev_set_hwtstamp(dev, ifr);
case SIOCGHWTSTAMP: return dev_get_hwtstamp(dev, ifr);
case SIOCGMIIPHY: case SIOCGMIIREG: case SIOCSMIIREG: return dev_eth_ioctl(dev, ifr, cmd);
case SIOCBONDENSLAVE: case SIOCBONDRELEASE: case SIOCBONDSETHWADDR: case SIOCBONDSLAVEINFOQUERY: case SIOCBONDINFOQUERY: case SIOCBONDCHANGEACTIVE: return dev_siocbond(dev, ifr, cmd);
int dev_ioctl(struct net *net, unsignedint cmd, struct ifreq *ifr, void __user *data, bool *need_copyout)
{ int ret; char *colon;
if (need_copyout)
*need_copyout = true; if (cmd == SIOCGIFNAME) return dev_ifname(net, ifr);
ifr->ifr_name[IFNAMSIZ-1] = 0;
colon = strchr(ifr->ifr_name, ':'); if (colon)
*colon = 0;
/* *Seewhichinterfacethecalleristalkingabout.
*/
switch (cmd) { case SIOCGIFHWADDR:
dev_load(net, ifr->ifr_name);
ret = netif_get_mac_address(&ifr->ifr_hwaddr, net,
ifr->ifr_name); if (colon)
*colon = ':'; return ret; /* *Theseioctlcalls: *-canbedonebyall. *-atomicanddonotrequirelocking. *-returnavalue
*/ case SIOCGIFFLAGS: case SIOCGIFMETRIC: case SIOCGIFMTU: case SIOCGIFSLAVE: case SIOCGIFMAP: case SIOCGIFINDEX: case SIOCGIFTXQLEN:
dev_load(net, ifr->ifr_name);
rcu_read_lock();
ret = dev_ifsioc_locked(net, ifr, cmd);
rcu_read_unlock(); if (colon)
*colon = ':'; return ret;
case SIOCETHTOOL:
dev_load(net, ifr->ifr_name);
ret = dev_ethtool(net, ifr, data); if (colon)
*colon = ':'; return ret;
/* *Theseioctlcalls: *-requiresuperuserpower. *-requirestrictserialization. *-returnavalue
*/ case SIOCGMIIPHY: case SIOCGMIIREG: case SIOCSIFNAME:
dev_load(net, ifr->ifr_name); if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) return -EPERM;
rtnl_net_lock(net);
ret = dev_ifsioc(net, ifr, data, cmd);
rtnl_net_unlock(net);
if (colon)
*colon = ':'; return ret;
/* *Theseioctlcalls: *-requiresuperuserpower. *-requirestrictserialization. *-donotreturnavalue
*/ case SIOCSIFMAP: case SIOCSIFTXQLEN: if (!capable(CAP_NET_ADMIN)) return -EPERM;
fallthrough; /* *Theseioctlcalls: *-requirelocalsuperuserpower. *-requirestrictserialization. *-donotreturnavalue
*/ case SIOCSIFFLAGS: case SIOCSIFMETRIC: case SIOCSIFMTU: case SIOCSIFHWADDR: case SIOCSIFSLAVE: case SIOCADDMULTI: case SIOCDELMULTI: case SIOCSIFHWBROADCAST: case SIOCSMIIREG: case SIOCBONDENSLAVE: case SIOCBONDRELEASE: case SIOCBONDSETHWADDR: case SIOCBONDCHANGEACTIVE: case SIOCSHWTSTAMP: if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) return -EPERM;
fallthrough; case SIOCBONDSLAVEINFOQUERY: case SIOCBONDINFOQUERY:
dev_load(net, ifr->ifr_name);
rtnl_net_lock(net);
ret = dev_ifsioc(net, ifr, data, cmd);
rtnl_net_unlock(net);
if (need_copyout)
*need_copyout = false; return ret;
case SIOCGIFMEM: /* Get the per device memory space. We can add this but
* currently do not support it */ case SIOCSIFMEM: /* Set the per device memory buffer space.
* Not applicable in our case */ case SIOCSIFLINK: return -ENOTTY;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.