diff options
Diffstat (limited to 'net/phonet/af_phonet.c')
-rw-r--r-- | net/phonet/af_phonet.c | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c index 13cb323f8c38..a662e62a99cf 100644 --- a/net/phonet/af_phonet.c +++ b/net/phonet/af_phonet.c | |||
@@ -275,8 +275,6 @@ static inline int can_respond(struct sk_buff *skb) | |||
275 | return 0; | 275 | return 0; |
276 | 276 | ||
277 | ph = pn_hdr(skb); | 277 | ph = pn_hdr(skb); |
278 | if (phonet_address_get(skb->dev, ph->pn_rdev) != ph->pn_rdev) | ||
279 | return 0; /* we are not the destination */ | ||
280 | if (ph->pn_res == PN_PREFIX && !pskb_may_pull(skb, 5)) | 278 | if (ph->pn_res == PN_PREFIX && !pskb_may_pull(skb, 5)) |
281 | return 0; | 279 | return 0; |
282 | if (ph->pn_res == PN_COMMGR) /* indications */ | 280 | if (ph->pn_res == PN_COMMGR) /* indications */ |
@@ -344,8 +342,8 @@ static int phonet_rcv(struct sk_buff *skb, struct net_device *dev, | |||
344 | struct packet_type *pkttype, | 342 | struct packet_type *pkttype, |
345 | struct net_device *orig_dev) | 343 | struct net_device *orig_dev) |
346 | { | 344 | { |
345 | struct net *net = dev_net(dev); | ||
347 | struct phonethdr *ph; | 346 | struct phonethdr *ph; |
348 | struct sock *sk; | ||
349 | struct sockaddr_pn sa; | 347 | struct sockaddr_pn sa; |
350 | u16 len; | 348 | u16 len; |
351 | 349 | ||
@@ -364,29 +362,28 @@ static int phonet_rcv(struct sk_buff *skb, struct net_device *dev, | |||
364 | skb_reset_transport_header(skb); | 362 | skb_reset_transport_header(skb); |
365 | 363 | ||
366 | pn_skb_get_dst_sockaddr(skb, &sa); | 364 | pn_skb_get_dst_sockaddr(skb, &sa); |
367 | if (pn_sockaddr_get_addr(&sa) == 0) | ||
368 | goto out; /* currently, we cannot be device 0 */ | ||
369 | 365 | ||
370 | sk = pn_find_sock_by_sa(dev_net(dev), &sa); | 366 | /* check if we are the destination */ |
371 | if (sk == NULL) { | 367 | if (phonet_address_lookup(net, pn_sockaddr_get_addr(&sa)) == 0) { |
368 | /* Phonet packet input */ | ||
369 | struct sock *sk = pn_find_sock_by_sa(net, &sa); | ||
370 | |||
371 | if (sk) | ||
372 | return sk_receive_skb(sk, skb, 0); | ||
373 | |||
372 | if (can_respond(skb)) { | 374 | if (can_respond(skb)) { |
373 | send_obj_unreachable(skb); | 375 | send_obj_unreachable(skb); |
374 | send_reset_indications(skb); | 376 | send_reset_indications(skb); |
375 | } | 377 | } |
376 | goto out; | ||
377 | } | 378 | } |
378 | 379 | ||
379 | /* Push data to the socket (or other sockets connected to it). */ | ||
380 | return sk_receive_skb(sk, skb, 0); | ||
381 | |||
382 | out: | 380 | out: |
383 | kfree_skb(skb); | 381 | kfree_skb(skb); |
384 | return NET_RX_DROP; | 382 | return NET_RX_DROP; |
385 | } | 383 | } |
386 | 384 | ||
387 | static struct packet_type phonet_packet_type = { | 385 | static struct packet_type phonet_packet_type __read_mostly = { |
388 | .type = __constant_htons(ETH_P_PHONET), | 386 | .type = cpu_to_be16(ETH_P_PHONET), |
389 | .dev = NULL, | ||
390 | .func = phonet_rcv, | 387 | .func = phonet_rcv, |
391 | }; | 388 | }; |
392 | 389 | ||
@@ -428,16 +425,18 @@ static int __init phonet_init(void) | |||
428 | { | 425 | { |
429 | int err; | 426 | int err; |
430 | 427 | ||
428 | err = phonet_device_init(); | ||
429 | if (err) | ||
430 | return err; | ||
431 | |||
431 | err = sock_register(&phonet_proto_family); | 432 | err = sock_register(&phonet_proto_family); |
432 | if (err) { | 433 | if (err) { |
433 | printk(KERN_ALERT | 434 | printk(KERN_ALERT |
434 | "phonet protocol family initialization failed\n"); | 435 | "phonet protocol family initialization failed\n"); |
435 | return err; | 436 | goto err_sock; |
436 | } | 437 | } |
437 | 438 | ||
438 | phonet_device_init(); | ||
439 | dev_add_pack(&phonet_packet_type); | 439 | dev_add_pack(&phonet_packet_type); |
440 | phonet_netlink_register(); | ||
441 | phonet_sysctl_init(); | 440 | phonet_sysctl_init(); |
442 | 441 | ||
443 | err = isi_register(); | 442 | err = isi_register(); |
@@ -449,6 +448,7 @@ err: | |||
449 | phonet_sysctl_exit(); | 448 | phonet_sysctl_exit(); |
450 | sock_unregister(PF_PHONET); | 449 | sock_unregister(PF_PHONET); |
451 | dev_remove_pack(&phonet_packet_type); | 450 | dev_remove_pack(&phonet_packet_type); |
451 | err_sock: | ||
452 | phonet_device_exit(); | 452 | phonet_device_exit(); |
453 | return err; | 453 | return err; |
454 | } | 454 | } |