| These changes are required to backport blueooth. A lot can be optimized |
| here still, but for now we keep this here. |
| |
| --- a/drivers/bluetooth/hci_ldisc.c |
| +++ b/drivers/bluetooth/hci_ldisc.c |
| @@ -282,8 +282,13 @@ static int hci_uart_tty_open(struct tty_ |
| /* FIXME: why is this needed. Note don't use ldisc_ref here as the |
| open path is before the ldisc is referencable */ |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30)) |
| if (tty->ldisc->ops->flush_buffer) |
| tty->ldisc->ops->flush_buffer(tty); |
| +#else |
| + if (tty->ldisc.ops->flush_buffer) |
| + tty->ldisc.ops->flush_buffer(tty); |
| +#endif |
| tty_driver_flush_buffer(tty); |
| |
| return 0; |
| @@ -398,7 +403,9 @@ static int hci_uart_register_dev(struct |
| hdev->flush = hci_uart_flush; |
| hdev->send = hci_uart_send_frame; |
| hdev->destruct = hci_uart_destruct; |
| +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) |
| hdev->parent = hu->tty->dev; |
| +#endif |
| |
| hdev->owner = THIS_MODULE; |
| |
| @@ -498,7 +505,11 @@ static int hci_uart_tty_ioctl(struct tty |
| return hu->hdev_flags; |
| |
| default: |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) |
| err = n_tty_ioctl_helper(tty, file, cmd, arg); |
| +#else |
| + err = n_tty_ioctl(tty, file, cmd, arg); |
| +#endif |
| break; |
| }; |
| |
| --- a/net/bluetooth/af_bluetooth.c |
| +++ b/net/bluetooth/af_bluetooth.c |
| @@ -125,8 +125,12 @@ int bt_sock_unregister(int proto) |
| } |
| EXPORT_SYMBOL(bt_sock_unregister); |
| |
| +#if defined(CONFIG_COMPAT_BT_SOCK_CREATE_NEEDS_KERN) |
| static int bt_sock_create(struct net *net, struct socket *sock, int proto, |
| int kern) |
| +#else |
| +static int bt_sock_create(struct net *net, struct socket *sock, int proto) |
| +#endif |
| { |
| int err; |
| |
| @@ -144,7 +148,11 @@ static int bt_sock_create(struct net *ne |
| read_lock(&bt_proto_lock); |
| |
| if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) { |
| +#if defined(CONFIG_COMPAT_BT_SOCK_CREATE_NEEDS_KERN) |
| err = bt_proto[proto]->create(net, sock, proto, kern); |
| +#else |
| + err = bt_proto[proto]->create(net, sock, proto); |
| +#endif |
| bt_sock_reclassify_lock(sock, proto); |
| module_put(bt_proto[proto]->owner); |
| } |
| @@ -478,7 +486,11 @@ int bt_sock_ioctl(struct socket *sock, u |
| if (sk->sk_state == BT_LISTEN) |
| return -EINVAL; |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,31)) |
| amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk); |
| +#else |
| + amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc); |
| +#endif |
| if (amount < 0) |
| amount = 0; |
| err = put_user(amount, (int __user *) arg); |
| --- a/net/bluetooth/cmtp/capi.c |
| +++ b/net/bluetooth/cmtp/capi.c |
| @@ -384,7 +384,11 @@ static void cmtp_reset_ctr(struct capi_c |
| |
| BT_DBG("ctrl %p", ctrl); |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30)) |
| capi_ctr_down(ctrl); |
| +#else |
| + capi_ctr_reseted(ctrl); |
| +#endif |
| |
| atomic_inc(&session->terminate); |
| wake_up_process(session->task); |
| --- a/net/bluetooth/hci_sock.c |
| +++ b/net/bluetooth/hci_sock.c |
| @@ -561,7 +561,11 @@ drop: |
| goto done; |
| } |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,31)) |
| static int hci_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int len) |
| +#else |
| +static int hci_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int len) |
| +#endif |
| { |
| struct hci_ufilter uf = { .opcode = 0 }; |
| struct sock *sk = sock->sk; |
| @@ -716,8 +720,12 @@ static struct proto hci_sk_proto = { |
| .obj_size = sizeof(struct hci_pinfo) |
| }; |
| |
| +#if defined(CONFIG_COMPAT_BT_SOCK_CREATE_NEEDS_KERN) |
| static int hci_sock_create(struct net *net, struct socket *sock, int protocol, |
| int kern) |
| +#else |
| +static int hci_sock_create(struct net *net, struct socket *sock, int protocol) |
| +#endif |
| { |
| struct sock *sk; |
| |
| --- a/net/bluetooth/hci_sysfs.c |
| +++ b/net/bluetooth/hci_sysfs.c |
| @@ -72,7 +72,11 @@ static struct attribute_group bt_link_gr |
| .attrs = bt_link_attrs, |
| }; |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,31)) |
| static const struct attribute_group *bt_link_groups[] = { |
| +#else |
| +static struct attribute_group *bt_link_groups[] = { |
| +#endif |
| &bt_link_group, |
| NULL |
| }; |
| @@ -130,7 +134,11 @@ static void del_conn(struct work_struct |
| dev = device_find_child(&conn->dev, NULL, __match_tty); |
| if (!dev) |
| break; |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,29)) |
| device_move(dev, NULL, DPM_ORDER_DEV_LAST); |
| +#else |
| + device_move(dev, NULL); |
| +#endif |
| put_device(dev); |
| } |
| |
| @@ -380,7 +388,11 @@ static struct attribute_group bt_host_gr |
| .attrs = bt_host_attrs, |
| }; |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,31)) |
| static const struct attribute_group *bt_host_groups[] = { |
| +#else |
| +static struct attribute_group *bt_host_groups[] = { |
| +#endif |
| &bt_host_group, |
| NULL |
| }; |
| --- a/net/bluetooth/hidp/core.c |
| +++ b/net/bluetooth/hidp/core.c |
| @@ -398,6 +398,7 @@ err: |
| return ret; |
| } |
| |
| +#if defined(CONFIG_COMPAT_BT_SOCK_CREATE_NEEDS_KERN) |
| static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count, |
| unsigned char report_type) |
| { |
| @@ -456,6 +457,16 @@ err: |
| mutex_unlock(&session->report_mutex); |
| return ret; |
| } |
| +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) |
| +static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count) |
| +{ |
| + if (hidp_send_ctrl_message(hid->driver_data, |
| + HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE, |
| + data, count)) |
| + return -ENOMEM; |
| + return count; |
| +} |
| +#endif |
| |
| static void hidp_idle_timeout(unsigned long arg) |
| { |
| @@ -757,8 +768,14 @@ static int hidp_session(void *arg) |
| } |
| |
| if (session->hid) { |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) |
| hid_destroy_device(session->hid); |
| session->hid = NULL; |
| +#else |
| + if (session->hid->claimed & HID_CLAIMED_INPUT) |
| + hidinput_disconnect(session->hid); |
| + hid_free_device(session->hid); |
| +#endif |
| } |
| |
| /* Wakeup user-space polling for socket errors */ |
| @@ -869,6 +886,70 @@ static void hidp_close(struct hid_device |
| { |
| } |
| |
| +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)) |
| +static const struct { |
| + __u16 idVendor; |
| + __u16 idProduct; |
| + unsigned quirks; |
| +} hidp_blacklist[] = { |
| + /* Apple wireless Mighty Mouse */ |
| + { 0x05ac, 0x030c, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL }, |
| + |
| + { } /* Terminating entry */ |
| +}; |
| +static void hidp_setup_quirks(struct hid_device *hid) |
| +{ |
| + unsigned int n; |
| + |
| + for (n = 0; hidp_blacklist[n].idVendor; n++) |
| + if (hidp_blacklist[n].idVendor == le16_to_cpu(hid->vendor) && |
| + hidp_blacklist[n].idProduct == le16_to_cpu(hid->product)) |
| + hid->quirks = hidp_blacklist[n].quirks; |
| +} |
| + |
| +static void hidp_setup_hid(struct hidp_session *session, |
| + struct hidp_connadd_req *req) |
| +{ |
| + struct hid_device *hid = session->hid; |
| + struct hid_report *report; |
| + bdaddr_t src, dst; |
| + |
| + session->hid = hid; |
| + |
| + hid->driver_data = session; |
| + |
| + baswap(&src, &bt_sk(session->ctrl_sock->sk)->src); |
| + baswap(&dst, &bt_sk(session->ctrl_sock->sk)->dst); |
| + |
| + hid->bus = BUS_BLUETOOTH; |
| + hid->vendor = req->vendor; |
| + hid->product = req->product; |
| + hid->version = req->version; |
| + hid->country = req->country; |
| + |
| + strncpy(hid->name, req->name, 128); |
| + strncpy(hid->phys, batostr(&src), 64); |
| + strncpy(hid->uniq, batostr(&dst), 64); |
| + |
| + hid->dev = hidp_get_device(session); |
| + hid->hid_open = hidp_open; |
| + hid->hid_close = hidp_close; |
| + |
| + hid->hidinput_input_event = hidp_hidinput_event; |
| + |
| + hidp_setup_quirks(hid); |
| + |
| + list_for_each_entry(report, &hid->report_enum[HID_INPUT_REPORT].report_list, list) |
| + hidp_send_report(session, report); |
| + |
| + list_for_each_entry(report, &hid->report_enum[HID_FEATURE_REPORT].report_list, list) |
| + hidp_send_report(session, report); |
| + |
| + if (hidinput_connect(hid) == 0) |
| + hid->claimed |= HID_CLAIMED_INPUT; |
| +} |
| +#else |
| + |
| static int hidp_parse(struct hid_device *hid) |
| { |
| struct hidp_session *session = hid->driver_data; |
| @@ -956,7 +1037,9 @@ static int hidp_setup_hid(struct hidp_se |
| hid->dev.parent = &session->conn->dev; |
| hid->ll_driver = &hidp_hid_driver; |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38)) |
| hid->hid_get_raw_report = hidp_get_raw_report; |
| +#endif |
| hid->hid_output_raw_report = hidp_output_raw_report; |
| |
| return 0; |
| @@ -967,6 +1050,7 @@ fault: |
| |
| return err; |
| } |
| +#endif |
| |
| int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, struct socket *intr_sock) |
| { |
| @@ -982,6 +1066,39 @@ int hidp_add_connection(struct hidp_conn |
| |
| BT_DBG("rd_data %p rd_size %d", req->rd_data, req->rd_size); |
| |
| +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)) |
| + if (req->rd_size > 0) { |
| + unsigned char *buf = kmalloc(req->rd_size, GFP_KERNEL); |
| + |
| + if (!buf) { |
| + kfree(session); |
| + return -ENOMEM; |
| + } |
| + |
| + if (copy_from_user(buf, req->rd_data, req->rd_size)) { |
| + kfree(buf); |
| + kfree(session); |
| + return -EFAULT; |
| + } |
| + |
| + session->hid = hid_parse_report(buf, req->rd_size); |
| + |
| + kfree(buf); |
| + |
| + if (!session->hid) { |
| + kfree(session); |
| + return -EINVAL; |
| + } |
| + } |
| + |
| + if (!session->hid) { |
| + session->input = input_allocate_device(); |
| + if (!session->input) { |
| + kfree(session); |
| + return -ENOMEM; |
| + } |
| + } |
| +#endif |
| down_write(&hidp_session_sem); |
| |
| s = __hidp_get_session(&bt_sk(ctrl_sock->sk)->dst); |
| @@ -1029,6 +1146,7 @@ int hidp_add_connection(struct hidp_conn |
| |
| __hidp_link_session(session); |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) |
| if (req->rd_size > 0) { |
| err = hidp_setup_hid(session, req); |
| if (err) |
| @@ -1040,6 +1158,16 @@ int hidp_add_connection(struct hidp_conn |
| if (err < 0) |
| goto purge; |
| } |
| +#else |
| + if (session->input) { |
| + err = hidp_setup_input(session, req); |
| + if (err < 0) |
| + goto failed; |
| + } |
| + |
| + if (session->hid) |
| + hidp_setup_hid(session, req); |
| +#endif |
| |
| hidp_set_timer(session); |
| |
| @@ -1098,6 +1226,7 @@ unlink: |
| session->input = NULL; |
| } |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) |
| if (session->hid) { |
| hid_destroy_device(session->hid); |
| session->hid = NULL; |
| @@ -1111,10 +1240,15 @@ purge: |
| |
| skb_queue_purge(&session->ctrl_transmit); |
| skb_queue_purge(&session->intr_transmit); |
| +#endif |
| |
| failed: |
| up_write(&hidp_session_sem); |
| |
| +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)) |
| + if (session->hid) |
| + hid_free_device(session->hid); |
| +#endif |
| kfree(session); |
| return err; |
| } |
| @@ -1195,6 +1329,7 @@ int hidp_get_conninfo(struct hidp_connin |
| return err; |
| } |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) |
| static const struct hid_device_id hidp_table[] = { |
| { HID_BLUETOOTH_DEVICE(HID_ANY_ID, HID_ANY_ID) }, |
| { } |
| @@ -1204,6 +1339,7 @@ static struct hid_driver hidp_driver = { |
| .name = "generic-bluetooth", |
| .id_table = hidp_table, |
| }; |
| +#endif |
| |
| static int __init hidp_init(void) |
| { |
| @@ -1211,11 +1347,14 @@ static int __init hidp_init(void) |
| |
| BT_INFO("HIDP (Human Interface Emulation) ver %s", VERSION); |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) |
| ret = hid_register_driver(&hidp_driver); |
| if (ret) |
| goto err; |
| +#endif |
| |
| ret = hidp_init_sockets(); |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) |
| if (ret) |
| goto err_drv; |
| |
| @@ -1223,13 +1362,16 @@ static int __init hidp_init(void) |
| err_drv: |
| hid_unregister_driver(&hidp_driver); |
| err: |
| +#endif |
| return ret; |
| } |
| |
| static void __exit hidp_exit(void) |
| { |
| hidp_cleanup_sockets(); |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) |
| hid_unregister_driver(&hidp_driver); |
| +#endif |
| } |
| |
| module_init(hidp_init); |
| --- a/net/bluetooth/rfcomm/sock.c |
| +++ b/net/bluetooth/rfcomm/sock.c |
| @@ -325,8 +325,13 @@ static struct sock *rfcomm_sock_alloc(st |
| return sk; |
| } |
| |
| +#if defined(CONFIG_COMPAT_BT_SOCK_CREATE_NEEDS_KERN) |
| static int rfcomm_sock_create(struct net *net, struct socket *sock, |
| int protocol, int kern) |
| +#else |
| +static int rfcomm_sock_create(struct net *net, struct socket *sock, |
| + int protocol) |
| +#endif |
| { |
| struct sock *sk; |
| |
| @@ -680,7 +685,11 @@ static int rfcomm_sock_setsockopt_old(st |
| return err; |
| } |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,31)) |
| static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen) |
| +#else |
| +static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen) |
| +#endif |
| { |
| struct sock *sk = sock->sk; |
| struct bt_security sec; |
| --- a/net/bluetooth/rfcomm/tty.c |
| +++ b/net/bluetooth/rfcomm/tty.c |
| @@ -731,8 +731,12 @@ static int rfcomm_tty_open(struct tty_st |
| remove_wait_queue(&dev->wait, &wait); |
| |
| if (err == 0) |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,29)) |
| device_move(dev->tty_dev, rfcomm_get_device(dev), |
| DPM_ORDER_DEV_AFTER_PARENT); |
| +#else |
| + device_move(dev->tty_dev, rfcomm_get_device(dev)); |
| +#endif |
| |
| rfcomm_tty_copy_pending(dev); |
| |
| @@ -752,7 +756,11 @@ static void rfcomm_tty_close(struct tty_ |
| |
| if (atomic_dec_and_test(&dev->opened)) { |
| if (dev->tty_dev->parent) |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,29)) |
| device_move(dev->tty_dev, NULL, DPM_ORDER_DEV_LAST); |
| +#else |
| + device_move(dev->tty_dev, NULL); |
| +#endif |
| |
| /* Close DLC and dettach TTY */ |
| rfcomm_dlc_close(dev->dlc, 0); |
| @@ -828,7 +836,11 @@ static int rfcomm_tty_write_room(struct |
| return room; |
| } |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38)) |
| static int rfcomm_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) |
| +#else |
| +static int rfcomm_tty_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd, unsigned long arg) |
| +#endif |
| { |
| BT_DBG("tty %p cmd 0x%02x", tty, cmd); |
| |
| @@ -1087,7 +1099,11 @@ static void rfcomm_tty_hangup(struct tty |
| } |
| } |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38)) |
| static int rfcomm_tty_tiocmget(struct tty_struct *tty) |
| +#else |
| +static int rfcomm_tty_tiocmget(struct tty_struct *tty, struct file *filp) |
| +#endif |
| { |
| struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data; |
| |
| @@ -1096,7 +1112,11 @@ static int rfcomm_tty_tiocmget(struct tt |
| return dev->modem_status; |
| } |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38)) |
| static int rfcomm_tty_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear) |
| +#else |
| +static int rfcomm_tty_tiocmset(struct tty_struct *tty, struct file *filp, unsigned int set, unsigned int clear) |
| +#endif |
| { |
| struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data; |
| struct rfcomm_dlc *dlc = dev->dlc; |
| --- a/net/bluetooth/sco.c |
| +++ b/net/bluetooth/sco.c |
| @@ -441,8 +441,12 @@ static struct sock *sco_sock_alloc(struc |
| return sk; |
| } |
| |
| +#if defined(CONFIG_COMPAT_BT_SOCK_CREATE_NEEDS_KERN) |
| static int sco_sock_create(struct net *net, struct socket *sock, int protocol, |
| int kern) |
| +#else |
| +static int sco_sock_create(struct net *net, struct socket *sock, int protocol) |
| +#endif |
| { |
| struct sock *sk; |
| |
| @@ -658,7 +662,11 @@ static int sco_sock_sendmsg(struct kiocb |
| return err; |
| } |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,31)) |
| static int sco_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen) |
| +#else |
| +static int sco_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen) |
| +#endif |
| { |
| struct sock *sk = sock->sk; |
| int err = 0; |
| --- a/net/bluetooth/bnep/sock.c |
| +++ b/net/bluetooth/bnep/sock.c |
| @@ -196,8 +196,12 @@ static struct proto bnep_proto = { |
| .obj_size = sizeof(struct bt_sock) |
| }; |
| |
| +#if defined(CONFIG_COMPAT_BT_SOCK_CREATE_NEEDS_KERN) |
| static int bnep_sock_create(struct net *net, struct socket *sock, int protocol, |
| int kern) |
| +#else |
| +static int bnep_sock_create(struct net *net, struct socket *sock, int protocol) |
| +#endif |
| { |
| struct sock *sk; |
| |
| --- a/net/bluetooth/cmtp/sock.c |
| +++ b/net/bluetooth/cmtp/sock.c |
| @@ -190,8 +190,12 @@ static struct proto cmtp_proto = { |
| .obj_size = sizeof(struct bt_sock) |
| }; |
| |
| +#if defined(CONFIG_COMPAT_BT_SOCK_CREATE_NEEDS_KERN) |
| static int cmtp_sock_create(struct net *net, struct socket *sock, int protocol, |
| int kern) |
| +#else |
| +static int cmtp_sock_create(struct net *net, struct socket *sock, int protocol) |
| +#endif |
| { |
| struct sock *sk; |
| |
| --- a/net/bluetooth/hidp/sock.c |
| +++ b/net/bluetooth/hidp/sock.c |
| @@ -242,8 +242,12 @@ static struct proto hidp_proto = { |
| .obj_size = sizeof(struct bt_sock) |
| }; |
| |
| +#if defined(CONFIG_COMPAT_BT_SOCK_CREATE_NEEDS_KERN) |
| static int hidp_sock_create(struct net *net, struct socket *sock, int protocol, |
| int kern) |
| +#else |
| +static int hidp_sock_create(struct net *net, struct socket *sock, int protocol) |
| +#endif |
| { |
| struct sock *sk; |
| |
| --- a/net/bluetooth/l2cap_sock.c |
| +++ b/net/bluetooth/l2cap_sock.c |
| @@ -582,7 +582,14 @@ static int l2cap_sock_setsockopt_old(str |
| return err; |
| } |
| |
| + |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,31)) |
| static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen) |
| +#else |
| +static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen) |
| +#endif |
| + |
| + |
| { |
| struct sock *sk = sock->sk; |
| struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
| @@ -1062,8 +1069,12 @@ static struct sock *l2cap_sock_alloc(str |
| return sk; |
| } |
| |
| +#if defined(CONFIG_COMPAT_BT_SOCK_CREATE_NEEDS_KERN) |
| static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol, |
| int kern) |
| +#else |
| +static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol) |
| +#endif |
| { |
| struct sock *sk; |
| |
| @@ -1075,7 +1086,11 @@ static int l2cap_sock_create(struct net |
| sock->type != SOCK_DGRAM && sock->type != SOCK_RAW) |
| return -ESOCKTNOSUPPORT; |
| |
| +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,32)) |
| if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW)) |
| +#else |
| + if (sock->type == SOCK_RAW && !capable(CAP_NET_RAW)) |
| +#endif |
| return -EPERM; |
| |
| sock->ops = &l2cap_sock_ops; |