embox
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
22EMBOX_NET_PACK(ETH_P_IPV6, ip6_rcv);23
24#include <util/log.h>25static int ip6_rcv(struct sk_buff *skb, struct net_device *dev) {26ip6hdr_t *ip6h = ip6_hdr(skb);27const struct net_proto *nproto;28
29if (ip6h->version != 6) {30dev->stats.rx_err++;31skb_free(skb);32return 0; /* error: invalid hdr */33}34
35if (skb->dev->hdr_len + IP6_HEADER_SIZE36+ ntohs(ip6h->payload_len) > skb->len) {37dev->stats.rx_length_errors++;38skb_free(skb);39return 0; /* error: invalid length */40}41
42/* Check recipiant */43assert(skb->dev != NULL);44assert(inetdev_get_by_dev(skb->dev) != NULL);45if (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 */52skb->h.raw = skb->nh.raw + IP6_HEADER_SIZE;53
54nproto = net_proto_lookup(ETH_P_IPV6, ip6h->nexthdr);55if (nproto != NULL) {56return nproto->handle(skb);57}58
59log_debug("ipv6 packet accepted, %#x\n", ip6h->nexthdr);60
61skb_free(skb);62return 0; /* error: nobody wants this packet */63}
64