embox

Форк
0
/
ip6_input.c 
63 строки · 1.4 Кб
1
/**
2
 * @file
3
 * @brief The Internet Protocol Version 6 (IPV6) module.
4
 *
5
 * @date 16.05.13
6
 * @author Ilia Vaprol
7
 */
8

9
#include <arpa/inet.h>
10
#include <string.h>
11

12
#include <embox/net/proto.h>
13
#include <net/skbuff.h>
14
#include <embox/net/pack.h>
15

16
#include <net/l3/ipv6.h>
17
#include <net/l2/ethernet.h>
18
#include <net/netdevice.h>
19
#include <net/inetdevice.h>
20

21

22
EMBOX_NET_PACK(ETH_P_IPV6, ip6_rcv);
23

24
#include <util/log.h>
25
static int ip6_rcv(struct sk_buff *skb, struct net_device *dev) {
26
	ip6hdr_t *ip6h = ip6_hdr(skb);
27
	const struct net_proto *nproto;
28

29
	if (ip6h->version != 6) {
30
		dev->stats.rx_err++;
31
		skb_free(skb);
32
		return 0; /* error: invalid hdr */
33
	}
34

35
	if (skb->dev->hdr_len + IP6_HEADER_SIZE
36
			+ ntohs(ip6h->payload_len) > skb->len) {
37
		dev->stats.rx_length_errors++;
38
		skb_free(skb);
39
		return 0; /* error: invalid length */
40
	}
41

42
	/* Check recipiant */
43
	assert(skb->dev != NULL);
44
	assert(inetdev_get_by_dev(skb->dev) != NULL);
45
	if (0 != memcmp(&inetdev_get_by_dev(skb->dev)->ifa6_address,
46
				&skb->nh.ip6h->daddr, sizeof(struct in6_addr))) {
47
//		skb_free(skb);
48
//		return 0; /* error: not for us */
49
	}
50

51
	/* Setup transport layer header */
52
	skb->h.raw = skb->nh.raw + IP6_HEADER_SIZE;
53

54
	nproto = net_proto_lookup(ETH_P_IPV6, ip6h->nexthdr);
55
	if (nproto != NULL) {
56
		return nproto->handle(skb);
57
	}
58

59
	log_debug("ipv6 packet accepted, %#x\n", ip6h->nexthdr);
60

61
	skb_free(skb);
62
	return 0; /* error: nobody wants this packet */
63
}
64

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.