--- zzzz-none-000/linux-4.9.279/net/socket.c 2021-08-08 06:38:54.000000000 +0000 +++ puma7-atom-6591-750/linux-4.9.279/net/socket.c 2023-02-08 11:43:43.000000000 +0000 @@ -378,6 +378,9 @@ .kill_sb = kill_anon_super, }; +int (*toe_acceleration_flag_set_hook)(struct sock *, struct pid *, enum toe_acceleration_flag_set_act); +EXPORT_SYMBOL(toe_acceleration_flag_set_hook); + /* * Obtains the first available file descriptor and sets it up for use. * @@ -400,6 +403,7 @@ struct qstr name = { .name = "" }; struct path path; struct file *file; + struct pid *toe_pid; if (dname) { name.name = dname; @@ -427,6 +431,13 @@ sock->file = file; file->f_flags = O_RDWR | (flags & O_NONBLOCK); file->private_data = sock; + if (sock->sk) { + if (toe_acceleration_flag_set_hook) { + toe_pid = find_get_pid(task_pid_nr(current)); + toe_acceleration_flag_set_hook(sock->sk, toe_pid, SOCKET_ALLOCATE); + put_pid(toe_pid); + } + } return file; } EXPORT_SYMBOL(sock_alloc_file); @@ -534,8 +545,22 @@ return used; } +int sockfs_setattr(struct dentry *dentry, struct iattr *iattr) +{ + int err = simple_setattr(dentry, iattr); + + if (!err) { + struct socket *sock = SOCKET_I(d_inode(dentry)); + + sock->sk->sk_uid = iattr->ia_uid; + } + + return err; +} + static const struct inode_operations sockfs_inode_ops = { .listxattr = sockfs_listxattr, + .setattr = sockfs_setattr, }; /** @@ -580,6 +605,14 @@ void sock_release(struct socket *sock) { + struct pid * toe_pid; + if (sock->sk) { + if (toe_acceleration_flag_set_hook) { + toe_pid = find_get_pid(task_pid_nr(current)); + toe_acceleration_flag_set_hook(sock->sk, toe_pid, SOCKET_RELEASE); + put_pid(toe_pid); + } + } if (sock->ops) { struct module *owner = sock->ops->owner; @@ -848,6 +881,12 @@ } EXPORT_SYMBOL(brioctl_set); +br_ioctl_hook_t brioctl_get(void) +{ + return br_ioctl_hook; +} +EXPORT_SYMBOL(brioctl_get); + static DEFINE_MUTEX(vlan_ioctl_mutex); static int (*vlan_ioctl_hook) (struct net *, void __user *arg); @@ -900,6 +939,9 @@ void __user *argp = (void __user *)arg; int pid, err; struct net *net; +#ifdef CONFIG_AVM_SK_TC_INDEX + unsigned long tc_index; +#endif sock = file->private_data; sk = sock->sk; @@ -961,6 +1003,21 @@ err = dlci_ioctl_hook(cmd, argp); mutex_unlock(&dlci_ioctl_mutex); break; + +#ifdef CONFIG_AVM_SK_TC_INDEX + case SIOCSET_TC_INDEX: + err = -EFAULT; + if (get_user(tc_index, (unsigned long __user *)argp)) + break; + sock->sk->sk_tc_index = tc_index; + err = 0; + break; + + case SIOCGET_TC_INDEX: + err = put_user(sock->sk->sk_tc_index, (unsigned long __user *)argp); + break; +#endif + default: err = sock_do_ioctl(net, sock, cmd, arg); break;