如何由skb构造sw_flow_key?


    sw_flow_key相当于流表的索引,对其哈希后可以找到对应的flow entry,从而找到action list。构建key是由 ovs_flow_extract函数完成的,它从以太网帧中提携相关信息构造sw_flow_key ,参数中skb->data指向的是以太帧头ether header,in_port是收到skb的端口号,最后俩是值-结果参数。

int ovs_flow_extract(struct sk_buff *skb, u16 in_port, struct sw_flow_key *key, int *key_lenp)
{
     int error = 0;
     int key_len = SW_FLOW_KEY_OFFSET(eth);
     struct ethhdr *eth;
     //key_len 存在的意义是每次填充一个域的时候才增加实际长度(offset+fieldsize);
     memset(key, 0, sizeof(*key));

     key->phy.priority = skb->priority; //QoS相关的;
     if (OVS_CB(skb)->tun_key)  //如果skb->cb 域中有tunnel的信息;
          memcpy(&key->phy.tun.tun_key, OVS_CB(skb)->tun_key, sizeof(key->phy.tun.tun_key));
     key->phy.in_port = in_port;
     key->phy.skb_mark = skb_get_mark(skb);   //这是防火墙(NetFilter)功能专用参数;

     skb_reset_mac_header(skb);
     //解析的同时也更新skb里面的头指针 skb->mac_header = skb->data;
     //链路层,这里要保证至少有14B的ether header;

     eth = eth_hdr(skb); //得到链路层协议头;
     memcpy(key->eth.src, eth->h_source, ETH_ALEN);
     memcpy(key->eth.dst, eth->h_dest, ETH_ALEN);

     __skb_pull(skb, 2 * ETH_ALEN);   
     //向前推进skb->data 接下来的2B是以太类型;

     if (vlan_tx_tag_present(skb))
          key->eth.tci = htons(vlan_get_tci(skb));
     else if (eth->h_proto == htons(ETH_P_8021Q))
          if (unlikely(parse_vlan(skb, key)))
               return -ENOMEM;

     key->eth.type = parse_ethertype(skb);  //从SNAP OUI后的16bit得到以太类型;
     skb_reset_network_header(skb);
     //skb->nh.raw = skb->data;在skb中代表L2,L3,L4的字段mac,nh,h都实现为联合,每个联合中的raw成员用于初始化;
     __skb_push(skb, skb->data - skb_mac_header(skb));
     //和前面的__skb_pull相反,缓存头增加12B的空间(skb->data - skb_mac_header(skb)=12),有啥作用??

     //网络层-->
     if (key->eth.type == htons(ETH_P_IP)) {
          struct iphdr *nh;
          __be16 offset;

          key_len = SW_FLOW_KEY_OFFSET(ipv4.addr);

          error = check_iphdr(skb);//在里面同时会设置 transport header;
          nh = ip_hdr(skb); 
          //得到IP头结构体(struct iphdr *)skb_network_header(skb);iphdr具体细节看A1;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值