findipifc()

findipifc()

概要

  • /sys/src/9/ip/ipifc.c?にて定義
  • 指定したリモートアドレスに対応するifcを検索する

引数

実装

 1134: /*
 1135:  *  find the ifc on same net as the remote system.  If none,
 1136:  *  return nil.
 1137:  */
 1138: Ipifc*
 1139: findipifc(Fs *f, uchar *remote, int type)
 1140: {
 1141:         Ipifc *ifc, *x;
 1142:         Iplifc *lifc;
 1143:         Conv **cp, **e;
 1144:         uchar gnet[IPaddrlen];
 1145:         uchar xmask[IPaddrlen];
 1146: 
 1147:         x = nil; memset(xmask, 0, IPaddrlen);
 1148: 
 1149:         /* find most specific match */
 1150:         e = &f->ipifc->conv[f->ipifc->nc];
 1151:         for(cp = f->ipifc->conv; cp < e; cp++){
 1152:                 if(*cp == 0)
 1153:                         continue;
 1154: 
 1155:                 ifc = (Ipifc*)(*cp)->ptcl;
 1156: 
 1157:                 for(lifc = ifc->lifc; lifc; lifc = lifc->next){
  • すべてのifcを順に調べる.
 1158:                         maskip(remote, lifc->mask, gnet);
 1159:                         if(ipcmp(gnet, lifc->net) == 0){
 1160:                                 if(x == nil || ipcmp(lifc->mask, xmask) > 0){
  • 複数のifgに一致した場合は,アドレスとネットマスクが最長一致した方を選ぶ.
  • 単純にマスクが長い方を選択する実装になっている.
 1161:                                         x = ifc;
 1162:                                         ipmove(xmask, lifc->mask);
  • ifcのネットマスクをxmaskにコピーしておく.
  • 詳細はipmove()にて定義
 1163:                                 }
 1164:                         }
 1165:                 }
 1166:         }
 1167:         if(x != nil)
 1168:                 return x;
  • 該当するifcが存在した場合は,そのifcを返す.
 1169: 
 1170:         /* for now for broadcast and multicast, just use first interface */
 1171:         if(type & (Rbcast|Rmulti)){
 1172:                 for(cp = f->ipifc->conv; cp < e; cp++){
 1173:                         if(*cp == 0)
 1174:                                 continue;
 1175:                         ifc = (Ipifc*)(*cp)->ptcl;
 1176:                         if(ifc->lifc != nil)
 1177:                                 return ifc;
 1178:                 }
 1179:         }
 1180: 
 1181:         return nil;
 1182: }