// backend/vxlan/vxlan.go

func (be *VXLANBackend) RegisterNetwork(ctx context.Context, network string, config *subnet.Config) (backend.Network, error)

  • 创建cfg变量,它的结构体中包含VIN int, Port int, GBP bool三个字段,其中VNI设置为默认的defaultVNI = 1,并且调用json.Unmarshal(config.Backend, &cfg)解析
  • 创建变量devAttrs := vxlanDeviceAttrs{

    vni:      uint32(cfg.VNI),

    name:      fmt.Sprintf("flannel.%v", cfg.VNI),

    vtepIndex:   be.extIface.Iface.Index,

    vtepAddr:   be.extIface.IfaceAddr,

    vtepPort:    cfg.Port,

    gbp:       cfg.GBP,

  }

  • 调用dev, err := newVXLANDevice(&devAttrs) ---> 调用netlink库添加vlan设备,并且可以处理设备已经存在的情况
  • 调用subnetAttrs, err := newSubnetAttrs(be.extIface.ExtAddr, dev.MACAddr())
  • 调用lease, err := be.subnetMgr.AcquireLease(ctx, network, subnetAttrs)
  • 创建vxlanNet := ip.IP4Net{

    IP:      lease.Subnet.IP,

    PrefixLen:   config.Network.PrefixLen,

  }

  • 调用err = dev.Configure(vxlanNet)
  • 最后return newNetwork(network, be.subnetMgr, be.extIface, dev, vxlanNet, lease)

// backend/vxlan/vxlan.go

func newSubnetAttrs(publicIP net.IP, mac net.HardwareAddr)

  • 首先调用data, err := json.Marshal(&vxlanLeaseAttrs{hardwarAddr(mac)})
  • 接着调用return &subnet.LeaseAttrs{

    PublicIP:    ip.FromIP(publicIP),

    BackendType:  "vxlan",

    BackendData:  json.RawMessage(data),

  }

// backend/vxlan/device.go

func (dev *vxlanDevice)  Configure(ipn ip.IP4Net) error

  • 调用setAddr4(dev.link, ipn.ToIPNet())
  • 调用netlink.LinkSetUp(dev.link)启动VTEP
  • 最后添加一条路由 route := netlink.Route{

    LinkIndex:    dev.link.Attrs().Index,

    Scope:      netlink.SCOPE_UNIVERSE,

    Dst:        ipn.Network().ToIPNet(),

  },再调用netlink.RouteAdd(&route)

// backend/vxlan/network.go

func newNetwork(name string, subnetMgr subnet.Manager, extIface *backend.ExternalInterface, dev *vxlanDevice, _ ip.IP4Net, lease *subnet.Lease) (*network, error)

该函数仅仅用参数填充network数据结构:

nw := &network {

  SimpleNetwork:  backend.SimpleNetwork{

    SubnetLease:  lease,

    ExtIface:     extIface,

  },

  name:     name,

  subnetMgr:    subnetMgr,

  dev:      dev,

}

network数据结构如下所示:

type network struct {
  backend.SimpleNetwork
  name    string
  extIface   *backend.ExternalInterface
  dev     *vxlanDevice
  routes    routes
  subnetMgr  subnet.Manager
}

  

// backend/vxlan/network.go

func (nw *network) Run(ctx context.Context)

  • 创建misses := make(chan *netlink.Neigh, 100)并调用go nw.dev.MonitorMisses(misses)
  • 创建events := make(chan []subnet.Event)并调用go subnet.WatchLeases(ctx, nw.subnetMgr, nw.name, nw.SubnetLease, events)
  • 调用select,如果事件类型为initialEventsBatch,调用nw.handleInitialSubnetEvents(initialEventsBatch)直到成功为止
  • 一个无限的for循环,当misses有事件发生时,调用nw.handleMiss(miss),events有事件发生时,调用nw.handleSubnetEvents(evtBatch)

flannel源码分析---backend为vxlan的更多相关文章

  1. flannel源码分析---初始化部分

    // main.go 1.func main() ..... 首先调用sm, err := newSubnetManager()创建subnet manager .... 调用ctx, cancel ...

  2. gRPC源码分析0-导读

    gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...

  3. 《深入理解Spark:核心思想与源码分析》——SparkContext的初始化(叔篇)——TaskScheduler的启动

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  4. 安卓MonkeyRunner源码分析之启动

    在工作中因为要追求完成目标的效率,所以更多是强调实战,注重招式,关注怎么去用各种框架来实现目的.但是如果一味只是注重招式,缺少对原理这个内功的了解,相信自己很难对各种框架有更深入的理解. 从几个月前开 ...

  5. Spark Scheduler模块源码分析之TaskScheduler和SchedulerBackend

    本文是Scheduler模块源码分析的第二篇,第一篇Spark Scheduler模块源码分析之DAGScheduler主要分析了DAGScheduler.本文接下来结合Spark-1.6.0的源码继 ...

  6. linux内存源码分析 - SLAB分配器概述【转】

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请 ...

  7. linux内存源码分析 - SLAB分配器概述

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请 ...

  8. linux调度器源码分析 - 运行(四)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 之前的文章已经将调度器的数据结构.初始化.加入进程都进行了分析,这篇文章将主要说明调度器是如何在程序稳定运 ...

  9. 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

随机推荐

  1. c中头文件在cpp文件里引用和.h文件引用的思考

    我们在编敲代码中头文件是常常使用的. 可是头文件是应该包括在.H文件里还是在.cpp文件里.在这个其中有什么样去差别呢. 假如说我们编写了一个a.cpp  .我们将a.cpp文件的变量和函数申明在a. ...

  2. 2.请求库之requests

    requests模块阅读目录: 介绍 基于GET请求 基于POST请求 响应Response 高级用法 一.介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requ ...

  3. vncviewer鼠标不同步问题

    sh-4.1# virsh edit win7 把下面的参数: <input type='mouse' bus='ps2'/> 改成: <input type='tablet' bu ...

  4. spring的数据源

    Spring提供了两个这样的数据源(都位于org.springframework.jdbc.datasource程序包里):        DriverManagerDataSource:在每个连接请 ...

  5. android最佳实践的建议(翻译自android-best-practices)

    Best practices in Android development Use Gradle and its recommended project structure 使用Gradle和其推荐的 ...

  6. 'Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set.

    UserWarning: Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. Defaulting SQLALCHEMY_DATA ...

  7. spring mvc 3.0 实现文件上传功能

    http://club.jledu.gov.cn/?uid-5282-action-viewspace-itemid-188672 —————————————————————————————————— ...

  8. Tensorflow之改变tensor形状

    https://www.tensorflow.org/versions/r0.12/api_docs/python/array_ops.html#reshape 例子: # tensor 't' is ...

  9. Openstack(Kilo)安装系列之glance(六)

    安装配置 Before you install and configure the Image service, you must create a database, service credent ...

  10. Linux的文件权限(简单易懂)

    学习这个章节,必须明白以下三个概念: 1.所有者 2.所属组 3.其他人 明白这三个概念后,接下来就学习文件的属性,那么文件的属性有什么呢?如何查看文件的属性? 在命令行下,执行 ls -l 可以得到 ...