24 May, 2017

2 commits

  • This patch fixes the kernel oops when release net_device reference in
    advance. In function raw_sendmsg(i think the dgram_sendmsg has the same
    problem), there is a race condition between dev_put and dev_queue_xmit
    when the device is gong that maybe lead to dev_queue_ximt to see
    an illegal net_device pointer.

    My test kernel is 3.13.0-32 and because i am not have a real 802154
    device, so i change lowpan_newlink function to this:

    /* find and hold real wpan device */
    real_dev = dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK]));
    if (!real_dev)
    return -ENODEV;
    // if (real_dev->type != ARPHRD_IEEE802154) {
    // dev_put(real_dev);
    // return -EINVAL;
    // }
    lowpan_dev_info(dev)->real_dev = real_dev;
    lowpan_dev_info(dev)->fragment_tag = 0;
    mutex_init(&lowpan_dev_info(dev)->dev_list_mtx);

    Also, in order to simulate preempt, i change the raw_sendmsg function
    to this:

    skb->dev = dev;
    skb->sk = sk;
    skb->protocol = htons(ETH_P_IEEE802154);
    dev_put(dev);
    //simulate preempt
    schedule_timeout_uninterruptible(30 * HZ);
    err = dev_queue_xmit(skb);
    if (err > 0)
    err = net_xmit_errno(err);

    and this is my userspace test code named test_send_data:

    int main(int argc, char **argv)
    {
    char buf[127];
    int sockfd;
    sockfd = socket(AF_IEEE802154, SOCK_RAW, 0);
    if (sockfd < 0) {
    printf("create sockfd error: %s\n", strerror(errno));
    return -1;
    }
    send(sockfd, buf, sizeof(buf), 0);
    return 0;
    }

    This is my test case:

    root@zhanglin-x-computer:~/develop/802154# uname -a
    Linux zhanglin-x-computer 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15
    03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
    root@zhanglin-x-computer:~/develop/802154# ip link add link eth0 name
    lowpan0 type lowpan
    root@zhanglin-x-computer:~/develop/802154#
    //keep the lowpan0 device down
    root@zhanglin-x-computer:~/develop/802154# ./test_send_data &
    //wait a while
    root@zhanglin-x-computer:~/develop/802154# ip link del link dev lowpan0
    //the device is gone
    //oops
    [381.303307] general protection fault: 0000 [#1]SMP
    [381.303407] Modules linked in: af_802154 6lowpan bnep rfcomm
    bluetooth nls_iso8859_1 snd_hda_codec_hdmi snd_hda_codec_realtek
    rts5139(C) snd_hda_intel
    snd_had_codec snd_hwdep snd_pcm snd_page_alloc snd_seq_midi
    snd_seq_midi_event snd_rawmidi snd_req intel_rapl snd_seq_device
    coretemp i915 kvm_intel
    kvm snd_timer snd crct10dif_pclmul crc32_pclmul ghash_clmulni_intel
    cypted drm_kms_helper drm i2c_algo_bit soundcore video mac_hid
    parport_pc ppdev ip parport hid_generic
    usbhid hid ahci r8169 mii libahdi
    [381.304286] CPU:1 PID: 2524 Commm: 1 Tainted: G C 0 3.13.0-32-generic
    [381.304409] Hardware name: Haier Haier DT Computer/Haier DT Codputer,
    BIOS FIBT19H02_X64 06/09/2014
    [381.304546] tasks: ffff000096965fc0 ti: ffffB0013779c000 task.ti:
    ffffB8013779c000
    [381.304659] RIP: 0010:[] []
    __dev_queue_ximt+0x61/0x500
    [381.304798] RSP: 0018:ffffB8013779dca0 EFLAGS: 00010202
    [381.304880] RAX: 272b031d57565351 RBX: 0000000000000000 RCX: ffff8800968f1a00
    [381.304987] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff8800968f1a00
    [381.305095] RBP: ffff8e013773dce0 R08: 0000000000000266 R09: 0000000000000004
    [381.305202] R10: 0000000000000004 R11: 0000000000000005 R12: ffff88013902e000
    [381.305310] R13: 000000000000007f R14: 000000000000007f R15: ffff8800968f1a00
    [381.305418] FS: 00007fc57f50f740(0000) GS: ffff88013fc80000(0000)
    knlGS: 0000000000000000
    [381.305540] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    [381.305627] CR2: 00007fad0841c000 CR3: 00000001368dd000 CR4: 00000000001007e0
    [361.905734] Stack:
    [381.305768] 00000000002052d0 000000003facb30a ffff88013779dcc0
    ffff880137764000
    [381.305898] ffff88013779de70 000000000000007f 000000000000007f
    ffff88013902e000
    [381.306026] ffff88013779dcf0 ffffffff81622490 ffff88013779dd39
    ffffffffa03af9f1
    [381.306155] Call Trace:
    [381.306202] [] dev_queue_xmit+0x10/0x20
    [381.306294] [] raw_sendmsg+0x1b1/0x270 [af_802154]
    [381.306396] [] ieee802154_sock_sendmsg+0x14/0x20 [af_802154]
    [381.306512] [] sock_sendmsg+0x8b/0xc0
    [381.306600] [] ? __d_alloc+0x25/0x180
    [381.306687] [] ? kmem_cache_alloc_trace+0x1c6/0x1f0
    [381.306791] [] SYSC_sendto+0x121/0x1c0
    [381.306878] [] ? vtime_account_user+x54/0x60
    [381.306975] [] ? syscall_trace_enter+0x145/0x250
    [381.307073] [] SyS_sendto+0xe/0x10
    [381.307156] [] tracesys+0xe1/0xe6
    [381.307233] Code: c6 a1 a4 ff 41 8b 57 78 49 8b 47 20 85 d2 48 8b 80
    78 07 00 00 75 21 49 8b 57 18 48 85 d2 74 18 48 85 c0 74 13 8b 92 ac
    01 00 00 50 10 73 08 8b 44 90 14 41 89 47 78 41 f6 84 24 d5 00 00
    00
    [381.307801] RIP [] _dev_queue_xmit+0x61/0x500
    [381.307901] RSP
    [381.347512] Kernel panic - not syncing: Fatal exception in interrupt
    [381.347747] drm_kms_helper: panic occurred, switching back to text console

    In my opinion, there is always exist a chance that the device is gong
    before call dev_queue_xmit.

    I think the latest kernel is have the same problem and that
    dev_put should be behind of the dev_queue_xmit.

    Signed-off-by: Lin Zhang
    Acked-by: Stefan Schmidt
    Signed-off-by: Marcel Holtmann

    Lin Zhang
     
  • Explicit set skb->sk is needless, sock_alloc_send_skb is already set it.

    Signed-off-by: Lin Zhang
    Acked-by: Stefan Schmidt
    Signed-off-by: Marcel Holtmann

    Lin Zhang
     

28 Feb, 2017

1 commit

  • Now that %z is standartised in C99 there is no reason to support %Z.
    Unlike %L it doesn't even make format strings smaller.

    Use BUILD_BUG_ON in a couple ATM drivers.

    In case anyone didn't notice lib/vsprintf.o is about half of SLUB which
    is in my opinion is quite an achievement. Hopefully this patch inspires
    someone else to trim vsprintf.c more.

    Link: http://lkml.kernel.org/r/20170103230126.GA30170@avx2
    Signed-off-by: Alexey Dobriyan
    Cc: Andy Shevchenko
    Cc: Rasmus Villemoes
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alexey Dobriyan
     

11 Feb, 2016

1 commit

  • In order to support fast reuseport lookups in TCP, the hash function
    defined in struct proto must be capable of returning an error code.
    This patch changes the function signature of all related hash functions
    to return an integer and handles or propagates this return value at
    all call sites.

    Signed-off-by: Craig Gallek
    Signed-off-by: David S. Miller

    Craig Gallek
     

30 Sep, 2015

1 commit

  • This patch changes the mtu size of 802.15.4 interfaces. The current
    setting is the meaning of the maximum transport unit with mac header,
    which is 127 bytes according 802.15.4. The linux meaning of the mtu size
    field is the maximum payload of a mac frame. Like in ethernet, which is
    1500 bytes.

    We have dynamic length of mac frames in 802.15.4, this is why we assume
    the minimum header length which is hard_header_len. This contains fc and
    sequence fields. These can evaluated by driver layer without additional
    checks. We currently don't support to set the FCS from userspace, so we
    need to subtract this from mtu size as well.

    Signed-off-by: Alexander Aring
    Signed-off-by: Marcel Holtmann

    Alexander Aring
     

22 Sep, 2015

1 commit

  • The current header_ops callback structure of net device are used mostly
    from 802.15.4 upper-layers. Because this callback structure is a very
    generic one, which is also used by e.g. DGRAM AF_PACKET sockets, we
    can't make this callback structure 802.15.4 specific which is currently
    is.

    I saw the smallest "constraint" for calling this callback with
    dev_hard_header/dev_parse_header by AF_PACKET which assign a 8 byte
    array for address void pointers. Currently 802.15.4 specific protocols
    like af802154 and 6LoWPAN will assign the "struct ieee802154_addr" as
    these parameters which is greater than 8 bytes. The current callback
    implementation for header_ops.create assumes always a complete
    "struct ieee802154_addr" which AF_PACKET can't never handled and is
    greater than 8 bytes.

    For that reason we introduce now a "generic" create/parse header_ops
    callback which allows handling with intra-pan extended addresses only.
    This allows a small use-case with AF_PACKET to send "somehow" a valid
    dataframe over DGRAM.

    To keeping the current dev_hard_header behaviour we introduce a similar
    callback structure "wpan_dev_header_ops" which contains 802.15.4 specific
    upper-layer header creation functionality, which can be called by
    wpan_dev_hard_header.

    Signed-off-by: Alexander Aring
    Signed-off-by: Marcel Holtmann

    Alexander Aring
     

04 Jun, 2015

1 commit

  • The AF_IEEE802154 sockaddr looks like this:

    struct sockaddr_ieee802154 {
    sa_family_t family; /* AF_IEEE802154 */
    struct ieee802154_addr_sa addr;
    };

    struct ieee802154_addr_sa {
    int addr_type;
    u16 pan_id;
    union {
    u8 hwaddr[IEEE802154_ADDR_LEN];
    u16 short_addr;
    };
    };

    On most architectures there will be implicit structure padding here,
    in two different places:

    * In struct sockaddr_ieee802154, two bytes of padding between 'family'
    (unsigned short) and 'addr', so that 'addr' starts on a four byte
    boundary.

    * In struct ieee802154_addr_sa, two bytes at the end of the structure,
    to make the structure 16 bytes.

    When calling recvmsg(2) on a PF_IEEE802154 SOCK_DGRAM socket, the
    ieee802154 stack constructs a struct sockaddr_ieee802154 on the
    kernel stack without clearing these padding fields, and, depending
    on the addr_type, between four and ten bytes of uncleared kernel
    stack will be copied to userspace.

    We can't just insert two 'u16 __pad's in the right places and zero
    those before copying an address to userspace, as not all architectures
    insert this implicit padding -- from a quick test it seems that avr32,
    cris and m68k don't insert this padding, while every other architecture
    that I have cross compilers for does insert this padding.

    The easiest way to plug the leak is to just memset the whole struct
    sockaddr_ieee802154 before filling in the fields we want to fill in,
    and that's what this patch does.

    Cc: stable@vger.kernel.org
    Signed-off-by: Lennert Buytenhek
    Acked-by: Alexander Aring
    Signed-off-by: Marcel Holtmann

    Lennert Buytenhek
     

27 May, 2015

2 commits


23 May, 2015

1 commit

  • This patch removes the mib lock. The new locking mechanism is to protect
    the mib values with the rtnl lock. Note that this isn't always necessary
    if we have an interface up the most mib values are readonly (e.g.
    address settings). With this behaviour we can remove locking in
    hotpath like frame parsing completely. It depends on context if we need
    to hold the rtnl lock or not, this makes the callbacks of
    ieee802154_mlme_ops unnecessary because these callbacks hols always the
    locks.

    Signed-off-by: Alexander Aring
    Reviewed-by: Stefan Schmidt
    Signed-off-by: Marcel Holtmann

    Alexander Aring
     

11 May, 2015

1 commit


03 Mar, 2015

1 commit

  • After TIPC doesn't depend on iocb argument in its internal
    implementations of sendmsg() and recvmsg() hooks defined in proto
    structure, no any user is using iocb argument in them at all now.
    Then we can drop the redundant iocb argument completely from kinds of
    implementations of both sendmsg() and recvmsg() in the entire
    networking stack.

    Cc: Christoph Hellwig
    Suggested-by: Al Viro
    Signed-off-by: Ying Xue
    Signed-off-by: David S. Miller

    Ying Xue
     

03 Jan, 2015

1 commit